使用Python调用SMTP服务自动发送Email
需求背景
假设我们想设计一个定时任务,比如每天定时的用python来测试服务是否在正常运行,但是又不希望每天登录到系统后台去查看服务状态。这里我们就可以采取python的smtp模块进行任务结果广播,申请一个公共邮箱,每次python执行完定时的测试任务后,调用smtp的接口将测试结果广播给需要接收的人的邮箱中。这就使得,我们可以在移动端就能按照我们的意愿实时监测系统的状态。
QQ邮箱的SMTP服务配置流程
- 浏览器登录进入QQ邮箱
- 进入设置-账户

- 找到POP3-SMTP服务的位置,点击开启

- 进行一些验证程序

- 开启成功后,系统会给出一串长度为16的随机口令,用来替代密码进行第三方登录
- 配置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/
参考链接
- https://www.runoob.com/python/python-email.html
- https://www.runoob.com/linux/linux-comm-crontab.html
使用Python调用SMTP服务自动发送Email的更多相关文章
- python调用SOA服务
python调用SOA服务,运用suds模块 #! /usr/bin/python # coding:gbk import suds,time,sys reload(sys) sys.setdefau ...
- 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 ...
- Python使用SMTP模块、email模块发送邮件
一.smtplib模块: 主要通过SMTP类与邮件系统进行交互.使用方法如下: 1.实例化一个SMTP对象: s = smtplib.SMTP(邮件服务地址,端口号) s = smtplib.SMTP ...
- 使用python调用email模块发送邮件附件
使用python调用email模块实现附件发送 需要模块: import datetime import time import sys import mimetypes import smtplib ...
- python 原生态调用server服务————SimpleHTTPServer
python 原生态调用server服务,接收http传递的参数并且处理返回结果 很多blog中都是抄了官网的,没有说明参数如何接收 1.代码中提供了post与get两种方式来发起请求,但是传递参数时 ...
- Python使用SMTP发送邮件[HTML格式、送带附件]
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...
- maven小项目注册服务(一)--email和persist模块
跟着书里的讲解,跟着做了一遍该项目: 首先明白注册账户的需求: 账号的lD和Email地址都可以用来唯一地标识某个用户,而显示名称则用来显示在页面下,方便浏览.注册的时候用户还需要输入两次密码,以确保 ...
- python使用SMTP发送qq/sina邮件
python使用qq邮箱(个人邮箱)发送邮件需开启qq邮箱的SMTP服务 在设置中开启pop3/SMTP服务,返回的密码就是之后代码中登录使用账户密码(在完整代码中标识了出来) 之后出现如下错误 sm ...
- Python自动发送邮件-smtplib和email库
''' 一.先导入smtplib模块 导入MIMEText库用来做纯文本的邮件模板 二.发邮件几个相关的参数,每个邮箱的发件服务器不一样,以163为例子百度搜索服务器是 smtp.163.com 三. ...
随机推荐
- 如何在面试中介绍自己的项目经验(面向java改进版)
本人于3年前写的博文,如何在面试中介绍自己的项目经验,经过大家的捧场,陆续得到了将近7万个点击量,也得到了众多网站公众号的转载,不过自己感觉,这篇文章更多的是偏重于方法,没有具体给到Java方面相关的 ...
- Python在项目外更改项目内引用
前言 目前有一个奇葩的需求, 将某个开源项目整合进自己的项目里去调度, 还需要在每次启动这个开源项目时, 加载不同的配置文件进去, 问题是配置文件并不是一个 conf 或者是其他的什么, 而是以 .p ...
- VsCode/Pycharm配合python env 使用
前言 用惯了vscode,这几天试了一下pycharm,还是回来了. pycharm一个好处就是python env 环境支持的比较好, vscode虽然也支持但是要改一些东西 env的使用查看我的上 ...
- Mac安装Go语言
正文 安装 安装我们使用 HomeBrew ,其使用方法详见我的上一篇博文 brew install go 配置环境变量 Go1.3及以后版本跳过以下步骤 进入变量文件 cd ~ vim .bash_ ...
- python面向对象基础-属性/方法
- 【ORA】ORA-32004: 问题分析和解决
今天做一个特殊的实验,需要重启数据库 数据库关闭没有问题 SQL> shutdown immediate; Database closed. Database dismounted. ORACL ...
- leetcode 31. Next Permutation (下一个排列,模拟,二分查找)
题目链接 31. Next Permutation 题意 给定一段排列,输出其升序相邻的下一段排列.比如[1,3,2]的下一段排列为[2,1,3]. 注意排列呈环形,即[3,2,1]的下一段排列为[1 ...
- Unsafe Filedownload - Pikachu
概述: 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载代码,将该文件名对应的文件r ...
- python optparse模块的用法
引用原博主文章链接: https://www.cnblogs.com/darkpig/p/5717902.html
- Eureka详解系列(一)--先谈谈负载均衡器
这个系列开始研究 Eureka,在此之前,先来谈谈负载均衡器. 本质上,Eureka 就是一个负载均衡器,可能有的人会说,它是一个服务注册中心,用来注册服务的,这种说法不能说错,只是有点片面. 在这篇 ...