我的知识记录

Python发送邮件带附件完整示例

用Python smtplib加MIMEBase发送带附件的邮件,支持PDF、Excel、图片等任意类型文件,附完整可运行代码与文件名中文乱码解决。

场景痛点

每天把报表打包成Excel或PDF后,还要手动登录邮箱、写正文、上传附件、点发送,一天重复十几遍。用Python把正文和附件一起塞进一封邮件,脚本一跑就发完,文件名还能自动按日期命名。

用到的库

smtplib、email都是标准库,无需pip安装。

# 无需安装

完整代码

# -*- coding: utf-8 -*-
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.header import Header

SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465
SENDER = "your_account@qq.com"
AUTH_CODE = "your_smtp_auth_code"
RECEIVER = "receiver@example.com"


def send_with_attachment(attachment_path):
# 1. 用MIMEMultipart把正文和附件打包到一封邮件里
msg = MIMEMultipart()
msg["From"] = Header(f"我的邮箱 <{SENDER}>", "utf-8")
msg["To"] = Header(RECEIVER, "utf-8")
msg["Subject"] = Header("每日报表(带附件)", "utf-8")

# 2. 邮件正文
body = "你好,\n\n附件是今日报表,请查收。"
msg.attach(MIMEText(body, "plain", "utf-8"))

# 3. 读取附件并作为base64编码加入邮件
filename = os.path.basename(attachment_path)
with open(attachment_path, "rb") as f:
part = MIMEBase("application", "octet-stream")
part.set_payload(f.read())
encoders.encode_base64(part)
# 关键:用Header对中文文件名编码,否则对方收到是乱码文件名
part.add_header(
"Content-Disposition",
"attachment",
filename=("utf-8", "", filename)
)
msg.attach(part)

# 4. 登录发送
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(SENDER, AUTH_CODE)
server.sendmail(SENDER, [RECEIVER], msg.as_string())
server.quit()
print("带附件邮件发送成功")


if __name__ == "__main__":
send_with_attachment("/path/to/daily_report.xlsx")

代码讲解

  • MIMEMultipart():一封邮件里既要正文又要附件,必须用multipart容器,把正文和附件都attach进去。
  • MIMEBase("application", "octet-stream"):通用二进制附件类型,PDF/Excel/zip都能用,不用按文件类型细分。
  • encoders.encode_base64(part):把附件二进制内容做base64编码,邮件传输协议只支持文本。
  • filename=("utf-8", "", filename):这是rfc2231规范的写法,专门解决中文文件名在对方邮箱里变成乱码的问题。

运行结果

运行后收件人邮箱收到一封带附件的邮件,附件文件名正常显示中文,双击可直接打开。

注意事项

  • 附件路径用绝对路径最稳,相对路径容易因为工作目录不对找不到文件。
  • 邮箱一般限制单封邮件总大小50MB,附件太大要先用网盘分享链接。
  • 多个附件就重复第3步多次msg.attach(part)即可。
  • 发送前先确认文件已经关闭,别被其他程序占用着读。

Python发送邮件带附件完整示例

标签:

更新时间:2026-09-14 21:05:59

上一篇:Python发送HTML格式邮件 排版美化教程

下一篇:Python定时发送邮件 schedule库实战