CentOS系统上使用Python发送邮件是很多运维人员和开发者的常见需求,不管是用来监控报警、定时发送报表,还是做简单的通知推送,Python都能轻松搞定。下面从实际使用的角度出发,分享几种在CentOS环境里用Python发邮件的具体方法,包括遇到坑怎么解决。

如何安装Python的邮件库

CentOS一般自带了Python2,但Python3需要自己装。先确认系统里是Python2还是Python3linux修改文件名,用python --versionpython3 --version都看一下。如果是Python2,直接可以用内置的smtplibemail库,不需要额外装什么。如果是Python3,也是一样,这两个库都是标准库,不用pip安装。但如果你想用更高级的库比如yagmail或者secure-smtplib,那就得装一下pip,然后pip install yagmail。不过多数情况下,直接用标准库就够了,省去依赖麻烦。

我试过在CentOS 7上直接写脚本,没装任何第三方库,跑得挺顺。但有一点要注意:CentOS默认的Python版本可能比较老,比如Python2.7,它的smtplib对SSL/TLS支持没那么强centos mail python,如果你的邮件服务商强制要求TLS1.2以上,可能得升级到Python3。

smtplib发送邮件时报错怎么办

smtplib发邮件最常见的报错是连接超时或者认证失败。连接超时一般是因为端口被防火墙挡住了,或者邮件服务商的端口写错了。比如QQ邮箱的SMTP端口是465(SSL)或者587(TLS),如果用错了端口就会报错。认证失败则多半是用户名密码不对,或者邮箱开启了独立密码。像QQ邮箱、163邮箱都需要用授权码而不是登录密码。

还有个坑是邮件编码问题。如果你发的邮件正文包含中文,一定要设置正确的编码,比如msg.set_charset('utf-8'),否则收件人看到的可能是乱码。另外,有些邮件服务商会检查发件人的域名和SPF记录,如果不符合可能直接拒收。这时候可以试试改用发件人的SMTP服务器而不是自己搭建的。

我写过一个小脚本,先是smtplib.SMTP_SSL连接,然后login,再sendmail,报错时捕捉异常打印出来,这样调试起来方便很多。

如何使用yagmail简化邮件发送

如果你觉得标准库写起来太啰嗦,可以试试yagmail这个库。它把smtplibemail的很多步骤封装起来了,一行就能发一封带附件的邮件。在CentOS上安装也很简单,pip install yagmail就行,但前提是你已经装好了pip。

yagmail的用法是这样:先创建一个yagmail.SMTP对象centos mail python,传入发件人邮箱和授权码,然后直接调用send方法,收件人、主题、正文、附件都可以作为参数传进去。它自动处理编码、附件MIME类型、SSL连接这些琐事。我实际用下来发现,它对中文支持很好,不用额外设置什么。

不过用yagmail也有一个小问题:如果你的CentOS系统比较老,比如Python2.7,可能装不上最新版的yagmail。这时候要么升级Python,要么就用标准库。还有一点,yagmail默认会把授权码明文保存在脚本里,注意别把脚本上传到公开仓库。

centos mail python_centos mail python_centos mail python

如何用Python脚本发送带附件的邮件

带附件的邮件比纯文本邮件复杂一点,要用MIMEMultipart来构造邮件体。核心思路是把附件作为MIMEBase或者MIMEApplication对象,设置Content-Disposition和文件名,然后attach到邮件体上。对于图片、PDF、Excel等常见格式,记得用对应的MIME类型,比如application/pdf

在CentOS上测试时我踩过一个坑:附件文件名如果是中文,在部分邮件客户端里会显示乱码。解决办法是用Header模块对文件名进行Base64编码,比如from email.header import Header,然后filename = Header('报表.xlsx', 'utf-8').encode()。这样收件人看到的文件名就是正常的中文。

还有一个细节:附件路径要写对。如果脚本是用crontab定时执行的,最好用绝对路径,别用相对路径,否则找不到文件。我在生产环境里就是把附件放在固定的目录,脚本里写死路径linux游戏,跑了大半年没出过问题。

如何设置邮件模板和自动化发送

很多场景下邮件内容不是固定的,比如每天发送的监控报告,内容需要动态生成。这时候可以用字符串模板,比如string.Template或者jinja2jinja2功能更强,支持循环和条件判断,但需要额外安装。如果你的CentOS网络环境不好,也可以用Python自带的Template,基本够用。

我习惯先写好一个HTML模板文件,里面用占位符表示动态数据,比如{{date}}{{cpu_usage}}等。然后在脚本里读取模板,替换占位符,最后用MIMEText设置_subtype='html'发送。这样邮件排版好看,也容易维护。

自动化方面,可以用crontab定时执行Python脚本。比如每天凌晨跑一个脚本,抓取服务器状态,生成报告,然后自动发送给运维组。注意在crontab里要设置好Python环境变量和路径,否则脚本可能找不到模块。我在crontab里都是写完整路径,比如/usr/bin/python3 /opt/scripts/send_report.py

安全配置和常见误区

centos mail python_centos mail python_centos mail python

发邮件涉及账号密码,安全第一。别把授权码硬编码在脚本里,可以用环境变量或者配置文件,配置文件还要设置好权限,chmod 600。另外,如果用的是公司邮件服务器,可能还需要配置SSL证书验证,有些自签名证书会导致报错,需要设置context=ssl._create_unverified_context(),但这个只建议在测试环境用。

还有一个常见误区是认为发邮件必须自己搭建SMTP服务器。其实用QQ邮箱、163邮箱、Gmail的SMTP服务就足够了,免费而且稳定。只要知道发件人的邮箱和授权码,在脚本里配置好服务器地址和端口就行。但要注意,Gmail的SMTP在国内可能连不上,需要用企业邮箱或者国内服务商。

最后提醒一下,邮件不要发得太频繁,有些邮件服务商有发送频率限制,比如每小时最多发多少封。如果超了可能会被封账号。建议在脚本里加个发送间隔控制,或者用队列慢慢发。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复