能否通过Django的send_mail()函数发送附件?求替代模块链接
Django发送带附件邮件的解决方案
嘿,好问题!Django内置的send_mail()函数确实不支持直接添加邮件附件——它是一个简化的邮件发送接口,主要用来快速发送纯文本或HTML格式的基础邮件,没有提供附件相关的参数。
如果需要发送带附件的邮件,推荐使用Django提供的EmailMessage类(以及它的子类EmailMultiAlternatives),这两个类是Django邮件系统的核心组件,支持添加附件、自定义邮件头、抄送/密送等高级功能。
示例1:使用EmailMessage发送带本地文件附件的邮件
from django.core.mail import EmailMessage # 初始化邮件对象 email = EmailMessage( subject="项目报告(含附件)", body="您好,附件是本次项目的详细报告,请查收。", from_email="your_work_email@company.com", to=["client@example.com"], bcc=["manager@company.com"], # 可选:密送相关人员 ) # 添加本地文件作为附件 email.attach_file("/home/user/documents/project_report.pdf") # 发送邮件(fail_silently=False会抛出异常方便排查问题) email.send(fail_silently=False)
示例2:使用EmailMultiAlternatives发送HTML邮件+附件
如果需要同时发送HTML格式的邮件正文(并保留纯文本作为降级方案),可以用EmailMultiAlternatives类,它继承自EmailMessage,完全兼容附件功能:
from django.core.mail import EmailMultiAlternatives email = EmailMultiAlternatives( subject="月度数据可视化报告", body="这是纯文本版本的邮件内容,若您的邮箱不支持HTML将显示此内容。", from_email="data_team@company.com", to=["team_members@company.com"], ) # 添加HTML格式的正文 email.attach_alternative( """ <h1>月度数据报告</h1> <p>本月用户增长<span style="color:green;">15%</span></p> <p>详情见附件</p> """, "text/html" ) # 添加字节流形式的附件(比如生成的临时文件内容) import io from PIL import Image # 生成一张简单的图片作为示例 img = Image.new('RGB', (100, 100), color='red') img_bytes = io.BytesIO() img.save(img_bytes, format='JPEG') img_bytes.seek(0) email.attach("growth_chart.jpg", img_bytes.read(), "image/jpeg") # 发送邮件 email.send()
这两个类完全满足带附件邮件的需求,而且是Django官方内置的,不需要额外安装第三方包,配置好邮件后端(比如SMTP)就能直接使用。
内容的提问来源于stack exchange,提问作者Keimeno
相关产品推荐
相关产品推荐

