一、前言
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplib
和email
两个模块
email
构造邮件smtplib
发送邮件
二、模块安装
1. smtplib
smtplib不能直接使用pip install smtplib
通常发送邮件用PyEmail,所以直接pip install PyEmail就行
PyEmail (0.0.1) - Python library to send emails using SMTPLIB library
micropython-smtplib (0.0.0) - Dummy smtplib module for MicroPython
personal (0.1.1) - Easy, secure self notification via email and sms, using smtplib and twilio
aiosmtplib (0.1.4) - asyncio version of smtplib
secure-smtplib (0.1.1) - Secure SMTP subclasses for Python 2
mailclient (0.2.0) - Simplified use of smtplib for Python. Easy email sending.
smtplibaio (1.0.3) - An async version of smtplib
easyemail (0.4.0) - Simple lib abstracting email sending with smtplib.
2. email
pip install emails
三、模块使用简介
1. smtplib模块:
主要通过SMTP类与邮件系统进行交互。使用方法如下:
-
实例化一个SMTP对象:
server = smtplib.SMTP(邮件服务地址,端口号) # 正常连接,可配合server.starttls() 使用
server = smtplib.SMTP_SSL(邮件服务地址,端口号) # 使用SSL连接 -
登陆邮件,权限验证:
server.login(用户名,密码) -
发送邮件:
server.sendmail(发件人邮箱,收件人邮箱,发送内容) -
断开连接:
server.quit()
server = smtplib.SMTP(smtp_server, port) # 设置服务器和端口号
server.starttls() # 启动安全传输模式
server.login(from_address, password) # 邮箱账户登录校验
server.set_debuglevel(1) # 打印出和SMTP服务器交互的所有信息,如果没有这一语句,将不打印任何信息
# 1. msg.as_string()把MIMEText对象变成str(包含utf-8编码信息和Base64编码)
# 2. [to_addr]表示可以有多个收件人。多个收件人,传入list。当然,也可以在前面to_addr处直接用list进行赋值,那么此处就不是传入[to_addr],而是传入to_addr了
server.sendmail(From, To, msg.as_string()) # 邮件发送
server.quit() # 断开smtp连接
2. email模块:
email模块:支持发送的邮件内容为纯文本、HTML内容、图片、附件。
email模块中有几大类来针对不同的邮件内容形式,常用如下:
-
MIMEText:(MIME媒体类型)内容为纯文本、HTML页面。
-
MIMEImage:内容为图片。
-
MIMEMultupart:可包含文本和附件。
每一类对应的导入方式:
from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart
2.1 MIMEText (文件 or HTML)
MIMEText(msg,type,chartset)
# 纯文本邮件
MIMEText('文本', 'plain', 'utf-8')
# HTML邮件
MIMEText('HTML字符串', 'html', 'utf-8')
msg :文本内容
type :文本类型默认为plain(纯文本),HTML类型为html(type为html时msg也要是html的格式)
chartset: 文本编码,通常使用utf-8
构造TEXT格式的消息
msg = MIMEText("hello.text","plain","utf-8") # 构造Text消息
msg["Subject"] = "xxxxx"
msg["From"] = "xxxx"
msg["To"] = "xxxx"
发送以上构造的邮件内容要使用as_string将构造的邮件内容转换为string形式。
server.sendmail(From,To,msg.as_string)
2.2 MIMEImage、MIMEMultipart:
msg = MIMEMultipart()
# 实例化一个文本对象
msg_sub = MIMEText("hello.text","plain","utf-8")
# 将text消息添加到MIMEMultipart中,作为邮件正文。
msg.attach(msg_sub)
#图片作为附件
img = open(path,"rb").read() # 以rb方式打开并读取图片
msg_img = MIMEImage(img)
# 添加头部信息
msg_img.add_header('Content-Disposition','attachment', filename = "xxxx.png" )
msg_img.add_header('Content-ID','<0>')
#将图片添加到MIMEMultiplart中,作为附件发送。
msg.attach(mag_img)
四、发送纯本文邮件
import smtplib
from email.mime.text import MIMEText
# 基本信息定义
smtp_server = 'smtp.qq.com' # smtp服务器
port = 25 # SMTP协议默认端口为25
from_address = 'xxxxxxxxxx@qq.com' # 邮件发件人
password = 'xxxxxxxx' # 密码或邮箱授权码
to_address = 'xxxxxxxxxx@qq.com' # 邮件收件人
subject = 'Python 邮件测试' # 邮件主题
content = '这是使用python smtplib+email自动发送的邮件' # 邮件正文
# 构建邮件
msg = MIMEText(content, 'plain', 'utf-8') # 构建一个MIMEText
msg['Subject'] = subject
msg['From'] = from_address
msg['TO'] = to_address
# 发送邮件
try:
server = smtplib.SMTP(smtp_server, port)
server.starttls() # 启动安全传输模式
# server.set_debuglevel(1) # 打印出和SMTP服务器交互的所有信息,如果没有这一语句,将不打印任何信息
server.login(from_address, password) # 邮箱账户登录校验
server.sendmail(from_address, to_address, msg.as_string()