需求背景

假设我们想设计一个定时任务,比如每天定时的用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" #设置服务器
mail_user="your_name@qq.com" #用户名
mail_pass="passpasspasspass" #口令 sender = 'your_name@qq.com'
receivers = ['your_target@qq.com'] # 接收邮件,可设置为你的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):

一个定时任务+SMTP广播的示例

这里我们首先创建一个简单的打印随机数的任务,这样如果我们在crontab中添加一个执行该程序的定时任务,就可以每次产生一个不同的随机数并且将其输出到一个指定的文件中,再通过另外一个smtp的定时任务进行读取和广播。以下是打印随机数的任务内容:

[dechin@dechin-manjaro smtp]$ cat random_job.py
import random
print (random.random())

我们将前面用到的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" #设置服务器
mail_user="your_email@qq.com" #用户名
mail_pass="passpasspasspass" #口令 sender = 'your_email@qq.com'
receivers = ['your_target@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 message = MIMEText('Python SMTP 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("SMTP EMAIL", 'utf-8')
message['To'] = Header("TEST MESSAGE", 'utf-8') random_num = 1
with open('/home/dechin/projects/2021-python/smtp/random_number.txt', 'r') as file:
random_number = float(file.readlines()[0]) subject = 'The random number generated is: ' + str(random_number)
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 ("无法发送邮件")

最后,再配置好crontab定时任务如下:

[dechin@dechin-manjaro smtp]$ crontab -l
* * * * * python3 /home/dechin/projects/2021-python/smtp/random_job.py > /home/dechin/projects/2021-python/smtp/random_number.txt
* * * * * python3 /home/dechin/projects/2021-python/smtp/smtp_test.py

上面由于为了尽快的展示定时任务效果因此我们设置为每分钟都执行一次任务,实际场景中不需要这么高频率的定时任务测试。

最后查看邮箱收件箱,我们发现了一系列的定时任务的内容反馈如下:



到这里我们的定时监测任务+smtp广播的示例就演示完毕了,如果使用完该定时任务不想再启动,可以关闭crontab服务或者删除相关的crontab条目。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/smtp.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

参考链接

  1. https://www.runoob.com/python/python-email.html
  2. https://www.runoob.com/linux/linux-comm-crontab.html

使用Python调用SMTP服务自动发送Email的更多相关文章

  1. python调用SOA服务

    python调用SOA服务,运用suds模块 #! /usr/bin/python # coding:gbk import suds,time,sys reload(sys) sys.setdefau ...

  2. python调用kafka服务(使用kafka-python库)

    试验环境: CDH 5.15.1 CentOS 7 Python 3.7.0 kafka 1.1.1 kafka-python :https://pypi.org/project/kafka-pyth ...

  3. Python使用SMTP模块、email模块发送邮件

    一.smtplib模块: 主要通过SMTP类与邮件系统进行交互.使用方法如下: 1.实例化一个SMTP对象: s = smtplib.SMTP(邮件服务地址,端口号) s = smtplib.SMTP ...

  4. 使用python调用email模块发送邮件附件

    使用python调用email模块实现附件发送 需要模块: import datetime import time import sys import mimetypes import smtplib ...

  5. python 原生态调用server服务————SimpleHTTPServer

    python 原生态调用server服务,接收http传递的参数并且处理返回结果 很多blog中都是抄了官网的,没有说明参数如何接收 1.代码中提供了post与get两种方式来发起请求,但是传递参数时 ...

  6. Python使用SMTP发送邮件[HTML格式、送带附件]

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...

  7. maven小项目注册服务(一)--email和persist模块

    跟着书里的讲解,跟着做了一遍该项目: 首先明白注册账户的需求: 账号的lD和Email地址都可以用来唯一地标识某个用户,而显示名称则用来显示在页面下,方便浏览.注册的时候用户还需要输入两次密码,以确保 ...

  8. python使用SMTP发送qq/sina邮件

    python使用qq邮箱(个人邮箱)发送邮件需开启qq邮箱的SMTP服务 在设置中开启pop3/SMTP服务,返回的密码就是之后代码中登录使用账户密码(在完整代码中标识了出来) 之后出现如下错误 sm ...

  9. Python自动发送邮件-smtplib和email库

    ''' 一.先导入smtplib模块 导入MIMEText库用来做纯文本的邮件模板 二.发邮件几个相关的参数,每个邮箱的发件服务器不一样,以163为例子百度搜索服务器是 smtp.163.com 三. ...

随机推荐

  1. llinux文件相关指令

    一---导读 首先我们来看这样一个小案例,假设张三要出差,按照 这样的路线进行 北京->上海,之后回到北京.再按照北京->天津->石家庄这样的路线进行出差(北京是根据地).假设现在张 ...

  2. 学生成绩管理系统: 统计成绩排序并打印(c++)(内含读取文件.txt及将文件输出excel的方法)

    实验要求:输入30个学生的学号.姓名和5门课程的成绩,计算总分并按照总分排出名次,最后按照学号顺序打印成绩单, 并把成绩单输出为excel文件. txt数据: 2015020981 甲 90 89 9 ...

  3. transmission protocol

    传输层主要定义了主机应用程序间端到端的连通性,它一般包含四项基本功能 . 将应用层发往网络层的数据分段或将网络层发往应用层的数据段合并 建立端到端的链接,主要是建立逻辑连接以传送数据流 将数据段从一台 ...

  4. ethernet

    OSI参考模型 简化相关网络操作:提供不同厂商之间的互联 应用层 为应用程序提供服务 HTTP Telnet 表示层 数据格式化,加密.解密 ASCII EBCDIC JPEG 会话层 建立.维护.管 ...

  5. day122:MoFang:OSSRS流媒体直播服务器&基于APICloud的acLive直播推流模块实现RTMP直播推流

    目录 1.docker安装OSSRS流媒体直播服务器 2.基于APICloud的acLive直播推流模块实现RTMP直播推流 3.直播流管理 1.docker安装OSSRS流媒体直播服务器 1.OSS ...

  6. 【LeetCode】数组排序题 Array_Sorts

    数组排序 Array_Sorts LeetCode 数组排序题 88. 合并两个有序数组 合并两个有序数组 难度简单 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nu ...

  7. python—base64

    今天在写题时,执行脚本又报错了 脚本如下 #! /usr/bin/env python3 # _*_ coding:utf-8 _*_ import base64 # 字典文件路径 dic_file_ ...

  8. M8 E147 不可能为条目*确立账户

    今天用BAPI做发票校验, BAPI_INCOMINGINVOICE_CREATE这个函数使用都正常,可是突然就无法做发票检验了 报了个错误,"不可能为条目BOXT TR 确立账户" ...

  9. 【转】Js中的window.parent ,window.top,window.self 详解

    [转自]http://blog.csdn.net/zdwzzu2006/article/details/6047632 在应用有frameset或者iframe的页面时,parent是父窗口,top是 ...

  10. 打包遇到错误Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test

    引自:https://blog.csdn.net/xiexiangyan/article/details/107936774 遇到的问题 有一个maven项目,我clone一下最新的代码.准备打包(m ...