IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python SMTP邮件发送详解 -> 正文阅读

[Python知识库]Python SMTP邮件发送详解

一、前言

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplibemail两个模块

  • 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类与邮件系统进行交互。使用方法如下:

  1. 实例化一个SMTP对象:
    server = smtplib.SMTP(邮件服务地址,端口号) # 正常连接,可配合server.starttls() 使用
    server = smtplib.SMTP_SSL(邮件服务地址,端口号) # 使用SSL连接

  2. 登陆邮件,权限验证:
    server.login(用户名,密码)

  3. 发送邮件:
    server.sendmail(发件人邮箱,收件人邮箱,发送内容)

  4. 断开连接:
    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())  # 邮件发送
    server.quit()  # 断开smtp连接
    print('发送成功')
except Exception:
    print('发送失败')

五、友好的邮件名和邮件主题问题

邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把FromToSubject添加到MIMEText中,才是一封完整的邮件。

1)email.utils.parseaddr(address)

2)email.utils.formataddr((name_encoded_by_Header, address))

写邮件的时候,Email的地址可以有两种写法。
一种写法是:xxx@qq.com,另一种写法是:name<xxx@qq.com>。
用前者写法,在邮箱中就会显示为xxx<xxx@qq.com>;
用后者,就会显示为name<xxx@qq.com>,更为清晰、专业。 
【有的时候,用前者写法也会显示name,是因为对方邮箱中保存了这个地址,类似于对方手机中保存了手机号和姓名。】
而parseaddr函数就是将str “name<xxx@qq.com>”转换成一个tuple。
from email.header import Header
from email.utils import formataddr, parseaddr
# 编写一个进行地址解析、生成标准地址格式的函数
def _format_address(s):
    name, address = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), address))
from_address = 'xxxxxxxxxx@qq.com'  # 邮件发件人
password = 'xxxxxxxx'  # 密码或邮箱授权码
to_address = 'xxxxxxxxxx@qq.com'  # 邮件收件人
subject = 'Python 邮件测试'  # 邮件主题
content = '这是使用python smtplib+email自动发送的邮件'  # 邮件正文

msg['Subject'] = subject # 邮件主题
msg['From'] = _format_address(u'Python发送<%s>' % from_address)
msg['TO'] = _format_address(u'Name<%s>' % to_address)

六、发送HTML邮件

import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.utils import formataddr, parseaddr


# 编写一个进行地址解析、生成标准地址格式的函数
def _format_address(s):
    name, address = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), address))


# 基本信息定义
smtp_server = 'smtp.qq.com'  # smtp服务器
port = 25  # SMTP协议默认端口为25

from_address = 'xxxxxxxxxx@qq.com'  # 邮件发件人
password = 'xxxxxxxx'  # 密码或邮箱授权码
to_address = 'xxxxxxxxxx@qq.com'  # 邮件收件人

subject = 'Python 发送HTML邮件'  # 邮件主题
content = """
    <p>Python 发送HTML邮件</p>
    <p><a href="http://www.baidu.com">多学习</a></p>
"""  # 邮件正文(HTML格式)

# 构建邮件
msg = MIMEText(content, 'html', 'utf-8')  # 构建一个MIMEText,type为html
msg['Subject'] = subject # 邮件主题
msg['From'] = _format_address(u'Python发送<%s>' % from_address)
msg['TO'] = _format_address(u'Name<%s>' % to_address)

# 发送邮件
try:
    server = smtplib.SMTP(smtp_server, port)
    # server.set_debuglevel(1)  # 打印出和SMTP服务器交互的所有信息,如果没有这一语句,将不打印任何信息
    server.login(from_address, password)  # 邮箱账户登录校验
    server.starttls()  # 启动安全传输模式
    server.sendmail(from_address, to_address, msg.as_string())  # 邮件发送
    server.quit()  # 断开smtp连接
    print('发送成功')
except Exception:
    print('发送失败')

HTML中包含图片

from email.mime.image import MIMEImage

# 添加图片
def addIMG(src, img_id):
    img = open(src, 'rb')  # 以rb的方式读取img文件
    msgImage = MIMEImage(img.read())	 # 构建MIMEImage
    img.close()	 # 关闭连接
    msgImage.add_header('Content-ID', img_id)  # 指定图片文件的Content-ID,<img>标签src用到
    return msgImage


msg = MIMEMultipart()

# 添加图片到正文
html = MIMEText('''
    <h1>Hello</h1>
    <p><img src="cid:0"></p>
    <p><img src="cid:2"></p>
''', 'html', 'utf-8')
msg.attach(html)
msg.attach(addIMG("./1.jpg", "0"))  # 0与HTML中的cid的对应
msg.attach(addIMG("./2.jpg", "2"))  # 2与HTML中的cid的对应
import smtplib
from email.header import Header
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formataddr, parseaddr


# 编写一个进行地址解析、生成标准地址格式的函数
def _format_address(s):
    name, address = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), address))

# 添加一个MIMEImage
def addIMG(src, img_id):
    img = open(src, 'rb')
    msgImage = MIMEImage(img.read())
    img.close()
    msgImage.add_header('Content-ID', img_id)  # 指定图片文件的Content-ID,<img>标签src用到
    return msgImage

# 基本信息定义
smtp_server = 'smtp.qq.com'  # smtp服务器
port = 25  # SMTP协议默认端口为25

from_address = '1531143881@qq.com'  # 邮件发件人
password = 'keupinibydesjhgi'  # 密码或邮箱授权码
to_address = '2303066448@qq.com'  # 邮件收件人

subject = 'Python 发送带附件的邮件'  # 邮件主题
content = """
    <p>Python 发送HTML邮件</p>
    <p><a href="http://www.baidu.com">多学习</a></p>
"""  # 邮件正文(HTML格式)

# 创建一个实例
msg = MIMEMultipart()
msg['Subject'] = subject # 邮件主题
msg['From'] = _format_address(u'Python发送<%s>' % from_address)
msg['TO'] = _format_address(u'Name<%s>' % to_address)

# 添加图片到正文
html = MIMEText('''
    <h1>Hello</h1>
    <p><img src="cid:0"></p>
    <p><img src="cid:2"></p>
''', 'html', 'utf-8')
msg.attach(html)
msg.attach(addIMG("./1.jpg", "0"))  # 0与HTML中的cid的对应
msg.attach(addIMG("./2.jpg", "2"))  # 2与HTML中的cid的对应

# 发送邮件
try:
    server = smtplib.SMTP(smtp_server, port)
    # server.set_debuglevel(1)  # 打印出和SMTP服务器交互的所有信息,如果没有这一语句,将不打印任何信息
    server.login(from_address, password)  # 邮箱账户登录校验
    server.starttls()  # 启动安全传输模式
    server.sendmail(from_address, to_address, msg.as_string())  # 邮件发送
    server.quit()  # 断开smtp连接
    print('发送成功')
except Exception:
    print('发送失败')

七、发送附件

import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formataddr, parseaddr


# 编写一个进行地址解析、生成标准地址格式的函数
def _format_address(s):
    name, address = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), address))


# 基本信息定义
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 = """
    <p>Python 发送HTML邮件</p>
    <p><a href="http://www.baidu.com">多学习</a></p>
"""  # 邮件正文(HTML格式)

# 创建一个附件实例

msg = MIMEMultipart()
msg['Subject'] = subject # 邮件主题
msg['From'] = _format_address(u'Python发送<%s>' % from_address)
msg['TO'] = _format_address(u'Name<%s>' % to_address)

# 构造附件1
path = "./1.jpg"
att1 = MIMEText(open(path, 'rb').read(), 'base64', 'utf-8') # rb以二进制方式读取
att1['Content-Type'] = 'application/octet-stream'
# filename为附件名称,可任意写,如下图片附件在邮件中的名称将显示为scenery.jpg
att1["Content-Disposition"] = 'attachment; filename="%s"' % "scenery1.jpg"
msg.attach(att1)  # 将附件添加到MIMEMultipart中


# 构造附件2
path = "./2.jpg"
att2 = MIMEText(open(path, 'rb').read(), 'base64', 'utf-8') # rb以二进制方式读取
att2['Content-Type'] = 'application/octet-stream'
# filename为附件名称,可任意写,如下图片附件在邮件中的名称将显示为scenery.jpg
att2["Content-Disposition"] = 'attachment; filename="%s"' % "scenery2.jpg"
msg.attach(att2)  # 将附件添加到MIMEMultipart中


# 发送邮件
try:
    server = smtplib.SMTP(smtp_server, port)
    # server.set_debuglevel(1)  # 打印出和SMTP服务器交互的所有信息,如果没有这一语句,将不打印任何信息
    server.login(from_address, password)  # 邮箱账户登录校验
    server.starttls()  # 启动安全传输模式
    server.sendmail(from_address, to_address, msg.as_string())  # 邮件发送
    server.quit()  # 断开smtp连接
    print('发送成功')
except Exception:
    print('发送失败')

八、多个收件人

# [to_address]表示可以有多个收件人。多个收件人,传入list。
# 当然,也可以在前面to_address处直接用list进行赋值,那么此处就不是传入[to_address],而是传入to_address了
server.sendmail(from_address, [to_address], msg.as_string())  # 邮件发送

九、发送一个包含HTML(带图片)+ 附件的邮件

import smtplib
from email.header import Header
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formataddr, parseaddr


# 编写一个进行地址解析、生成标准地址格式的函数
def _format_address(s):
    name, address = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), address))


# 添加一个MIMEImage
def addIMG(src, img_id):
    img = open(src, 'rb')
    msgImage = MIMEImage(img.read())
    img.close()
    msgImage.add_header('Content-ID', img_id)  # 指定图片文件的Content-ID,<img>标签src用到
    return msgImage


# 添加一个附件
def add_attachment(src,filename):
    att = MIMEText(open(src, 'rb').read(), 'base64', 'utf-8')  # rb以二进制方式读取
    att['Content-Type'] = 'application/octet-stream'
    att["Content-Disposition"] = 'attachment; filename="%s"' % filename
    return att


# 基本信息定义
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 = """
    <p>Python 发送HTML邮件</p>
    <p><a href="http://www.baidu.com">多学习</a></p>
"""  # 邮件正文(HTML格式)

# 创建一个附件实例

msg = MIMEMultipart()
msg['Subject'] = subject # 邮件主题
msg['From'] = _format_address(u'Python发送<%s>' % from_address)
msg['TO'] = _format_address(u'Name<%s>' % to_address)


# 添加图片到正文
html = MIMEText('''
    <div style="width:200px">
        <h1>Hello</h1>
        <p><img style="width:100%" src="cid:0"></p>
        <p><img style="width:100%" src="cid:2"></p>
    </div>
''', 'html', 'utf-8')
msg.attach(html)
msg.attach(addIMG("./1.jpg", "0"))  # 0与HTML中的cid的对应
msg.attach(addIMG("./2.jpg", "2"))  # 2与HTML中的cid的对应


# # 构造附件1
# 添加附件1
att1 = add_attachment('./1.jpg', "1.jpg")
msg.attach(att1)
# 添加附件2
att2 = add_attachment('./2.jpg', "2.jpg")
msg.attach(att2)  # 将附件添加到MIMEMultipart中
# 添加附件3
att3 = add_attachment('./dome.xlsx', "dome.xlsx")
msg.attach(att3)  # 将附件添加到MIMEMultipart中

# 发送邮件
try:
    server = smtplib.SMTP(smtp_server, port)
    # server.set_debuglevel(1)  # 打印出和SMTP服务器交互的所有信息,如果没有这一语句,将不打印任何信息
    server.login(from_address, password)  # 邮箱账户登录校验
    server.starttls()  # 启动安全传输模式
    server.sendmail(from_address, to_address, msg.as_string())  # 邮件发送
    server.quit()  # 断开smtp连接
    print('发送成功')
except Exception:
    print('发送失败')

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 10:46:25  更:2021-08-02 10:46:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 9:30:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码