上次课我们讲了工作簿和工作表的拆分和合并。 上次课结束后,使用 Python 操作 Excel 文档的办公自动化便告一段落了,从本节课开始我们讲述如何使用 Python 发送邮件。在讲解使用 Python 发送邮件之前,先来看下传统信件以及电子邮件的发送流程。
# 1.传统信件的发送流程
假如在安徽合肥的张三要给在山东济南的朋友李四寄一封信。如下图所示: 首先张三把信写好,装进信封,在信封上写上寄件人和收件人的地址,贴上邮票,并把信件投递到附近的邮局。信件便由小邮局到大邮局,并经过若干中间环节的运输,到达李四家附近的邮局,再经过邮递员的投递,最终到达李四的手中。
# 2.电子邮件的发送流程
上边便是传统信件的发送流程,电子邮件的流程基本上也是按上面的方式运作的。假如张三要将一封邮件同时发送给李四和王五。如下图所示: 假设张三的电子邮箱地址为 zhangsan@sina.com,李四和王五的电子邮箱地址分别为 lisi@163.com 和 wangwu@163.com。首先张三通过电脑上的 outlook 软件写好一封电子邮件,在收件人栏中填上李四和王五的邮件地址,并点击发送按钮,这样一封邮件便发送出去了,这里的 outlook 称为 MUA(Mail User Agent)———— 邮件用户代理。电子邮件首先会发送到 MTA(Mail Transfer Agent)———— 邮件传输代理,由于张三的电子邮箱地址为 zhangsan@sina.com,所以会到达新浪的 MTA,邮件到达新浪的 MTA 之后再经过若干中间环节的传输,到达网易的 MTA(因为李四和王五的邮箱地址分别为 lisi@163.com 和 wangwu@163.com)。到达网易的 MTA 之后,再由网易的 MTA 发送到最终的目的地 MDA(Mail Delivery Agent)———— 邮件投递代理。然后,李四和王五通过 outlook 把邮件从 MDA 取到本地。这便是整个电子邮件的发送流程。
发送邮件时,MUA 和 MTA 使用的协议是 SMTP(Simple Mail Transfer Protocol),SMTP 是一种提供可靠且有效的电子邮件传输的协议。SMTP 是建立在 FTP 文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
收邮件时,MUA 和 MDA 使用的协议有两种:POP(Post Office Protocol)目前版本是 3,俗称 POP3;IMAP(Internet Message Access Protocol),目前版本是 4。
# 3.发送邮件
上面便是电子邮件的发送流程,下面我们来讲下如何用代码来实现电子邮件的发送。用代码来实现电子邮件的发送其实就是实现 MUA 的功能。
# 3.1 纯文本邮件的发送
纯文本邮件发送的代码如下:
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
email_sender = '******@qq.com'
email_receiver = '******@gmail.com'
# 发件人
msg['From'] = email_sender
# 收件人
msg['to'] = email_receiver
# 邮件主题
msg['Subject'] = 'Hi there'
# 邮件内容
msg.set_content('This message is sent from Python.')
server = 'smtp.qq.com'
port = 465
passwd = '******'
with smtplib.SMTP_SSL(server, port) as server:
server.login(email_sender, passwd)
server.send_message(msg)
server.quit()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
在上面的代码中:
1.创建一个 `EmailMessage` 对象 msg,并设置发件人、收件人、邮件主题以及邮件内容。
2.连接 SMTP 服务器并发送邮件。
2
# 3.2 html 邮件内容的发送
html 邮件内容发送的代码如下:
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
email_sender = '******@qq.com'
email_receiver = '******@gmail.com'
# 发件人
msg['From'] = email_sender
# 收件人
msg['to'] = email_receiver
# 邮件主题
msg['Subject'] = 'Hi there'
# 邮件内容
html = """\
<html>
<body>
<p>Hi,<br>
How are you?<br>
<a href="http://www.aidaxue.com">aidaxue</a>
has many great tutorials.
</p>
</body>
</html>
"""
msg.add_alternative(html, subtype="html")
server = 'smtp.qq.com'
port = 465
passwd = '******'
with smtplib.SMTP_SSL(server, port) as server:
server.login(email_sender, passwd)
server.send_message(msg)
server.quit()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
上面的代码和纯文本邮件发送的不同点在于邮件的内容由纯文本变成了 html。还有就是往 msg 添加邮件内容的时候使用的是 add_alternative 方法。
# 3.3 带附件邮件的发送
带附件邮件的发送代码如下:
import smtplib
from email.message import EmailMessage
import imghdr
# 构造邮件内容。
msg = EmailMessage()
email_sender = '******@qq.com'
email_receiver = '******@gmail.com'
# 发件人
msg['From'] = email_sender
# 收件人
msg['to'] = email_receiver
# 邮件主题
msg['Subject'] = 'Hi there'
# 邮件内容
text = 'dinosaur'
msg.add_attachment(text)
with open('dinosaur.png', 'rb') as f:
img = f.read()
msg.add_attachment(img, maintype='image', subtype=imghdr.what(None, img))
server = 'smtp.qq.com'
port = 465
passwd = '******'
with smtplib.SMTP_SSL(server, port) as server:
server.login(email_sender, passwd)
server.send_message(msg)
server.quit()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
上面的代码和前面两种不同的是,邮件内容是文本和附件。添加附件的方法为 add_attachment。