如何实现发送含纯文本正文与HTML附件的邮件?
解决邮件纯文本正文+HTML附件的发送问题
你需要调整邮件的多部分类型,并添加纯文本正文的MIMEText实例,同时删掉多余的HTML正文代码,以下是修正后的完整代码:
from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.mime.text import MIMEText import smtplib, ssl from email import encoders def sendmail(): subject = 'Subject here' body = "Shard Count: 248" # 要添加为纯文本正文的内容 senders_email = 'title@domain.com' receiver_email = 'security@domain.com' # 创建支持正文+附件的multipart消息(默认类型为mixed) message = MIMEMultipart() message['From'] = senders_email message['To'] = receiver_email message['Subject'] = subject # 添加纯文本正文 message.attach(MIMEText(body, 'plain')) filename = 'logs.html' # 以二进制模式打开文件并处理为附件 with open(filename, 'rb') as attachment: part = MIMEBase('application','octet-stream') part.set_payload(attachment.read()) encoders.encode_base64(part) # 设置附件的头部信息 part.add_header( 'Content-Disposition', f"attachment; filename= {filename}", ) # 添加附件到消息 message.attach(part) text = message.as_string() # 发送邮件 context = ssl.create_default_context() with smtplib.SMTP("smtp.domain.com", 25) as server: # server.starttls(context=context) # server.login(senders_email, password) server.sendmail(senders_email, receiver_email, text) print("Email sent!") sendmail()
关键修改说明:
- 将
MIMEMultipart('alternative')改为MIMEMultipart():alternative类型用于同一内容的不同格式(比如纯文本和HTML正文二选一),而mixed类型(默认)支持同时包含独立的正文和附件。 - 添加了
message.attach(MIMEText(body, 'plain')):这行代码把你定义的body内容作为纯文本正文添加到邮件中。 - 删除了多余的
message.attach(MIMEText(html_file, 'html')):这行不仅会导致html_file未定义的报错,还不符合你要把HTML作为附件的需求。
内容的提问来源于stack exchange,提问作者Robin Sage
相关产品推荐
相关产品推荐

