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

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

Python

SMTP连接失败需改用SSL/TLS并配应用专用密码;定时任务要对齐环境路径并重定向日志;邮件编码须用MIMEText和Header指定UTF-8;密码应通过环境变量安全传递。

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 构建环节。

标贝科技

标贝科技-专业AI语音服务的人工智能开放平台

  • 别用普通字符串拼接邮件体;必须用 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 版本升级时,依然准时出现在收件箱第一行——每个环节都得单独验,不能只靠本地跑通就以为万事大吉。

本文地址:https://www.sztg.com.cn/article/608909.html

如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!

猜您喜欢