如何防止Gmail因安全原因移除邮件内嵌图片?
解决Gmail移除邮件内嵌图片的问题
我之前也碰到过一模一样的情况,Gmail的安全机制对内嵌图片的校验确实挺严格的,结合你给出的代码场景,给你几个亲测有效的解决办法:
确保内嵌图片的Content-ID与HTML引用完全匹配
你用到uuid生成唯一ID是个好思路,但要注意细节:- 给
MIMEImage对象设置Content-ID时,必须带上尖括号,比如:img_uuid = uuid.uuid4() content_id = f"<{img_uuid}>" img_part = MIMEImage(open(img_path, 'rb').read()) img_part.add_header('Content-ID', content_id) - 在HTML里引用图片时,要去掉尖括号,用
cid:xxx的格式,比如:<img src="cid:{img_uuid}" alt="Embedded PNG">
Gmail会严格校验这个关联关系,不匹配的话直接判定为不安全资源移除。
- 给
使用正确的MIME多部分类型
普通的multipart/mixed是用于混合附件和正文的,内嵌图片应该用multipart/related类型,它专门用于关联HTML内容和内嵌资源,Gmail对这种格式的兼容性更好。修改你的MIMEMultipart初始化代码:msg = MIMEMultipart('related')然后把HTML文本部分和所有图片部分都attach到这个
related对象里,同时记得给HTML部分指定正确的Content-Type:html_content = "<html><body>这里是你的邮件内容,包含<img src='cid:...'>标签</body></html>" html_part = MIMEText(html_content, 'html', 'utf-8') msg.attach(html_part)提升邮件内容的可信度
Gmail的安全机制会结合内容特征判断是否为可疑邮件:- 给每张图片添加合理的
alt文本,不要留空,这不仅符合可访问性规范,也能让邮件看起来更正规。 - 避免邮件主题和正文出现垃圾邮件特征(比如全大写标题、大量无意义字符、可疑链接)。
- 你已经在用OAuth2授权,这点非常棒!相比SMTP密码登录,OAuth2认证的发件人更容易通过Gmail的安全校验,降低被拦截的概率。
- 给每张图片添加合理的
通过原始邮件排查问题
发送测试邮件后,在Gmail中打开邮件,点击右上角的三个点 → 「显示原始邮件」,检查以下关键项:- 图片部分的
Content-ID是否带有尖括号 - HTML里的
src="cid:..."是否和Content-ID去掉尖括号后的内容完全一致 - MIME多部分的类型是否为
multipart/related
- 图片部分的
按照这些步骤调整后,Gmail应该就不会再移除你的内嵌PNG图片了,我之前用这套方法解决过完全相同的问题,效果很稳定~
内容的提问来源于stack exchange,提问作者Quarcheek
相关产品推荐
相关产品推荐

