使用SMTP协议发送邮件(Python语言)

smtplib

Python 标准库中, smtplib 模块提供 SMTP 协议发送接口,使用起来十分方便。 接下来,写一个用于发送邮件的函数,一睹为快:

/_src/python/smtp/send_email.py
 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 参数化, 灵活支持不同连接类,如 smtp.SMTPsmtp.SMTP_SSL 等。

24 行用指定的地址端口连接邮件服务器。 紧接着,第 25 行用指定的用户密码进行登录。 至此,程序编写已经成功了一半。

28 - 40 行组装消息体,消息体包括:发件人,收件人,邮件标题,发送时间,邮件内容等要素。 消息体的格式如下:

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 并取得授权码。

../_images/1c50f1e9f0bf98f7f495b14377869f71.png

授权码

点击 如何使用 Foxmail 等软件收发邮件? , 指引里可以找到 SMTP 服务器地址以及端口信息:

../_images/75d2afbd89bb1516a5f6f12cfda33bad.png

地址端口

至此,四要素集齐:服务器地址一般为 smtp.qq.com ,端口一般为 465 , 登录用户就邮箱地址,密码就是授权码。

警告

注意,SMTP服务器登录密码是生成的授权码,不是邮箱登录密码!

下一步

小手动起来,使用 Python 发出你的第一封邮件吧!

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../_images/wechat-mp-qrcode.png

小菜学编程