通过 Django 发送邮件时 Gmail 的图片链接损坏
Posted
技术标签:
【中文标题】通过 Django 发送邮件时 Gmail 的图片链接损坏【英文标题】:Gmail's broken image links when sending mails through Django 【发布时间】:2021-04-29 00:25:22 【问题描述】:我在 Django 中使用 SMTP 协议发送电子邮件。当我发送图片链接时是这样的:
https://example.com/images/pic1.jpg
但 Gmail 会将其转换为以下内容:
https://ci5.googleusercontent.com/proxy/vI79kajdUGm6Wk-fjyicDLjZbCB1w9NfkoZ-zQFOB2OpJ1ILmSvfvHmE56r72us5mIuIXCFiO3V8rgkZOjfhghTH0R07BbcQy5g=s0-d-e1-ft#https://example.com/images/pic1.jpg
我尝试了图片 URL 代理白名单设置。它正在显示图像的预览。但是图像链接不起作用。
PS:我也试过here建议的方法,没有用。
更新 1: 图像存储在 AWS s3 存储桶中。如果我将它们公开,那么它们就可以正常工作。但是我不能公开。还有其他方法吗?
【问题讨论】:
您可以在 AWS S3 中设置 cors 标头。另外请提供更多代码。 【参考方案1】:图像存储在 AWS s3 存储桶中。如果我将它们公开,那么它们就可以正常工作。但是我不能公开。还有其他方法吗?
如果您想继续通过 URL 引用图像,那么简短的回答是“不”,因为 GMail 的图像代理需要以一种或另一种方式通过“公共”互联网访问您的图像。
这个问题有点离题,因为它与 Django 关系不大,但如果您将 GMail 用于业务you can configure which URLs should not go through the proxy。这应该允许您防止从您的“私有”S3 存储桶 URL 提供的图像被代理。请注意,这仅适用于您的业务域中的 GMail 帐户;例如,如果将电子邮件发送到非企业或不同的企业 Gmail 帐户,图像将被代理并且无法加载。
另一种方法可以避免完全代理它以将图像附加到电子邮件中,而不是通过 URL 引用它。你可以参考这个答案来了解如何实现https://***.com/a/3787766/70191。
【讨论】:
感谢您的回复,西蒙。我已经尝试过代理白名单方法。它向我展示了我的谷歌工作区帐户中的图像预览。但是当我从我的自定义域向 someuser@gmail.com 发送邮件时,我遇到了这个问题。我也尝试了第二种方法,但它看起来不太好,因为图像附加在邮件正文的底部。 我可以执行 CORS 或服务器配置等设置来实现这一目标吗?提前致谢。 > 但是当我从我的自定义域向 someuser@gmail.com 发送邮件时,我遇到了这个问题。是的,这不适用于您自己的域之外的收件人。 > 我也尝试了第二种方法,但由于图像附加在邮件正文的底部,它看起来不太好。如果您按照***.com/questions/19171742/… 中的说明使用src="cid:..."
定义图像,它应该可以工作。否则你可以试试 base base64
images ***.com/questions/3279523/base64-images-to-gmail
第二种方法有效,但是在我添加图片作为附件后邮件大小增加了。我想为图像创建一个参考 URL,而不附加它们。
其他公司的表现如何?在时事通讯中添加用户图像,而不像 LinkedIn 和其他社交网站那样附加它们。以上是关于通过 Django 发送邮件时 Gmail 的图片链接损坏的主要内容,如果未能解决你的问题,请参考以下文章
使用 Redis、Celery 设置 Django 以通过 Gmail 发送电子邮件