写点什么

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

作者:迷彩
  • 2022 年 9 月 25 日
    广东
  • 本文字数:2508 字

    阅读完需:约 8 分钟

前言


在实际的工作中,当我们需要向部门或者公司同事发送一封邮件时,总需要抄送多份,虽然现在发送邮件可以选中多个收件人或者多个可以把同事全部拉进一个 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。


SMTP 交互过程:

  1. 首先,客户端需要建立一个与 SMTP 服务器的 TCP 连接,端口为 25

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

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


具体发送和连接过程:

  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 选项,如下图所示:

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



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


代码实现


  1. 开启 SMTP 协议,获得授权码

  2. 引入 smtplib 模块

  3. 定义相关函数,执行代码发送邮件

导入相关模块:

import smtplibfrom email.mime.text import MIMETextfrom 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("邮件发送失败")
复制代码


执行结果如下:



发布于: 刚刚阅读数: 4
用户头像

迷彩

关注

我的工作是常年写bug|公众号:编程架构之美 2020.06.18 加入

修bug的菜鸟~公众号:“互联网有啥事”已改名为“编程架构之美”

评论

发布
暂无评论
【编程实践】提高工作效率,避免重复且枯燥的操作,利用Python自动发送邮件_SMTP_迷彩_InfoQ写作社区