You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现发送含纯文本正文与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:30:41