部署 网站图片设置防盗链,但邮件需要引用图片

yzhrain · 2013年07月21日 · 最后由 yzhrain 回复于 2013年07月21日 · 3879 次阅读

请教各位一个问题:我想为网站的图片加上防盗链,但是发邮件给客户也会引用网站的图片,防盗链一般通过 referer 来设置,如果加上了,那么邮件里引用的图片就不能显示了,大家怎么解决这个问题的?

放到邮件附件中

#1 楼 @luikore 有些客户端会不显示:http://www.campaignmonitor.com/blog/post/1759/embedding-images-revisited

attachment 是不是只会显示在邮件底部?

#2 楼 @hooopo mail attachment 其实使用 multipart 的方式传输的, 显示在底部是某些客户端的做法, 现在的主流客户端基本都能显示了吧. 其实 part 的顺序是没关系的, 附件可以排到邮件正体的前面.

如你给的链接的回复所说, 如果一个图片对应的那一 part 加了 Content-Location, 那么在邮件中引用那个 Location 的 html 可以直接显示该图片而且不显示成附件 (在 Content-Disposition 里带 filename 就成为附件了)

...
—BoundarykkJ0CDXe4jYnH95C
Content-Type: image/png
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Location: http://example.com/images/logo.png

图片内容
—BoundarykkJ0CDXe4jYnH95C
...

#3 楼 @luikore 用 Gmail 试了一下The MIME Multipart/Related Content-type,是可以的.

MIME-Version: 1.0
Received: by 10.49.25.111 with HTTP; Sun, 21 Jul 2013 06:04:08 -0700 (PDT)
Date: Sun, 21 Jul 2013 21:04:08 +0800
Delivered-To: hoooopo@gmail.com
Message-ID: <CAGs8XeBOY2pp3Pfi8Ov65ESksuF8fWs9RojByvr-yVfAoLj+KA@mail.gmail.com>
Subject: test inline image
From: Hooopo <hoooopo@gmail.com>
To: Hooopo <hoooopo@gmail.com>
Content-Type: multipart/related; boundary=047d7b6dbfa8fa57c904e205315e

--047d7b6dbfa8fa57c904e205315e
Content-Type: multipart/alternative; boundary=047d7b6dbfa8fa57c404e205315d

--047d7b6dbfa8fa57c404e205315d
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

aGVsbG8NCltpbWFnZTog5YaF5bWM5Zu+54mHIDFdDQp3b3JsZA0K
--047d7b6dbfa8fa57c404e205315d
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">hello<div><img src=3D"cid:ii_140015414053f409" alt=3D"=E5=
=86=85=E5=B5=8C=E5=9B=BE=E7=89=87 1"><br></div><div>world</div></div>

--047d7b6dbfa8fa57c404e205315d--
--047d7b6dbfa8fa57c904e205315e
Content-Type: image/png; name="63cd65c79f0d13139c94215a1ea9de51.png"
Content-Transfer-Encoding: base64
Content-ID: <ii_140015414053f409>
X-Attachment-Id: ii_140015414053f409

iVBORw0KGgoAAAANSUhEUgAAAaQAAAGkCAYAAAB+TFE1AAAgAElEQVR42uy9Z3NlR5IlePyqp/AA
pGCSLNHVPS3Gdj+t7f//vmbzdXarp7sURSaZCWRCP3FV+H64KsLd4z5wuqtIthFmSWYCD1eEh3A/
fvw4OVcxwAAIRMDwd+bp793/AaLp78zdv6fPYbwGM/efnf7O/UeIGMwEouHaw9d0r+7n/u9O95+u
E16b/Ev19x2u391zen7/+tP70fhsAPc/n8ak+758VnjvMY3L9Hw0ft4fq+5n8O6JYPyHf/v3Ga7p
f0/biAJbyJ+F74zABsNzT/fSdprsOsyR8F7kGSF8NnltmPf0xyk2FuEcZWPOSVuFYzfYN5xP/oPI
cefI/TFzHzkP9Hta95o+a9nduk44buHcCNdOODeg3k8+Z/w95NjocYvvAfZ88O8ZfkY+G5+wUfic
...

#4 楼 @hooopo 哦用 cid 更好... rack 判断上传文件名的时候各种搞不定了也会用 content-id ...

oh 引出了一个高端的解决方案,其实我的图片是放在 amazon s3 上面,增加防盗链是不希望图片被别人引用了,研究了一下 s3 的权限策略,基本上都是根据 referer 的,考虑到我们的邮件会大量引用网站的图片,如果是根据 referer 的话,此路不通。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册