登录
首页 >  文章 >  python教程

Python定时发邮件教程:smtplib配置与定时任务

时间:2026-03-29 19:03:30 258浏览 收藏

本文深入剖析了Python定时发送邮件脚本在实际部署中高频踩坑的四大核心问题:SMTP连接失败需严格匹配SSL/TLS协议与应用专用密码、定时任务因环境路径/解释器/权限差异而静默失效、邮件内容乱码或被误判为垃圾邮件源于MIME编码与Header头设置不规范、密码硬编码风险则必须通过环境变量安全传递并适配不同调度环境(如cron或Windows任务计划器);文章不仅指出问题本质,更提供可直接复用的解决方案和生产级最佳实践,助你构建真正稳定、安全、跨环境可靠的自动化邮件系统。

Python定时发送邮件脚本怎么做_smtplib模块配置与任务调度

SMTP连接失败:认证被拒或超时怎么办

绝大多数邮件脚本卡在第一步——连不上邮箱服务器。不是密码错了,而是用错了端口、协议或没开应用专用密码。

  • smtplib.SMTP() 默认走明文 25 端口,现在基本被各大邮箱(Gmail、QQ、163)拒绝;必须改用 smtplib.SMTP_SSL()smtplib.SMTP() + .starttls()
  • Gmail 必须开启“两步验证”后生成“应用专用密码”,不能直接用登录密码;QQ 邮箱需在“设置 → 账户 → POP3/IMAP/SMTP服务”里开启 SMTP,并获取授权码
  • 国内邮箱如 163 对非 Web 登录限制更严,建议优先用 smtp.163.com + 端口 465 + SMTP_SSL,别试 25

定时任务跑不起来:cron / Windows 任务计划器常见断点

脚本本地能发,放进定时任务就静默失败——大概率是环境变量、工作路径或 Python 解释器路径没对齐。

  • cron 默认 $PATH 极简,不包含你 pip install 的包路径;要么在 crontab 里显式写全路径:/usr/local/bin/python3 /home/user/mail.py,要么在脚本开头加 #!/usr/bin/env python3chmod +x
  • Windows 任务计划器默认以“无界面”方式运行,如果脚本依赖用户级密钥环(比如某些邮箱 SDK 自动读取系统凭据),会拿不到凭据;建议把账号密码明文存进脚本(用环境变量更安全)或改用配置文件
  • 务必在定时任务里重定向日志:0 9 * * * /usr/bin/python3 /path/to/send.py >> /var/log/mail.log 2>&1,否则失败时连错误都看不到

邮件内容乱码或被当垃圾邮件:编码与头信息怎么设

中文标题变问号、正文缩成一行、刚发出去就被归进“推广”——问题不在 SMTP,而在 MIME 构建环节。

  • 别用普通字符串拼接邮件体;必须用 email.mime.text.MIMEText,并显式指定 _charset="utf-8",例如:MIMEText("你好", "plain", "utf-8")
  • 中文主题必须用 email.header.Header 编码,否则 Outlook 和 QQ 邮箱直接显示乱码:msg["Subject"] = Header("每日报告", "utf-8")
  • 缺少 From / To / Date 头,或 From 域名和 SMTP 发信域名不一致(比如用 Gmail SMTP 却填 From: me@company.com),极易触发反垃圾规则

密码硬编码太危险:环境变量怎么安全传进定时任务

把密码写死在脚本里,等于把邮箱钥匙贴在门上;但 cron 不自动加载 ~/.bashrc,环境变量传不进去。

  • Linux 下推荐在 crontab 文件顶部加 SHELL=/bin/bashPATH=...,再用 source ~/.bashrc; python3 script.py 包一层(注意 ~ 在 cron 中可能不展开,建议写绝对路径)
  • 更稳妥的是用 os.getenv("MAIL_PASS") 读环境变量,然后在 crontab 里写:MAIL_USER="a@b.com" MAIL_PASS="xxx" python3 /path/to/script.py
  • Windows 上任务计划器的“添加参数”框不支持环境变量注入,只能改用 PowerShell 封装:$env:MAIL_PASS="xxx"; python .\script.py

真正麻烦的从来不是发一封邮件,而是让这封邮件在凌晨三点、系统重启后、Python 版本升级时,依然准时出现在收件箱第一行——每个环节都得单独验,不能只靠本地跑通就以为万事大吉。

本篇关于《Python定时发邮件教程:smtplib配置与定时任务》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>