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 相关文章推荐
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
python实现把二维列表变为一维列表的方法分析
Oct 08 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
Python 实现加密过的PDF文件转WORD格式
Feb 04 Python
Python如何访问字符串中的值
Feb 09 Python
pytorch中图像的数据格式实例
Feb 11 Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
使用Python画了一棵圣诞树的实例代码
Nov 27 Python
使用python实现学生信息管理系统
Feb 25 Python
python实现简单区块链结构
Apr 25 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
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
javascript div 弹出可拖动窗口
2009/02/26 Javascript
浅析Prototype的模板类 Template
2011/12/07 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
js数组去重的方法总结
2019/01/18 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python基于pillow判断图片完整性的方法
2016/09/18 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
增大python字体的方法步骤
2020/07/05 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
单位刻章介绍信范文
2014/01/11 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技