如何使用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
相关产品推荐
相关产品推荐

