你是否遇到以下问题:
每天发送日报邮件,只是换个文件或几个数字
需要批量群发通知邮件给公司员工、客户或注册用户
希望程序运行后自动发出日志或报告提醒
想给用户发送图文并茂的 HTML 邮件或带附件的邮件
Python 可以做到:
✅ 自动化邮件发送流程
✅ 支持多种格式(纯文本、HTML、图像、附件)
✅ 批量发送并控制收件人
✅ 可结合数据自动构建邮件内容
SMTP(Simple Mail Transfer Protocol):邮件发送协议
MIME(Multipurpose Internet Mail Extensions):用于构建富媒体邮件(支持图片、文件、HTML)
Python 内置库 smtplib
用于邮件发送,email.mime
模块用于构造邮件内容。
以 QQ 邮箱 为例:
登录 QQ 邮箱
设置 → 账户 → 开启“POP3/SMTP服务”
获取授权码(非邮箱密码)用于登录
示意图:SMTP 授权码设置界面(QQ 邮箱)
python
复制编辑
import smtplib from email.mime.text import MIMEText msg = MIMEText('这是测试邮件内容', 'plain', 'utf-8') msg['From'] = '你的邮箱@qq.com' msg['To'] = '收件人邮箱@example.com' msg['Subject'] = 'Python 邮件测试' server = smtplib.SMTP_SSL('smtp.qq.com', 465) server.login('你的邮箱@qq.com', '你的授权码') server.sendmail('你的邮箱@qq.com', ['收件人邮箱@example.com'], msg.as_string()) server.quit()
运行后可收到测试邮件。
python
复制编辑
今日进展良好,项目完成度已达 85%html = """
日报通知
效果图: 邮件中显示加粗、高亮的 HTML 元素。
python
复制编辑
from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders msg = MIMEMultipart() msg['From'] = '你的邮箱@qq.com' msg['To'] = '收件人邮箱@example.com' msg['Subject'] = '带附件的日报' # 邮件正文(可加 html) msg.attach(MIMEText('请查收今日日报,附件中包含详细内容', 'plain', 'utf-8')) # 添加附件部分 file_path = 'report.pdf' with open(file_path, 'rb') as f: part = MIMEBase('application', 'octet-stream') part.set_payload(f.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename=file_path) msg.attach(part)
python
复制编辑
from email.mime.image import MIMEImage msg = MIMEMultipart('related') msg['Subject'] = '嵌入图像邮件' msg.attach(MIMEText('
图表如下:
', 'html')) with open('chart.png', 'rb') as img: image = MIMEImage(img.read()) image.add_header('Content-ID', '
邮件示意图: 图片直接显示在邮件正文中,而不是作为附件下载。
python
复制编辑
msg['To'] = ','.join(['[email protected]', '[email protected]']) msg['Cc'] = '[email protected]' msg['Bcc'] = '[email protected]'
你可以在 sendmail()
中加入所有接收人:
python
复制编辑
recipients = ['[email protected]', '[email protected]', '[email protected]', '[email protected]'] server.sendmail(sender, recipients, msg.as_string())
python
复制编辑
import pandas as pd df = pd.read_excel('mail_list.xlsx') # 列包括 name 和 email for i, row in df.iterrows(): name = row['name'] email = row['email'] msg = MIMEText(f'亲爱的{name},这是个性化通知邮件') msg['To'] = email msg['From'] = '你自己@qq.com' msg['Subject'] = '通知:邮件群发测试' server.sendmail('你自己@qq.com', [email], msg.as_string())
可实现对每个用户个性化内容的群发邮件。
python
复制编辑
def send_email(subject, content, receivers, attachments=None, html=False): msg = MIMEMultipart() msg['Subject'] = subject msg['From'] = FROM msg['To'] = ','.join(receivers) if html: msg.attach(MIMEText(content, 'html')) else: msg.attach(MIMEText(content, 'plain')) if attachments: for file in attachments: with open(file, 'rb') as f: part = MIMEBase('application', 'octet-stream') part.set_payload(f.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename=file) msg.attach(part) with smtplib.SMTP_SSL(SMTP_HOST, 465) as server: server.login(FROM, AUTH_CODE) server.sendmail(FROM, receivers, msg.as_string())
项目运行完成后自动发邮件(日志 + 报告)
每天 9:00 定时发送日报(配合 APScheduler)
系统监控到异常自动发出邮件提醒(配合日志钩子)
python
复制编辑
import schedule import time def job(): send_email('自动日报', '今日无异常', ['[email protected]']) schedule.every().day.at("09:00").do(job) while True: schedule.run_pending() time.sleep(60)
使用 Tkinter 构建界面表单:
输入标题、内容
选择附件
点发送按钮
或用 pywebio
实现网页工具,适合部署到局域网使用。
问题 | 解决方案 |
---|---|
邮件发不出去 | 检查 SMTP 服务是否启用,授权码是否正确 |
Gmail 登录失败 | 需开启“低安全应用访问”或使用 OAuth |
中文附件名乱码 | 添加 filename 时使用 Header().encode() |
邮件被拦截 | 发件内容太像垃圾邮件,需控制频率或内容格式 |
收件人未收到 | 检查是否被误标为垃圾邮件 |
用 Python 构造并发送文本、HTML、图像、附件邮件
支持多个收件人、抄送、密送
从 Excel 导入联系人实现群发
邮件发送函数封装
支持定时发送和任务结合
方向 | 示例 |
---|---|
图表分析邮件 | 自动生成 matplotlib 图表插入邮件 |
动态数据日报 | 调用 API 获取销售/库存数据后发出日报 |
邮件内容自动填充 | 与 Word 模板、Pandas、Excel 结合实现内容定制 |
邮件追踪和记录 | 每次发送记录写入日志或数据库 |
失败重试机制 | 遇到连接中断时自动重连 |