【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件

时间:2022-12-27 11:22:42

前言

【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件

在实际的工作中,当我们需要向部门或者公司同事发送一封邮件时,总需要抄送多份,虽然现在发送邮件可以选中多个收件人或者多个可以把同事全部拉进一个QQ群发送群邮件的方式去解决同时向多人发送邮件,但是拉进一个群对于公司同事可能容易实现,但是需要向多个客户发送通知邮件,把所有客户拉近一个群不符合现实,且不容易操作,如果使用抄送的方式,好友太多,选择起来也是需要大量且耗时的操作,太废手了,所以这时候如果你把所有收件人全部整理出来,这样以后每次发送邮件就可以通过程序去自动发送邮件,减少无聊操作,提高工作效率。而且名单只需整理一次,一劳永逸。特别是向客户发邀请函的时候,需要在邮件中写上被邀请人的信息,以表公司的诚意。这时候几乎每封邮件都需要定制。使用抄送的方式也不合适,这时候可以使用Python来设置邮件内容,这时候程序就可以从名单文件中获取到定制部分的信息,达到没封邮件都是定制的样子,因为邀请函大部分内容格式都是一样的,只是公司和邀请人和名字不一样,所以使用程序来处理,是个不错的选择。

除了我们上面提到的场景,在我们运维系统或者网站服务系统中,都会使用到邮件的自动发送功能,在运维系统中我们会实现告警功能,通过邮件和短信多种方式通知系统告警信息。在电商网站上,我们会通过邮件信息通知用户每月账单,或者订单信息。

SMTP简介

在20世纪80年代早期SMTP开始被广泛地使用。当时它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反SMTP在发送和接收的机器始终都联网的情况下工作得最好。

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。

它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。SMTP是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。

SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了。可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX(Mail eXchange)DNS。

【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件

SMTP交互过程:

  1. 首先,客户端需要建立一个与SMTP服务器的TCP连接,端口为25
  2. 建立连接后,客户端和服务器先执行一些应用层握手操作,让SMTP服务器知道客户端的信息,并且对客户端请求作出响应等

在STMP握手阶段,客户端向SMTP服务器分别指定发信人,和收信人的电子邮件地址。握手阶段完毕,SMTP服务器把客户端发出的邮件消息添加到发信队列中,通过TCP提供的可靠数据传输服务把该消息无错地传送到服务器。如果客户还有其他邮件消息需要发送到同一个服务器,就在同一个TCP连接重复上述操作;否则,指示TCP关闭该连接。

【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件

具体发送和连接过程:

  1. 建立TCP连接
  2. 客户端发送HELO命令以标识发件人自己的身份,客户端发送MAIL命令。服务器以OK作为响应,表明准备接收
  3. 使用AUTH命令登录SMTP服务器,输入用户名和密码(用户名和密码都需要使用Base64加密)
  4. 客户端发送RCPT命令,标识该电子邮件的计划接收人,可以有多个RCPT行;服务器以OK作为响应,表示愿意为收件人发送邮件
  5. 协商结束后,使用DATA命令发送
  6. 以"."号结束,输入内容一起发送出去,结束此次发送,用QUIT命令退出

本文主要是利用Python结合SMTP实现邮件的发送,关于SMTP的相关内容这里就不再一一赘述,以后有机会可以单独唠唠

编程实践

使用Python发送有件

Python支持SMTP,可以发送纯文本邮件,HTML邮件和附带附件的邮件

发送邮件前需要对邮箱进行一些设置:

  1. 首先需要查看发件人是否开启了SMTP的协议,如果没有开启则需要开启,本文使用的是QQ邮箱的SMTP服务
  2. 登录QQ邮箱,单击"设置"链接,然后单击"账户"tab选项,如下图所示:

【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件

  1. 然后往下滚动页面,找到如下图的服务开启项,开启POP3/SMTP服务,会弹出一个授权码的窗口,如果没有弹出或者忘记了授权码,可以接着点击"生成授权码"按钮生成授权码

【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件

【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件

注:授权码是QQ邮箱推出的用于第三方客户端登录,为了账户安全,更改QQ密码及独立密码会导致授权码过期,需要重新获取新的授权码登录,一个账号可以有多个授权码,可以不用特意记住,但需要每次获取

代码实现

  1. 开启SMTP协议,获得授权码
  2. 引入smtplib模块
  3. 定义相关函数,执行代码发送邮件

【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件

导入相关模块:

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

配置邮箱账户相关信息:发件人邮箱账号,密码,邮箱的pop3授权码,收件人账号.收件人可以是自己

my_sender = '1234567890@qq.com'  # 发件人邮箱账号
my_pass = 'qwertyuiopeasdfgh' # 发件人邮箱pop3授权码
receiver = '987654321@qq.com' # 收件人邮箱账号

使用smtplib发送邮件

def mail():
ret = True
try:
msg = MIMEText('你好,这是一封邀请函', 'plain', 'utf-8')
msg['From'] = formataddr(["迷彩", my_sender]) # 发件人邮箱昵称、邮箱账号
msg['To'] = formataddr(["迷彩", receiver]) # 收件人邮箱昵称、邮箱账号
msg['Subject'] = "邀请函" # 邮件的主题,也可以说是标题

server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, my_pass) # 发件人邮箱账号、邮箱密码
server.sendmail(my_sender, [receiver, ], msg.as_string()) # 发件人邮箱账号、收件人邮箱账号、发送内容
server.quit() # 关闭连接
except Exception: # 异常处理:如果 try 中的语句没有执行,则会执行下面的 ret=False
ret = False
return ret

执行代码,发送邮件:

sendMail = mail()
if sendMail:
print("邮件发送成功")
else:
print("邮件发送失败")

执行结果如下:

【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件

【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件