使用Python email模块发送邮件时附件显示为noname的问题排查
附件显示'noname'的原因及修复方案
问题出在你把附件的文件名头加到了外层的邮件容器对象上,而非附件本身:
你当前代码中是给MIMEMultipart对象(email变量)添加Content-Disposition头,但邮件客户端只会读取附件对应的MIMEBase对象的头信息来识别文件名,外层的头不会被解析为附件的文件名。
修正后的代码
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders # Setup email log message logfile = "log.txt" sender = "xxxxx@gmail.com" password = "xxxxx" receiver = "xxxxx@gmail.com" subject = "Log file ALERT!" body = """ Hello Dave, Here is your log file. """ email = MIMEMultipart() email["From"] = sender email["To"] = receiver email["Subject"] = subject email.attach(MIMEText(body, "plain")) attachment = "logkeys.txt" attached_file = open(attachment, 'rb') payload = MIMEBase('application', 'octet-stream') payload.set_payload((attached_file).read()) encoders.encode_base64(payload) # 关键修改:把Content-Disposition头添加到payload(附件对象)上,而非外层email对象 payload.add_header('Content-Disposition', 'attachment', filename=attachment) email.attach(payload) session = smtplib.SMTP_SSL('smtp.gmail.com', 465) #use gmail with port session.login(sender, password) #login with mail_id and password session.sendmail(sender, receiver, email.as_string()) session.quit()
说明
将email.add_header(...)替换为payload.add_header(...)后,代表附件的MIMEBase对象会携带正确的文件名标识头,邮件客户端就能正确识别并显示附件名称logkeys.txt,而不是默认的'noname'。
内容的提问来源于stack exchange,提问作者pentestdave
相关产品推荐
相关产品推荐

