一、概述

python 提供了两个包来提供SMTP 邮件服务支持:smtplibemail ,前者系统内置,后者需要通过pip 或者其他方式手动安装。其中smtplib 提供邮件发送功能,email 负责邮件内容的构造。

二、smtplib库介绍

2.1 创建一个smtp连接对象

smtplib.SMTP(host, port)  # host是服务器地址,port是端口,连接成功将会返回一个stmp对象

或者

smtpObj = smtplib.SMTP()  # 创建一个空的smtp对象
smtpObj.connect(host, port)  # 连接服务

2.2 登录到smtp服务器

smtpObj.login(username, password)  # username是邮箱用户名,password是密码。

2.3 发送邮件

smtpObj.sendmail(from_addr, to_addrs, msg)  # from_addr是发件人,to_addr是收件人,msg是要发送的消息

发件人地址是一个列表,可以有多个收件人。

2.4 关闭邮箱对象

smtpObj.quit()

三、email库介绍

2.1 构造一封邮件

from email.mime.text import MIMEText
conent = MIMEText("HelloWorld", "plain", "utf-8")  # 构造一个文本类型的邮件对象

第一个参数是邮件的正文内容,第二个参数是文件的类型,plain 表示普通文本,第三个参数是编码格式,默认ascii编码。

如果需要发送html 格式的邮件,需要把第二个参数设置为html ,然后正文部分放传入网页的内容 。

2.2 设置收、发件人以及邮件主题

content["From"] = "abc@qq.com"  # 收件人
content["to"] = "bcd@qq.com"  # 发件人
content["Subject"] = "HelloWorld"  # 主题

如果含有中文,需要这样设置:

from email.header import Header
content["From"] = Header(MAIL_USER, "utf-8")  # 设置编码

2.3 添加附件

from email.mime.multipart import MIMEMultipart
content = MIMEMultipart()  # 构造一个包含多个部分(文本内容+附件内容)的邮件
file_part = MIMEText(open("test.txt", "r").read(), "base64", "utf-8")  
file_part["Content-Type"] = "application/octet-stream"
file_part["Content-Disposition"] = "attachment; filename="test.txt""  # text.txt是附件的名字
content.attach(file_part)

四、一封最简单的SMTP邮件

准备好一个SMTP服务器和邮箱帐号(没有的话可以利用163、QQ等第三方公司的),发送一封最简单的邮件:

# -*- encoding:utf8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
MAIL_SERVER = "****@**.com"  # smtp服务器地址
MAIL_PORT = 25  # smtp服务端口,一般为25
MAIL_USER = "****@**.com"  # 邮箱帐号
MAIL_PASS = "******"  # 邮箱密码
def send_normal_mail():
    try:
        mail_clients = ["maqian@dyxmq.cn"]
        msg = MIMEText("Hello QQ Mail", "plain", "utf-8")
        smtpObj = smtplib.SMTP(MAIL_SERVER, MAIL_PORT)
        smtpObj.login(MAIL_USER, MAIL_PASS)
        smtpObj.sendmail(MAIL_USER, mail_clients, msg.as_string())
        print "Send Mail To", mail_clients, "Success!"
    except Exception as e:
        print "Send Mail error:", e
if __name__ == "__main__":
    send_normal_mail()

如果各项参数没有设置错误的话邮件就会发送成功了,但是由于我们没有填写任何其他信息,邮件的收件人和主题都是空的:

五、使用QQ邮箱发送邮件

1. 获取QQ邮箱授权码

由于QQ邮箱的设置,登录第三方邮箱时不能直接使用QQ密码登录,需要申请一个授权码用来给第三方客户端登陆。

授权码的获取:

拿到授权码后,就可以使用qq邮箱帐号和授权码在第三方客户端登录了。

2. 使用QQ邮箱发送邮件

使用上面的代码,把所有的邮箱信息替换成QQ邮箱的,然后发送邮件。

MAIL_SERVER = "smtp.qq.com"
MAIL_PORT = 25
MAIL_USER = "*********@QQ.COM"
MAIL_PASS = "*******"  # 填入授权码不是QQ密码

结果会报错:

Send Mail error: (530, "Error: A secure connection is requiered(such as ssl). More information at http://service.mail.qq.com/cgi-bin/help?id=28")

出现这个问题的原因是QQ邮箱使用了SSL 加密传输,不能直接使用上面的方式发送邮件,要把smtp 对象的创建方式改为:

smtplib.SMTP_SSL(MAIL_SERVER, MAIL_PORT)

现在对上面的代码进行修改,添加上发件人和收件人信息,并修改SMTP端口为465

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
MAIL_SERVER = "smtp.qq.com"
MAIL_PORT = 465  # SSL的端口是465
MAIL_USER = "785271053@QQ.COM"
MAIL_PASS = "*******"
def send_normal_mail():
    try:
        mail_clients = ["maqian@dyxmq.cn"]
        msg = MIMEText("Hello QQ Mail", "plain", "utf-8")
        msg["From"] = MAIL_USER  # 显示的发件人
        msg["To"] = ", ".join(mail_clients)  # 显示的收件人
        msg["Subject"] = "QQ MAIL TEST"  # 显示的主题
        smtpObj = smtplib.SMTP_SSL(MAIL_SERVER, MAIL_PORT)
        smtpObj.login(MAIL_USER, MAIL_PASS)
        smtpObj.sendmail(MAIL_USER, mail_clients, msg.as_string())
        print "Send Mail To", mail_clients, "Success!"
    except Exception as e:
        print "Send Mail error:", e

发送成功:

3. 发送html格式邮件并携带附件

先创建一个test.txt 文件,写入数据HelloWorld ,在邮件中把它发出去。

# -*- encoding:utf8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
MAIL_SERVER = "smtp.qq.com"
MAIL_PORT = 465
MAIL_USER = "785271053@QQ.COM"
MAIL_PASS = "******"
def get_html_attach():
    """
    生成邮件的html页面部分
    :return: MIMEText对象
    """
    html = "<head><p><a href=http://www.dyxmq.cn>HelloWorld</a></p></head>"
    return MIMEText(html, "html", "utf-8")
def get_file_attach():
    """
    生成邮件的附件部分
    :return: MIMIText对象
    """
    file = MIMEText(open("test.txt", "r").read(), "base64", "utf-8")  # 读取文件
    file["Content-Type"] = "application/octet-stream"
    file["Content-Disposition"] = "attachment; filename="test.txt""
    return file
def send_mail():
    try:
        mail_clients = ["maqian@dyxmq.cn"]
        msg = MIMEMultipart()  # 添加邮件内容
                # 添加邮件头
        msg["From"] = MAIL_USER
        msg["To"] = ", ".join(mail_clients)
        msg["Subject"] = "QQ MAIL TEST"
                # 添加正文和文件
        msg.attach(get_html_attach())
        msg.attach(get_file_attach())
        #发送邮件
        smtpObj = smtplib.SMTP_SSL(MAIL_SERVER, MAIL_PORT)
        smtpObj.login(MAIL_USER, MAIL_PASS)
        smtpObj.sendmail(MAIL_USER, mail_clients, msg.as_string())
        print "Send Mail To", mail_clients, "Success!"
    except Exception as e:
        print "Send Mail error:", e
if __name__ == "__main__":
    send_mail()

邮件:

最后修改:2017 年 10 月 28 日
如果觉得我的文章对你有用,请随意赞赏