我想在低RAM的VPS中发送10MB或更多附件的电子邮件;在Python 3中发送带附件的电子邮件的常用方法(我发现)是这样的:
from email.message import EmailMessage
# import other needed stuff here omitted for simplicity
attachment = 'some_file.tar'
msg = EmailMessage()
# set from, to, subject here
# set maintype, subtype here
with open(attachment, 'rb') as fd:
msg.add_attachment(fd.read(), # this is the problem, the whole file is loaded
maintype=maintype,
subtype=subtype,
filename=attachment)
# smtp_serv is an instance of smtplib.SMTP
smtp_serv.send_message(msg)
使用这种方法将整个文件加载到内存中,然后使用smtplib.SMTP.send_message发送EmailMessage对象,我期望的是一种为add_attachment提供文件描述符(或可迭代)的方法,而不是文件内容,在附件发送到服务器时以惰性方式(例如逐行或一些固定数量的字节)读取,如:
with open('somefile') as fd:
msg.add_attachment(fd, maintype=mt, subtype=st, filename=fn)
smtp_serv.send_message(msg)
有没有办法用标准库(电子邮件和smtplib)执行此操作(发送附件而不立即加载整个文件)???? 我在python文档中找不到任何线索。
提前致谢。
答案 0 :(得分:1)
我的建议是将附件上传到S3存储桶或Google Storage存储桶,然后在电子邮件中提供URL,供收件人下载。大多数邮件服务器会限制附件的大小,因此它们不太可能进入大多数邮件客户端。
您不必使用公共存储桶,可以混淆附件名称,并添加一个“预签名” URL-仅在有限的时间内可用:https://docs.aws.amazon.com/code-samples/latest/catalog/python-s3-generate_presigned_url.py.html