需求背景
假设我们想设计一个定时任务,比如每天定时的用python来测试服务是否在正常运行,但是又不希望每天登录到系统后台去查看服务状态。这里我们就可以采取python的smtp模块进行任务结果广播,申请一个公共邮箱,每次python执行完定时的测试任务后,调用smtp的接口将测试结果广播给需要接收的人的邮箱中。这就使得,我们可以在移动端就能按照我们的意愿实时监测系统的状态。
QQ邮箱的SMTP服务配置流程
1.浏览器登录进入QQ邮箱
2.进入设置-账户
3.找到POP3-SMTP服务的位置,点击开启
4.进行一些验证程序
5.开启成功后,系统会给出一串长度为16的随机口令,用来替代密码进行第三方登录
6.配置smtp服务器地址和端口号
使用授权码登录SMTP并发送邮件
这里我们直接展示成果代码,其中一些隐私信息做了处理:
# smtp_test.py #!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header # 第三方 SMTP 服务 mail_host="smtp.qq.com" #<strong>本文来源gaodai#ma#com搞@代~码^网+</strong>设置服务器 mail_user="[email protected]" #用户名 mail_pass="passpasspasspass" #口令 sender = '[email protected]' receivers = ['[email protected]'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 message = MIMEText('Python SMTP 邮件发送测试...', 'plain', 'utf-8') message['From'] = Header("SMTP EMAIL", 'utf-8') message['To'] = Header("TEST MESSAGE", 'utf-8') subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(mail_user,mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print ("邮件发送成功") except smtplib.SMTPException: import traceback traceback.print_exc() print ("无法发送邮件")
这里的服务器配置的SMTP的服务器smtp.qq.com,对应端口号配置为25,这里的口令和帐号应替换为读者自己的授权口令和帐号。该程序的正常结果如下:
[dechin@dechin-manjaro smtp]$ python3 smtp_test.py 邮件发送成功
另外由于这里采用了tracback做错误日志采集,因此即使有报错程序也能继续执行,但是会广播错误日志。
最后通过查询邮箱里面的邮件(有时候可能会被放到垃圾箱里面),正常情况下可以看到一份这样的邮件:
使用crontab添加Linux系统定时任务
crontab是Linux系统下自带的定时任务配置服务,基本使用方法就是通过crontab -l来查看定时任务,以及通过crontab -e来编辑定时任务。但是由于自带的编辑器为nano,使用起来非常的不顺手,所以我们可以将其编辑器配置为vim再进行使用,相关指令为:
[dechin@dechin-manjaro smtp]$ export EDITOR=”/usr/bin/vim” ; crontab -e
当然,在当前用户登录界面下,只需要临时配置一次即可一直直接使用crontab -e进行配置,持久生效需要修改配置文件,这里不展开介绍。crontab的任务配置可以参考如下介绍(图片来自于参考链接2):