Django使用send_mail发带PDF附件的邮件报AttributeError如何解决
报错根因
send_mail()是Django封装的快捷发信方法,返回值为整数,表示成功发送的邮件数量,并非邮件实例对象,因此无法调用attach方法添加附件。如果需要发送带附件的邮件,需要使用Django提供的邮件构造类实现。
正确实现步骤
1. 导入依赖
from django.core.mail import EmailMessage, EmailMultiAlternatives from django.conf import settings import os
2. 调整发信逻辑
# 原有基础信息配置保留 subject = 'Management Automated Email- ' + item.emp html_message = render_to_string('email.html', data) plain_message = item.emp recipient_list = [item.email] from_email = 'email@gmail.com' # 修正原代码漏写的前引号 # 构造邮件实例,如需同时兼容纯文本和HTML格式,使用EmailMultiAlternatives mail = EmailMultiAlternatives( subject=subject, body=plain_message, from_email=from_email, to=recipient_list ) # 附加HTML格式内容 mail.attach_alternative(html_message, "text/html") # 按你的目录结构拼接PDF文件绝对路径 pdf_path = os.path.join(settings.BASE_DIR, 'Folder', 'templates', 'p.pdf') with open(pdf_path, 'rb') as f: pdf_content = f.read() # 添加附件,注意PDF对应的MIME类型为application/pdf mail.attach('papers.pdf', pdf_content, 'application/pdf') # 发送邮件 mail.send(fail_silently=False)
注意事项
- 读取附件文件时建议使用基于
BASE_DIR的绝对路径,避免相对路径引发的文件找不到错误 - 不同格式附件的MIME类型不要写错,否则可能导致收件端无法正常打开附件
内容的提问来源于stack exchange,提问作者intra
相关产品推荐
相关产品推荐

