【Python基础】SMTP发送邮件

Python使用SMTP发送邮件。

一、准备

1. 开启邮箱的SMTP 服务

  这里使用第三方 SMTP 服务发送邮件,可以使用 QQ邮箱,163,Gmail 等的 SMTP 服务,但需要做以下配置,以QQ邮箱为例。
  登录QQ邮箱,依次点击最上方的 设置,然后点击 账户
qq_smtp_setting_1.png
  往下翻页,找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 这一版块,开启 POP3/SMTP服务。(不同版本的QQ可能会不一样,总之就是找到QQ邮箱的“POP3/SMTP服务”开启按钮。)
qq_smtp_setting_2.png
  成功开启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邮箱SMTP服务器地址:smtp.qq.com,ssl端口:465。

1. 发送纯文本邮件

  以下实例你需要修改:发件人邮箱(你的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 = 'wenyuanblog@qq.com'
password = 'hjenixkwghseowyxnclh12yx8je9l2au'
smtp_server = 'smtp.qq.com'
smtp_port = 465
receivers = ['recever1@163.com', 'recever1@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('wenyuanblog汇报人 <%s>' % sender, 'utf-8')
    msg['To'] = Header('wenyuanblog订阅者', '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 = """
    欢迎访问:www.wenyuanblog.com
    这里是我的博客站点,专注于Python、前端和机器学习技术的分享。
    """
    send_email(email_title, detail)

2. 发送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 = 'wenyuanblog@qq.com'
password = 'hjenixkwghseowyxnclh12yx8je9l2au'
smtp_server = 'smtp.qq.com'
smtp_port = 465
receivers = ['recever1@163.com', 'recever1@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('wenyuanblog汇报人 <%s>' % sender, 'utf-8')
    msg['To'] = Header('wenyuanblog订阅者', '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://www.wenyuanblog.com" target="_blank">www.wenyuanblog.com</a></div>
    <div style='margin-bottom:5px'>这里是我的博客站点,专注于Python、前端和机器学习技术的分享。</div>
    """
    send_email(email_title, detail)

2. 发送带附件的邮件

  以下实例你需要修改:发件人邮箱(你的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 = 'wenyuanblog@qq.com'
password = 'hjenixkwghseowyxnclh12yx8je9l2au'
smtp_server = 'smtp.qq.com'
smtp_port = 465
receivers = ['recever1@163.com', 'recever1@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('wenyuanblog汇报人 <%s>' % sender, 'utf-8')
    msg['To'] = Header('wenyuanblog订阅者', '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 = """
    欢迎访问:www.wenyuanblog.com
    这里是我的博客站点,专注于Python、前端和机器学习技术的分享。
    附件是网站源码,请查收。
    """
    attach_list = ['send_email.py', 'README.md']
    send_email(email_title, detail, attach_list)

三、总结

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


  目录