Python下无需重命名,如何发送多个同名文件作为邮件附件?
解决Gmail中同名附件被覆盖的问题
你遇到的问题是因为Gmail会通过文件名+附件的唯一标识判断是否为重复文件,默认情况下如果两个附件filename相同且无唯一标识,就会被合并显示。要在不修改filename的前提下让两个附件都正常显示,最可靠的方法是给每个附件添加唯一的Content-ID。
具体实现代码
修改附件添加逻辑,为每个附件生成唯一的Content-ID即可:
from email.message import EmailMessage import aiosmtplib from email.utils import make_msgid # 生成标准格式的Content-ID msg = EmailMessage() msg["Subject"] = "Reports" msg["From"] = "sender@gmail.com" msg["To"] = "receiver@gmail.com" files_to_attach = [ {"path": "folder1/report.pdf", "name": "report.pdf"}, {"path": "folder2/report.pdf", "name": "report.pdf"} ] for file in files_to_attach: with open(file["path"], 'rb') as f: # 生成唯一Content-ID,domain参数可替换为你的域名,也可留空用默认值 unique_cid = make_msgid(domain="your-domain.com") msg.add_attachment( f.read(), maintype='application', subtype='octet-stream', filename=file["name"], # 为当前附件添加唯一标识头 headers={'Content-ID': unique_cid} ) # 发送邮件 # await aiosmtplib.send(msg, ...)
原理说明
Content-ID是MIME协议中用来标识邮件内每个附件/内嵌资源的唯一标识符,Gmail会通过这个ID区分不同附件——即使文件名完全相同,只要Content-ID不一样,就会被视为独立文件显示,不会出现覆盖情况。
如果不想用make_msgid,也可以用UUID生成自定义格式的Content-ID,只要符合<唯一字符串@域名>的格式即可,示例:
import uuid unique_cid = f"<{uuid.uuid4()}@your-domain.com>"
内容的提问来源于stack exchange,提问作者Ajith Kumar R
相关产品推荐
相关产品推荐

