smtplib
Python 标准库中,smtplib 模块提供 SMTP 协议发送接口,使用起来十分方便。先来写一个用于发送邮件的函数,一睹为快:
1
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
38
39
40
41
42
43
44
|
def send_email(host, port, user, password, fr, to, subject, body,
smtp_cls=smtplib.SMTP_SSL):
'''
Send an email by smtp protocol
Arguments
host: email server host
port: email server port
user: user to login
password: password
fr: sender email address, the same as login user usually
to: receiver email address
subject: email title
body: email content
Returns
None
'''
smtp = smtp_cls()
# connect and login
smtp.connect(host, port)
smtp.login(user, password)
# format message
msg = u'''From: {fr}
To: {to}
Subject: {subject}
Date: {date}
{body}
'''.format(
fr=fr,
to=to,
subject=subject,
date=datetime.datetime.now().strftime('%d/%m/%Y %H:%M'),
body=body,
)
# do send
smtp.sendmail(fr, to, msg.encode('utf8'))
smtp.quit()
|
函数通过参数指定了发送一封邮件所需要的全部要素,依次是: 邮件服务器地址、端口、登录用户、登录密码、发送人邮箱(一般与登录用户相同)、收件人邮箱,邮件标题,邮件内容。
函数第 21 行先初始化一个连接对象。注意到,类连接类通过 smtp_cls
参数化,灵活支持不同连接类,如 smtplib.SMTP
、 smtplib.SMTP_SSL
等。
第 24 行用指定的地址端口连接邮件服务器。紧接着,第 25 行用指定的用户密码进行登录。至此,程序编写已经成功了一半。
第 28 - 40 行组装消息体,消息体包括:发件人,收件人,邮件标题,发送时间,邮件内容等要素。消息体的格式如下:
1
2
3
4
5
6
|
From: xxxx@qq.com
To: yyyy@qq.com
Subject: hello world
Date: 23/5/2018 20:35
first email sent by python
|
空行之后就是邮件内容,可以包括多行。
第 43 行将消息体发送到邮件服务器。这样一封邮件就成功发送出去了,是不是很简单?
SMTP服务器
在调用 send_email
函数发送邮件前,需要获得邮件服务器的登录信息。登录信息包括四要素,分别是:服务器地址,端口,登录用户以及登录密码。
很不幸,不同的邮件厂商,做法颇有不同。下面以 QQ 邮箱为例,介绍如何获得登录信息:
登录 QQ 邮箱,点击 设置 > 账号 ,找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 ,按提示开启 SMTP 并取得授权码。
点击 如何使用 Foxmail 等软件收发邮件? ,指引里可以找到 SMTP 服务器地址以及端口信息:
至此,四要素集齐:服务器地址一般为 smtp.qq.com
,端口一般为 465
,登录用户就邮箱地址,密码就是授权码。
注意,SMTP服务器登录密码是生成的授权码,不是邮箱登录密码!
小手动起来,使用 Python 发出你的第一封邮件吧!
【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: