使用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 三. ...
随机推荐
- Scaled-YOLOv4 快速开始,训练自定义数据集
代码: https://github.com/ikuokuo/start-scaled-yolov4 Scaled-YOLOv4 代码: https://github.com/WongKinYiu/S ...
- 数仓建设中最常用模型--Kimball维度建模详解
数仓建模首推书籍<数据仓库工具箱:维度建模权威指南>,本篇文章参考此书而作.文章首发公众号:五分钟学大数据,公众号中发送"维度建模"即可获取此书籍第三版电子书 先来介绍 ...
- VMware 16.1虚拟机安装
VMware 16.1创建虚拟机 1.1首先打开我们安装好的VMware点击创建新的虚拟机 典型为自动安装,接口位默认 自定义安装更自由,可以把按需求选择 VMware16版本,只能选择Worksta ...
- 认识webservice
1.为什么需要webservice? 目前还有很多商用程序继续在使用C++.Java.Visual Basic和其他各种各样的语言编写.现在,除了最简单的程序之外,所有的应用程序都需要与运行在其他异构 ...
- 大厂面试官竟然这么爱问Kafka,一连八个Kafka问题把我问蒙了?
本文首发于公众号:五分钟学大数据 在面试的时候,发现很多面试官特别爱问Kafka相关的问题,这也不难理解,谁让Kafka是大数据领域中消息队列的唯一王者,单机十万级别的吞吐量,毫秒级别的延迟,这种天生 ...
- 【JavaWeb】JavaScript 基础
JavaScript 基础 事件 事件是指输入设备与页面之间进行交互的响应. 常用的事件: onload 加载完成事件:页面加载完成之后,常用于页面 js 代码初始化操作: onclick 单击事件: ...
- 使用 gRPCurl 调试.NET 5的gPRC服务
介绍 你用过 Curl 吗?这个工具允许你通过 http 来发送数据,现在有一个适用于gGRPC的工具,gRPCurl,在本文中,我将介绍如何下载安装这个工具,然后通过这个工具调试我们.NET 5上面 ...
- windows下部署Grafana +prometheus平台监控
1.Prometheus简介 Prometheus基于Golang编写,编译后的软件包,不依赖于任何的第三方依赖.用户只需要下载对应平台包,解压并且添加基本的配置即可正常启Prometheus S ...
- Request&Response总结
Request&Response Request 请求对象的类视图 请求对象常用方法 获取请求路径 返回值 方法名 说明 String getContextPath() 获取虚拟目录名称 St ...
- 庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境
庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境 一.介绍 说起微服务架构来,有一个环节是少不了的,那就是CI/CD持续集成的环境.当然,搭建CI/CD环境的工具很多, ...