Python发送带附件邮件时附件显示为无名称(noname)且无扩展名问题求助
解决Python发送邮件附件显示为无名称(noname)的问题
嘿,这个问题我之前踩过坑!核心问题出在附件头部的参数名称写错了——你用了Content-Decomposition,但正确的HTTP头应该是Content-Disposition!这个头的作用就是告诉邮件客户端“这是一个附件,请以下载方式处理”,同时传递文件名信息,写错的话客户端就没法识别文件名,只能显示默认的noname。
关键修正步骤
把你代码里的这一行:
payload.add_header('Content-Decomposition', 'attachment', filename=attach_file_name)
直接改成:
payload.add_header('Content-Disposition', 'attachment', filename=attach_file_name)
额外的优化建议
为了让邮件发送更规范、更稳定,我还建议你做这几个小调整:
- 使用准确的MIME类型:对于PDF文件,用
application/pdf代替octate-stream,这样邮件客户端能直接识别文件类型,而不是当成通用二进制文件 - 用
with语句管理文件:避免忘记关闭文件句柄,造成资源泄漏 - 确认文件路径:如果附件不在脚本的同级目录,最好使用绝对路径,防止找不到文件
完整的修正代码示例
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import smtplib # 配置邮件基础信息 sender_email = "your_sender@example.com" receiver_email = ["recipient1@example.com", "recipient2@example.com"] mail_content = "这是一封带有正确附件的Python测试邮件" message = MIMEMultipart() message['From'] = sender_email message['To'] = ', '.join(receiver_email) message['Subject'] = 'Python Email - 附件已修复' message.attach(MIMEText(mail_content, 'plain')) attach_file_name = 'Final Project - Basic Python.pdf' # 用with语句自动管理文件,避免资源泄漏 with open(attach_file_name, 'rb') as attach_file: # 指定PDF对应的标准MIME类型 payload = MIMEBase('application', 'pdf') payload.set_payload(attach_file.read()) encoders.encode_base64(payload) # 关键修正:使用正确的Content-Disposition头 payload.add_header('Content-Disposition', 'attachment', filename=attach_file_name) message.attach(payload) # 发送邮件(示例用SMTP服务器,需替换为你的服务商配置) with smtplib.SMTP('smtp.example.com', 587) as server: server.starttls() server.login(sender_email, "your_email_password") server.send_message(message)
这样修改后,邮件附件就能正常显示文件名和扩展名啦!
内容的提问来源于stack exchange,提问作者RoboData
相关产品推荐
相关产品推荐

