Python调用SMTP服务自动发送Email的实现步骤


Posted in Python onFebruary 07, 2021

需求背景

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

QQ邮箱的SMTP服务配置流程

1.浏览器登录进入QQ邮箱
2.进入设置-账户

Python调用SMTP服务自动发送Email的实现步骤

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

Python调用SMTP服务自动发送Email的实现步骤

4.进行一些验证程序

Python调用SMTP服务自动发送Email的实现步骤

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做错误日志采集,因此即使有报错程序也能继续执行,但是会广播错误日志。

最后通过查询邮箱里面的邮件(有时候可能会被放到垃圾箱里面),正常情况下可以看到一份这样的邮件:

Python调用SMTP服务自动发送Email的实现步骤

使用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):

Python调用SMTP服务自动发送Email的实现步骤

一个定时任务+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_number = 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

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

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

Python调用SMTP服务自动发送Email的实现步骤

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

以上就是Python调用SMTP服务自动发送Email的实现步骤的详细内容,更多关于Python调用SMTP服务自动发送Email的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python两种遍历字典(dict)的方法比较
May 29 Python
Python中函数的参数传递与可变长参数介绍
Jun 30 Python
Python算法应用实战之栈详解
Feb 04 Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 Python
Django Web开发中django-debug-toolbar的配置以及使用
May 06 Python
在pycharm中设置显示行数的方法
Jan 16 Python
Python 使用threading+Queue实现线程池示例
Dec 21 Python
Python3实现建造者模式的示例代码
Jun 28 Python
如何利用Python 进行边缘检测
Oct 14 Python
Python利器openpyxl之操作excel表格
Apr 17 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 Python
Python 文字识别
May 11 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 #Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 #Python
Pandas数据分析的一些常用小技巧
Feb 07 #Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
Feb 07 #Python
python实现经典排序算法的示例代码
Feb 07 #Python
Python自动化测试基础必备知识点总结
Feb 07 #Python
10张动图学会python循环与递归问题
Feb 06 #Python
You might like
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
php常用的url处理函数总结
2014/11/19 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
Django中处理出错页面的方法
2015/07/15 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
详解Python中的动态属性和特性
2018/04/07 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
python人民币小写转大写辅助工具
2018/06/20 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
路政管理专业个人自荐信范文
2013/11/30 职场文书
个人自我剖析材料
2014/09/30 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
Python - 10行代码集2000张美女图
2021/05/23 Python
这样写python注释让代码更加的优雅
2021/06/02 Python
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS