使用 smtplib 发送电子邮件


# 使用 smtplib 发送电子邮件

# 准备

# 1. 开启邮箱的 SMTP 服务

这里使用第三方 SMTP 服务发送邮件,可以使用 QQ 邮箱,163,Gmail 等的 SMTP 服务,但需要做以下配置,以 QQ 邮箱为例。

登录 QQ 邮箱,依次点击最上方的设置 => 账户

QQ 邮箱设置

(QQ 邮箱设置,未来界面可能会变化)

往下翻页,找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 这一版块,开启 POP3/SMTP 服务。(不同版本的 QQ 可能会不一样,总之就是找到 QQ 邮箱的「POP3/SMTP服务」开启按钮)

开启 POP3/SMTP 服务

(开启 POP3/SMTP 服务,未来界面可能会变化)

成功开启 QQ 邮箱的 SMTP 服务后,我们会得到一串授权码,在后面的代码里,这串授权码就是我们邮箱的登录密码。开启 SMTP 服务可能需要进行手机验证,根据提示来就好。

# 2. 常用的邮件服务器配置

下面整理了常用的邮件服务器名称、地址及 SSL/非SSL 协议端口号。

网易 163 免费邮箱相关服务器信息:

服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.163.com 993 143
SMTP smtp.163.com 454/994 25
POP3 pop.163.com 995 110

网易 163 企业邮箱相关服务器信息:(免费企业邮箱的 smtp 服务器名及端口号为:smtp.ym.163.com / 25)

服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.qiye.163.com 993 143
SMTP smtp.qiye.163.com 994 25
POP3 pop.qiye.163.com 995 110

网易 126 免费邮箱相关服务器信息:

服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.126.com 993 143
SMTP smtp.126.com 465/994 25
POP3 pop.126.com 995 110

腾讯 QQ 免费邮箱相关服务器信息:

服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.qq.com 993 143
SMTP smtp.qq.com 465/587 25
POP3 pop.qq.com 995 110

腾讯 QQ 企业邮箱相关服务器信息:

服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.exmail.qq.com 993 143
SMTP smtp.exmail.qq.com 465/587 25
POP3 pop.exmail.qq.com 995 110

谷歌 Gmail 邮箱相关服务器信息:

服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.gmail.com 993 143
SMTP smtp.gmail.com 465 25
POP3 pop.gmail.com 995 110

# 发送纯文本邮件

下面所有示例使用 QQ 邮箱,注意 QQ 邮箱 SMTP 服务器地址:smtp.qq.com,ssl,端口:465。

以下实例你需要修改:发件人邮箱(你的 QQ 邮箱),密码,收件人邮箱(可发给自己)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import smtplib
from email.header import Header
from email.mime.text import MIMEText

# ----- 需要修改的参数 -----
# email相关
sender = 'fedbook@qq.com'
password = '******'
smtp_server = 'smtp.qq.com'
smtp_port = 465
receivers = ['recever1@163.com', 'recever2@qq.com']
# ------------------------


def send_email(subject, detail):
    now_time = time.strftime('%Y-%m-%d %H:%M:%S')
    mail_msg = """
    时间:{now_time}
    详情:{detail}
    """.format(subject=subject, now_time=now_time, detail=detail)

    msg = MIMEText(mail_msg, 'plain', 'utf-8')
    msg['From'] = Header('fedbook汇报人 <%s>' % sender, 'utf-8')
    msg['To'] = Header('fedbook订阅者', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')

    try:
        smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
        # smtp.set_debuglevel(1)    # 打印和SMTP服务器交互的所有信息
        smtp.login(sender, password)
        smtp.sendmail(sender, receivers, msg.as_string())
        smtp.quit()
        print('邮件发送成功')
    except smtplib.SMTPException as e:
        print('Error: 无法发送邮件')
        print(e)


if __name__ == "__main__":
    email_title = 'Python SMTP 纯文本邮件测试'
    detail = """
    欢迎访问:wenyuan.github.io
    这里是 WENYUAN 的学习小册,记录前端学习的知识体系
    包含 HTML, CSS, JavaScript, Vue, React, 数据结构与算法, 设计模式, etc.
    """
    send_email(email_title, detail)
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
45
46
47
48
49
50

# 发送 HTML 格式的邮件

以下实例你需要修改:发件人邮箱(你的 QQ 邮箱),密码,收件人邮箱(可发给自己)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import smtplib
from email.header import Header
from email.mime.text import MIMEText

# ----- 需要修改的参数 -----
# email相关
sender = 'fedbook@qq.com'
password = '******'
smtp_server = 'smtp.qq.com'
smtp_port = 465
receivers = ['recever1@163.com', 'recever2@qq.com']
# ------------------------


def send_email(subject, detail):
    now_time = time.strftime('%Y-%m-%d %H:%M:%S')
    mail_msg = """
    <h1 style='margin-top:10px;margin-bottom:10px;text-align:center'>{subject}</h1>
    <hr>
    <h2 style='margin-top:0;margin-bottom:10px'>时间</h2>
    <div style='margin-left: 40px'>{now_time}</div>
    <hr>
    <h2 style='margin-top:0;margin-bottom:10px'>详情</h2>
    <div style='margin-left: 40px'>{detail}</div>
    <hr>
    """.format(subject=subject, now_time=now_time, detail=detail)

    msg = MIMEText(mail_msg, 'html', 'utf-8')
    msg['From'] = Header('fedbook汇报人 <%s>' % sender, 'utf-8')
    msg['To'] = Header('fedbook订阅者', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')

    try:
        smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
        # smtp.set_debuglevel(1)    # 打印和SMTP服务器交互的所有信息
        smtp.login(sender, password)
        smtp.sendmail(sender, receivers, msg.as_string())
        smtp.quit()
        print('邮件发送成功')
    except smtplib.SMTPException as e:
        print('Error: 无法发送邮件')
        print(e)


if __name__ == "__main__":
    email_title = 'Python SMTP HTML格式邮件测试'
    detail = """
    <div>欢迎访问:<a href="http://wenyuan.github.io" target="_blank">wenyuan.github.io</a></div>
    <div style='margin-bottom:5px'>这里是 WENYUAN 的学习小册,记录前端学习的知识体系。</div>
    """
    send_email(email_title, detail)
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
45
46
47
48
49
50
51
52
53
54
55

# 发送带附件的邮件

以下实例你需要修改:发件人邮箱(你的 QQ 邮箱),密码,收件人邮箱(可发给自己)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# ----- 需要修改的参数 -----
# email相关
sender = 'fedbook@qq.com'
password = '******'
smtp_server = 'smtp.qq.com'
smtp_port = 465
receivers = ['recever1@163.com', 'recever2@qq.com']
# ------------------------


def send_email(subject, detail, attach_list):
    now_time = time.strftime('%Y-%m-%d %H:%M:%S')
    mail_msg = """
    时间:{now_time}
    详情:{detail}
    """.format(subject=subject, now_time=now_time, detail=detail)

    # 创建一个带附件的实例
    msg = MIMEMultipart()
    # msg = MIMEText(mail_msg, 'plain', 'utf-8')
    msg['From'] = Header('fedbook汇报人 <%s>' % sender, 'utf-8')
    msg['To'] = Header('fedbook订阅者', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')

    # 邮件正文内容
    msg.attach(MIMEText(mail_msg, 'plain', 'utf-8'))
    # 构造附件,传送指定目录下的文件
    for att_path in attach_list:
        att = MIMEText(open(att_path, 'rb').read(), 'base64', 'utf-8')
        att["Content-Type"] = 'application/octet-stream'
        # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
        att["Content-Disposition"] = 'attachment; filename={filename}'.format(filename=att_path)
        msg.attach(att)

    try:
        smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
        # smtp.set_debuglevel(1)    # 打印和SMTP服务器交互的所有信息
        smtp.login(sender, password)
        smtp.sendmail(sender, receivers, msg.as_string())
        smtp.quit()
        print('邮件发送成功')
    except smtplib.SMTPException as e:
        print('Error: 无法发送邮件')
        print(e)


if __name__ == "__main__":
    email_title = 'Python SMTP 带附件邮件测试'
    detail = """
    欢迎访问:wenyuan.github.io
    这里是 WENYUAN 的学习小册,记录前端学习的知识体系。
    附件是网站源码,请查收。
    """
    attach_list = ['send_email.py', 'README.md']
    send_email(email_title, detail, attach_list)
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

# 总结

以上就是通过 Python SMTP 发送邮件的代码示例,一般情况下是够用了。还有一些图片 email 等特殊邮件,因为需要考虑到兼容性问题,有些邮箱默认不显示图片,个人感觉不太常用,就不整理了。

# 参考资料

(完)