Python 办公自动化实战:实现自动发送邮件工具(含图文、附件、多收件人)

一、应用场景分析

你是否遇到以下问题:

  • 每天发送日报邮件,只是换个文件或几个数字

  • 需要批量群发通知邮件给公司员工、客户或注册用户

  • 希望程序运行后自动发出日志或报告提醒

  • 想给用户发送图文并茂的 HTML 邮件或带附件的邮件

Python 可以做到:

✅ 自动化邮件发送流程
✅ 支持多种格式(纯文本、HTML、图像、附件)
✅ 批量发送并控制收件人
✅ 可结合数据自动构建邮件内容


二、邮件基础知识:SMTP 与 MIME

  • SMTP(Simple Mail Transfer Protocol):邮件发送协议

  • MIME(Multipurpose Internet Mail Extensions):用于构建富媒体邮件(支持图片、文件、HTML)

Python 内置库 smtplib 用于邮件发送,email.mime 模块用于构造邮件内容。


三、准备工作:开启邮箱 SMTP 服务

QQ 邮箱 为例:

  1. 登录 QQ 邮箱

  2. 设置 → 账户 → 开启“POP3/SMTP服务”

  3. 获取授权码(非邮箱密码)用于登录


示意图:SMTP 授权码设置界面(QQ 邮箱)


四、发送最基础的纯文本邮件

1. 最小化可运行脚本

 
  

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()


运行后可收到测试邮件。


五、支持 HTML 格式邮件(富文本)

 
  

python

复制编辑

html = """

日报通知

今日进展良好,项目完成度已达 85%

""" msg = MIMEText(html, 'html', 'utf-8')


效果图: 邮件中显示加粗、高亮的 HTML 元素。


六、添加附件(PDF、Excel、图像均可)

 
  

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', '') msg.attach(image)


邮件示意图: 图片直接显示在邮件正文中,而不是作为附件下载。


八、支持多个收件人、抄送、密送

 
  

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())


九、从 Excel 表格读取联系人,实现批量群发

 
  

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)


十二、打包为 GUI 工具(可选)

使用 Tkinter 构建界面表单:

  • 输入标题、内容

  • 选择附件

  • 点发送按钮

或用 pywebio 实现网页工具,适合部署到局域网使用。


十三、常见问题与解决方案

问题 解决方案
邮件发不出去 检查 SMTP 服务是否启用,授权码是否正确
Gmail 登录失败 需开启“低安全应用访问”或使用 OAuth
中文附件名乱码 添加 filename 时使用 Header().encode()
邮件被拦截 发件内容太像垃圾邮件,需控制频率或内容格式
收件人未收到 检查是否被误标为垃圾邮件


十四、总结与项目扩展方向

✅ 本文掌握内容:

  • 用 Python 构造并发送文本、HTML、图像、附件邮件

  • 支持多个收件人、抄送、密送

  • 从 Excel 导入联系人实现群发

  • 邮件发送函数封装

  • 支持定时发送和任务结合


项目扩展方向建议:

方向 示例
图表分析邮件 自动生成 matplotlib 图表插入邮件
动态数据日报 调用 API 获取销售/库存数据后发出日报
邮件内容自动填充 与 Word 模板、Pandas、Excel 结合实现内容定制
邮件追踪和记录 每次发送记录写入日志或数据库
失败重试机制 遇到连接中断时自动重连

你可能感兴趣的:(网络,服务器,运维)