【yagmail,一个邮件的 Python 库!】轻轻松松搞定自动化邮件发送
在Python编程中,发送电子邮件是一个常见的需求,无论是用于自动化报告、用户通知还是简单的信息交换。而yagmail是Python生态中邮件发送领域的“瑞士军刀”——帮你用最优雅的方式解决邮件发送这一看似简单实则繁琐的通勤问题。构建一个保障业务稳定运行的自动化消息推送系统,恰恰需要这样简单可靠的邮件发送工具。
在实际生活与生产中,yagmail的场景无处不在:运维团队可以用它定时推送服务器监控报告;爬虫项目的异常堆栈可以第一时间发送到你的邮箱;领导要求的Excel日报与PDF月报,可以毫秒级触达;就连双11大促时,那一封封悄然而至的营销邮件,背后很可能也是yagmail在高效运转。它的核心价值在于将传统需要几十行代码才能完成的附件、HTML邮件发送工作,压缩成寥寥数行清晰可读的逻辑。
一、安装yagmail
yagmail的安装与其他第三方Python库无异,非常简单高效:
bash
pip install yagmail
安装完毕后,建议提前开启邮箱的SMTP服务并拿到授权码(QQ邮箱、163邮箱、Gmail等均可),授权码比直接使用密码更安全。
二、基本用法——从入门到精通只需4步
1. 完成SMTP客户端初始化
python
import yagmail
# 方法一:直连式初始化(适用于Gmail等默认服务)
yag = yagmail.SMTP('your_email@gmail.com', 'your_password')
# 方法二:全参数配置(适用于QQ、163等)
yag = yagmail.SMTP(user='your_email@qq.com', password='your_auth_code', host='smtp.qq.com', port=465)
这一步相当于打通了你的发件渠道,比传统smptlib动辄配半个屏幕的参数要简洁得多。
2. 发送一封最简单的纯文本邮件
python
yag.send(
to='boss@company.com',
subject='【业绩报告】项目状态更新',
contents='超级无敌巨简单的yagmail测试——您的项目已成功上线!'
)
3. 发送带附件的邮件
python
yag.send(
to='leader@company.com',
subject='月度销售数据报表',
contents='详见附件,本季度营收再创新高!',
attachments=['/report/January_sales.xlsx', '/report/Q1_target.pdf']
)
直接将文件路径传入attachments参数,yagmail会自动根据mimetypes检测文件类型,省去了一大堆编写MIME代码的麻烦。
4. 发送HTML富文本邮件
python
html_mail = '''
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"></head>
<body>
<h1 style="color:#2c3e50;">🎉 数据分析周报</h1>
<p>本周关键指标:<strong>API调用成功率</strong> 高达 99.98%!</p>
<p>连续6周系统零故障,感谢团队每一位成员的卓越贡献。</p>
</body>
</html>
'''
yag.send(to='team@company.com', subject='本周技术复盘邮报', contents=html_mail)
三、高级用法——让你的邮件格式更“能打”
1. 在正文中内嵌图片
单纯将图片作为附件会显得不够专业,yagmail支持调用inline方法将图片插入到邮件正文的合适位置。
python
contents = [
'<h1>产品宣传照</h1>',
'<p>这是本月旗舰新品的官方视觉效果:</p>',
yagmail.inline('/path/to/product.png'),
'<p>更多详情请查阅官网。</p>'
]
yag.send(to='customer@mail.com', subject='新品预览', contents=contents)
值得一提的是,yagmail将整个SMTP邮件发送过程封装为一个会话对象,用户只需关注发给谁、主题是什么、正文写什么、要不要带附件等业务侧细节,其余底层逻辑(如TLS/SSL协商、MIME类型自动检测、中文文件名RFC2231编码处理等)均由库内部全自动完成。
2. 利用keyring安全存储密码
python
import yagmail
# 首次运行注册密码,后续无需重复输入
yagmail.register('your_email@gmail.com', 'your_password')
# 注册完成后,连接时仅需传入用户名
yag = yagmail.SMTP('your_email@gmail.com')
这比直接在代码中硬编码密码要安全得多,更适合在共享开发环境或云服务器上部署使用。
3. 多收件人与抄送密送逻辑
python
recipient_list = ['alice@company.com', 'bob@company.com', 'charlie@company.com']
yag.send(
to=recipient_list,
subject='全员大会会议纪要',
contents='关键决策点包括2026年产品路线的重新调整与团队架构微调。',
cc=['hr@company.com', 'product@company.com'],
bcc=['secret_board@company.com']
)
其中to参数支持列表实现群发,cc用于抄送,bcc则用于密送,确保多方协作时的信息透明度与隐私保护。
4. 自定义邮件头与优先级设置
python
yag.send(
to='urgent_handler@company.com',
subject='【紧急】线上数据库CPU飙升至95%',
contents='请尽快介入排查',
headers={
'X-Priority': '1', # 高优先级
'Reply-To': 'ops@company.com'
}
)
四、实战案例:三个改变日常生活的自动化场景
案例一:定时监控服务器CPU/内存,异常时自动报警
运维开发中,提前发现问题远胜于事后修复。以下代码每5分钟检查一次系统负载,超出阈值立刻触发邮件通知。
python
import psutil
import yagmail
import time
def send_alert(subject, body):
yag = yagmail.SMTP('monitor@company.com', 'auth_code', host='smtp.qq.com', port=465)
yag.send(to='admin@company.com', subject=subject, contents=body)
while True:
cpu_percent = psutil.cpu_percent(interval=1)
mem_percent = psutil.virtual_memory().percent
if cpu_percent > 85 or mem_percent > 90:
alert_msg = f'⚠️ 服务器负载告警!\nCPU使用率: {cpu_percent}%\n内存使用率: {mem_percent}%'
send_alert('[自动告警] 服务器负载异常', alert_msg)
time.sleep(300) # 5分钟轮询一次
案例二:结合Pandas导出DataFrame为Excel并自动发送日报
运营与数据分析工作中,很难忍受每天手动导出表格、打开邮箱、上传附件的重复劳动。这套脚本能直接绑定业务库数据,下班前自动发给领导。
python
import pandas as pd
import yagmail
from datetime import datetime
def send_daily_report():
data = {
'日期': [datetime.now().strftime('%Y-%m-%d')],
'DAU': 15230,
'营收': 452000
}
df = pd.DataFrame(data)
report_name = f'daily_report_{datetime.now().strftime("%Y%m%d")}.xlsx'
df.to_excel(report_name, index=False)
yag = yagmail.SMTP('data_report@company.com', 'auth_code', host='smtp.163.com', port=465)
yag.send(
to='manager@company.com',
subject='【每日必读】业务数据快报',
contents='<h3>数据汇总</h3>' + df.to_html(),
attachments=report_name
)
if __name__ == '__main__':
send_daily_report()
案例三:邮箱生日祝福/周年纪念推送机器人
对于B2C场景,我们可以结合csv文件读取用户的生日,每天自动执行邮件机器人,向当天生日的客户发送品牌关怀卡片。
python
import yagmail
import csv
from datetime import datetime
def read_birthday_list(file_path):
today_birthdays = []
with open(file_path, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
if row['birthday'] == datetime.now().strftime('%m-%d'):
today_birthdays.append(row)
return today_birthdays
def send_birthday_emails():
yag = yagmail.SMTP('service@brand.com', 'auth_code', host='smtp.exmail.qq.com', port=465)
birthdays = read_birthday_list('customer_data.csv')
for user in birthdays:
content = f"""
<html>
<body>
<h2>🎂 亲爱的 {user['name']},生日快乐!</h2>
<p>品牌为您准备了专属的周年庆优惠,点击链接领取纪念好礼~</p>
</body>
</html>
"""
yag.send(to=user['email'], subject='🎉 品牌为您的生日献上祝福', contents=content)
if __name__ == '__main__':
send_birthday_emails()
这些案例覆盖了devops运维联动、大数据分析自动化以及精细化用户运营三个截然不同的方向,足以体现yagmail凭借简洁的API渗透到业务场景中的巨大潜力。
五、写在最后
yagmail最迷人的地方在于它将邮件发送这项工作中跨越“能用”与“好用”之间的桥梁铺得极其平坦——极简的API让你不需要关心SMTP的底层握手细节,不用手动编写MIME混合消息,也不需要为附件的编码报错而抓耳挠腮。它在与Pandas、Schedule等生态工具的配合中展现出令人惊艳的扩展性,真正做到了“把复杂留给自己,把简单献给开发者”。
相信通过上述大量案例的演示,大家已经熟练掌握了yagmail的全部骚操作。那么,问题来了:你是想用它来搭建公司内部的自动日报系统,还是想写一个程序自动抓取女朋友喜欢的电影咨询、每天定时发到她的邮箱并标注好购票链接?欢迎在评论区留言分享你的创意脑洞,说不定下一个实现Python黑科技的巅峰代码就出自你的评论区。对于已经初步跑通代码的读者,如果在调试过程中出现奇怪的认证报错或授权码不匹配问题,非常欢迎在底部发问探讨,大家一起搓代码、一起成长!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)