18. python smtplib 发送电子邮件模块
18. python smtplib 发送电子邮件模块
18.1 了解SMTP 基础
-
SMTP 协议:
- 用于发送邮件的应用层协议,默认端口为
25
(非加密)或465
(SSL/TLS加密)。 - 常用邮件服务提供商的 SMTP 服务器地址:
- Gmail:
smtp.gmail.com
(端口 587 或 465) - QQ邮箱:
smtp.qq.com
(端口 465) - 其他服务商需查询对应文档。
- Gmail:
- 用于发送邮件的应用层协议,默认端口为
-
smtplib 核心类:
-
smtplib.SMTP
: 用于普通连接(非加密),默认端口是25。- smtplib.SMTP(HOST, PORT)
-
smtplib.SMTP_SSL
: 用于 SSL/TLS 加密连接,使用25号端口有一个问题,就是保密性不够好,数据都是明文传输,没有加密。 现在一般都推荐使用SSL,Secure Socket Layer,465是默认的SMTP over SSL的端口号。- smtplib.SMTP_SSL(HOST, PORT)
-
-
设置邮件内容:
- 邮件内容可以通过
MIMEText
或MIMEMultipart
来构建。MIMEText
用于纯文本或 HTML 邮件,而MIMEMultipart
用于包含附件或多种内容的邮件。
-
登录邮箱和授权码:
- server.login(username, password)
-
发送邮件:
- server.sendmail()
18.2 基本使用案例(发送纯文本邮件)
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
# 邮件服务器配置
HOST = "smtp.163.com"
PORT = 25 # 使用 SSL 端口
SUBJECT = "这是一个测试邮件"
FROM = "1111111@163.com" #负责发件的邮箱
TO = "2222222@qq.com,22222222@163.com" #接收邮件的邮箱,可以指定多个地址
text = "使用 Python 发送的邮件"
# 构建邮件内容
msg = MIMEText(text, "plain", "utf-8")
msg["From"] = FROM
msg["To"] = TO
msg["Subject"] = SUBJECT
# 发送邮件
try:
server = smtplib.SMTP(HOST, PORT) # 使用 SSL 连接
server.login(FROM, "your_token") # 填写授权码,发件者的邮箱授权码
server.sendmail(FROM, [TO], msg.as_string())
server.quit()
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败:{e}")
18.3 email对象类型
from email.header import Header # 用来对Email标题进行编码
from email.mime.text import MIMEText # 负责构造文本
from email.mime.image import MIMEImage # 负责构造图片
from email.mine.multiprt import MIMEMultipart # 负责将多个对象集合起来
from email.mime.base import MIMEBase # 添加附件的时候用到
from email.mime.application import MIMEApplication #用于包含多种附件多种内容的邮件
Header对附件编码
image.add_header('Content-Disposition','attachment',filename ="图片.png")这句话是必须要的
参数说明:
- Content-Disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件
- Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名
Content-Disposition属性有两种类型:inline 和 attachment
- inline :将文件内容直接显示在页面
- attachment:弹出对话框让用户下载
MIMEText文本对象
class email.mime.text.MIMEText(_text[, _subtype[, _charset]]):MIME文本对象
参数说明:
_text是邮件内容,
_subtype是邮件类型,可以是text/plain(普通文本邮件),html/plain(html邮件),
_charset是编码,可以是gb2312等等,一般是utf-8
MIMEImage图片附件
file1 = '/tmp/image.png'
MIMEImage(open(file1,'rb').read())
发送带附件邮件
注意事项:
image.add_header('Content-Disposition','attachment',filename ="图片.png")
这句话是必须要的
- Content-Disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件
- Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名
Content-Disposition属性有两种类型:inline 和 attachment
- inline :将文件内容直接显示在页面
- attachment:弹出对话框让用户下载
发送带图片邮件
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 邮件服务器配置
HOST = "smtp.163.com"
PORT = 25 # 使用 SSL 端口
SUBJECT = "这是一个测试邮件"
FROM = "222222@163.com" #负责发件的邮箱
TO = "11111111@qq.com,2222222@163.com" #接收邮件的邮箱,可以指定多个地址
text = "使用 Python 发送的邮件"
msg = MIMEMultipart()
# 构建图片
msg["From"] = FROM
msg["To"] = TO
msg["Subject"] = SUBJECT
txt = MIMEText(text, "plain", "utf-8")
msg.attach(txt)
#在字符串前加上 r,这样 Python 会将字符串视为原始字符串,不会对反斜杠进行转义处理
file1 = r'c:\Users\101202012006\Desktop\企业微信截图_20250227111508.png'
image = MIMEImage(open(file1,'rb').read())
image.add_header('Content-Disposition','inline',filename = "图片.png")# 加上必要的头信息,解决中文附件名乱码
image.add_header('Content-ID','<0>')
msg.attach(image)
try:
server = smtplib.SMTP(HOST,PORT)
server.login(FROM, "your_token")
server.sendmail(FROM,TO.split(","),msg.as_string())
server.quit()
print('邮件发送成功')
except Exception as e:
print('邮件发送失败:{e}')
发送带抄送邮件人的邮件
- 用
msg['Cc']
来装抄送列表。注意sendmail
的第2个参数,这个参数是一个所有收件人的 list(列表),收件人和抄送人都在一个list里面。如果想添加多个Cc地址,在Msg['Cc']中用逗号将地址隔开,并且所有的地址都要在sendmail的第2个参数中
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮件服务器配置
HOST = "smtp.163.com"
PORT = 25 # 使用 SSL 端口
SUBJECT = Header("这是一个测试邮件",'utf-8').encode()
FROM = "2222222@163.com" #负责发件的邮箱
TO = "11111111@qq.com,222222@163.com" #接收邮件的邮箱,可以指定多个地址
Cc = "22222222@163.com" #msg['Cc']来装抄送人的邮件列表
text = "使用 Python 发送的邮件"
# 构建邮件内容
msg = MIMEText(text, "plain", "utf-8")
msg["From"] = FROM
msg["To"] = TO
msg['Cc'] = Cc
msg["Subject"] = SUBJECT
# 发送邮件
try:
server = smtplib.SMTP(HOST, PORT) # 使用 SSL 连接
server.login(FROM, "your_token") # 填写授权码,发件者的邮箱授权码
server.sendmail(FROM, msg['TO'].split(','), msg.as_string())
server.quit()
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败:{e}")
发送多附件邮件
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 邮件服务器配置
HOST = "smtp.163.com"
PORT = 25 # 使用 SSL 端口
SUBJECT = "这是一个测试邮件"
FROM = "222222@163.com" #负责发件的邮箱
TO = "111111111@qq.com,2222222@163.com" #接收邮件的邮箱,可以指定多个地址
text = "使用 Python 发送的邮件"
msg = MIMEMultipart()
# 构建图片
msg["From"] = FROM
msg["To"] = TO
msg["Subject"] = SUBJECT
txt = MIMEText(text, "plain", "utf-8")
msg.attach(txt)
#在字符串前加上 r,这样 Python 会将字符串视为原始字符串,不会对反斜杠进行转义处理
file1 = r'c:\Users\101202012006\Desktop\企业微信截图_20250227111508.png'
image = MIMEImage(open(file1,'rb').read())
image.add_header('Content-Disposition','inline',filename = "图片.png")# 加上必要的头信息,解决中文附件名乱码
image.add_header('Content-ID','<0>')
msg.attach(image)
#xlsx类型附件
part = MIMEApplication(open(r'./file/foo.xlsx','rb').read())
part.add_header('Content-Disposition', 'attachment', filename="foo.xlsx")
msg.attach(part)
#pdf类型附件
part = MIMEApplication(open(r'./file/foo.pdf','rb').read())
part.add_header('Content-Disposition', 'attachment', filename="foo.pdf")
msg.attach(part)
try:
server = smtplib.SMTP(HOST,PORT)
server.login(FROM, "your_token") #改成你的邮件授权码
server.sendmail(FROM,TO.split(","),msg.as_string())
server.quit()
print('邮件发送成功')
except Exception as e:
print('邮件发送失败:{e}')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通