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

如何使用smtplib为邮件添加附件?现有发送脚本求助调整

解决Python邮件脚本添加附件的问题

你的代码核心问题是smtpserver.sendmail()方法不支持直接传入文件名作为参数,发送带附件的邮件需要借助Python标准库的email模块构建符合MIME规范的邮件内容,以下是修改后的完整可行代码:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

filename = 'image.png'
my_user = 'myemail@gmail.com'
my_pass = 'my app code' 

smtpserver = smtplib.SMTP_SSL('smtp.gmail.com', 465)
smtpserver.ehlo()
smtpserver.login(my_user, my_pass)

sent_from = my_user
sent_to = 'myotheremail'

# 构建多部分邮件对象,用于容纳正文和附件
msg = MIMEMultipart()
msg['From'] = sent_from
msg['To'] = sent_to
msg['Subject'] = '测试邮件(带附件)'

# 添加纯文本正文
email_text = 'This is a test'
msg.attach(MIMEText(email_text, 'plain'))

# 读取并添加图片附件
with open(filename, 'rb') as f:
    img_content = f.read()
    # 创建图片MIME对象,指定文件名
    image_attachment = MIMEImage(img_content, name=filename)
    msg.attach(image_attachment)

# 将邮件对象转为字符串后发送
smtpserver.sendmail(sent_from, sent_to, msg.as_string())

smtpserver.close()

关键说明

  • 必须使用MIMEMultipart类型创建邮件对象,它能同时容纳文本正文和附件等不同内容部分
  • 邮件头信息(From/To/Subject)必须明确设置,否则邮件可能被拒收或无法正常显示
  • 如果要发送非图片类型的附件(如文档、压缩包),可以改用MIMEBase类处理,示例代码如下:
from email.mime.base import MIMEBase
from email import encoders

# 通用附件添加逻辑
with open(filename, 'rb') as f:
    # 创建基础MIME对象
    attachment = MIMEBase('application', 'octet-stream')
    attachment.set_payload(f.read())
    # 对附件内容进行Base64编码
    encoders.encode_base64(attachment)
    # 设置附件的头部信息,指定显示的文件名
    attachment.add_header('Content-Disposition', f'attachment; filename="{filename}"')
    msg.attach(attachment)

内容的提问来源于stack exchange,提问作者mmewtwosaysbye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:33:23