本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html
SMTP是一种用于发送电子邮件的协议,Python从2.3版本开始内置了对SMTP的支持。Python的SMTP支持主要依赖于smtplib
和email
两个模块。其中,email模块负责构建邮件内容,包括邮件头部信息和正文部分;而smtplib模块则负责发送邮件,通过它我们可以连接到SMTP服务器,并发送邮件。
本文以QQ邮箱为例,介绍如何使用Python发送不同类型的邮件。
- smtplib模块是Python标准库中的一个模块,用于发送电子邮件。它提供了一个简单的接口,可以用来连接到邮件服务器并发送电子邮件。通过smtplib模块,你可以轻松地创建和发送包含文本或附件的电子邮件。
- smtplib模块的主要功能包括连接到邮件服务器、发送邮件、设置邮件主题、收件人、抄送、密送等信息。它还支持使用SMTP身份验证来发送邮件,并可以处理各种邮件服务器的不同设置和要求。
- 在使用smtplib模块发送邮件时,你需要提供邮件服务器的地址、端口号,以及可能的登录凭据等信息。一旦连接到邮件服务器,你可以使用smtplib模块提供的方法来构建和发送邮件。
Python 3.x 版本中,smtplib模块已经包含在标准库中,无需额外安装,你可以在Python脚本中直接导入smtplib模块并开始使用:
import smtplib
SMTP类是Python的smtplib模块中的一个重要类,它提供了与SMTP服务器进行交互的方法和功能。
smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
参数说明:
host: 可选参数,表示SMTP服务器的主机名。如果未提供此参数,将使用默认的本地主机名来连接 SMTP 服务器。
port: 可选参数,表示SMTP服务器的端口号。如果未提供此参数,将使用标准的 SMTP 端口号 25。
local_hostname: 可选参数,用于标识客户端的主机名。通常情况下,你不需要提供这个参数,SMTP 类会尝试自动确定本地主机名。
timeout: 可选参数,表示连接超时时间,以秒为单位。如果未提供此参数,将使用默认的超时时间。
这些参数用于初始化 SMTP 连接,当你实例化 SMTP 对象时,可以根据需要传递这些参数来连接到指定的 SMTP 服务器。
下面是SMTP类的基本定义和一些常用方法:
class SMTP:
def __init__(self, host='', port=0, local_hostname=None, timeout=None, source_address=None):
"""
初始化SMTP连接
:param host: SMTP服务器的主机名
:param port: SMTP服务器的端口号
:param local_hostname: 本地主机名
:param timeout: 连接超时时间
:param source_address: 发送源地址
"""
def connect(self, host='localhost', port=0):
"""
连接到SMTP服务器
:param host: SMTP服务器的主机名
:param port: SMTP服务器的端口号
"""
def starttls(self, keyfile=None, certfile=None, context=None):
"""
将连接升级为TLS加密连接
:param keyfile: 私钥文件
:param certfile: 证书文件
:param context: SSL上下文
"""
def login(self, user, password, initial_response_ok=True):
"""
登录到SMTP服务器
:param user: 用户名
:param password: 密码
:param initial_response_ok: 初始响应是否OK
"""
def sendmail(self, from_addr, to_addrs, msg, mail_options=[], rcpt_options=[]):
"""
发送邮件
:param from_addr: 发件人地址
:param to_addrs: 收件人地址列表
:param msg: 邮件内容
:param mail_options: 邮件选项
:param rcpt_options: 接收选项
"""
def quit(self):
"""
退出SMTP会话
"""
以上是SMTP类的一些基本方法的定义。通过实例化SMTP类并调用这些方法,你可以连接到SMTP服务器,发送邮件,登录到服务器,将连接升级为TLS加密连接,并退出SMTP会话等。这些方法为你提供了与SMTP服务器进行交互的基本功能,使得你可以使用Python的smtplib模块来发送电子邮件。
Python的email模块是用于处理电子邮件的标准库模块,它提供了一系列的类和方法,用于创建、解析、操作和发送电子邮件。通过email模块,你可以轻松地构建各种类型的邮件,包括纯文本邮件、HTML邮件、带附件的邮件等。
在Python中,email模块提供了一些常用的类来处理邮件的构建和解析。以下是一些常用的类及其功能说明:
email.message.Message
类:
email.mime.text.MIMEText
类:
email.mime.multipart.MIMEMultipart
类:
email.mime.image.MIMEImage
类:
email.mime.audio.MIMEAudio
类:
这些类可以帮助我们在Python中构建和解析各种类型的邮件,包括纯文本邮件、HTML邮件以及带附件的邮件。通过使用这些类,我们可以更加灵活地处理邮件消息的构建和解析。
这里咱们用QQ邮箱用做测试,QQ邮箱需要先获取授权码,其他邮箱貌似不需要
2、点击账号:
3、往下翻,找到并开启 POP3/SMTP
服务 和 IMAP/SMTP
服务:
4、点击获取授权码(获取后记得复制):
代码步骤说明:
案例代码(注意下面代码需要更改发件人邮箱、授权码和收件人邮箱):
import smtplib # 导入smtplib模块
from email.message import EmailMessage # 从email.message模块导入EmailMessage类
# 1、设置发件人邮箱和授权码
sender_email = '发件人邮箱' # 发件人邮箱地址
sender_password = '授权码' # 邮箱SMTP的授权码(看上文获取)
# 2、设置收件人邮箱
recipient_email = '收件人邮箱' # 这里我设置的收发人都是我自己
# 3、创建邮件内容
message = EmailMessage() # 创建EmailMessage对象
message['From'] = sender_email # 设置发件人
message['To'] = recipient_email # 设置收件人
message['subject'] = "Python发送邮箱测试标题信息" # 设置标题信息
body = "Python发送邮箱测试正文内容" # 正文内容
message.set_content(body) # 设置邮件正文内容
# 4、连接到SMTP服务器
server = smtplib.SMTP('smtp.qq.com', 25) # 使用QQ邮箱的SMTP服务器,端口号为25
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password) # 登录邮箱
# 5、发送邮件
server.sendmail(sender_email, recipient_email, message.as_string())
# 6、关闭连接
server.quit()
案例代码(注意下面代码需要更改发件人邮箱、授权码、收件人邮箱和图片路径,如果不想要正文文字内容也可以注释掉):
import smtplib # 导入smtplib模块
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import os
# 1、设置发件人邮箱和授权码
sender_email = '发件人邮箱' # 发件人邮箱地址
sender_password = '授权码' # 邮箱SMTP的授权码(看上文获取)
# 2、设置收件人邮箱
recipient_email = '收件人邮箱' # 这里我设置的收发人都是我自己
# 3、创建邮件内容
message = MIMEMultipart() # 创建EmailMessage对象
message['From'] = sender_email # 设置发件人
message['To'] = recipient_email # 设置收件人
message['subject'] = "Python发送邮箱测试标题信息" # 设置标题信息
body = MIMEText("Python发送美女图片") # 正文内容
message.attach(body) # 设置邮件正文内容
# 添加图片附件
image_path = '1.png' # 图片文件路径
if os.path.exists(image_path):
with open(image_path, 'rb') as image_file:
image = MIMEImage(image_file.read(), name=os.path.basename(image_path))
message.attach(image)
# 4、连接到SMTP服务器
server = smtplib.SMTP('smtp.qq.com', 25) # 使用QQ邮箱的SMTP服务器,端口号为25
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password) # 登录邮箱
# 5、发送邮件
server.sendmail(sender_email, recipient_email, message.as_string())
# 6、关闭连接
server.quit()
运行结果,发送成功:
下面是我准备的文件:
案例代码(注意下面代码需要更改发件人邮箱、授权码、收件人邮箱和文件夹路径,如果不想要正文文字内容也可以注释掉):
import smtplib # 导入smtplib模块
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import os
# 1、设置发件人邮箱和授权码
sender_email = '发件人邮箱' # 发件人邮箱地址
sender_password = '授权码' # 邮箱SMTP的授权码(看上文获取)
# 2、设置收件人邮箱
recipient_email = '收件人邮箱' # 这里我设置的收发人都是我自己
# 3、创建邮件内容
message = MIMEMultipart() # 创建EmailMessage对象
message['From'] = sender_email # 设置发件人
message['To'] = recipient_email # 设置收件人
message['subject'] = "Python发送邮箱测试标题信息" # 设置标题信息
body = MIMEText("Python发送指定文件夹下所有内容") # 正文内容
message.attach(body) # 设置邮件正文内容
# 指定文件夹路径
folder_path = r'E:\Python3.10\测试文件夹' # 文件夹路径
# 遍历文件夹下所有文件
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
attachment = open(file_path, 'rb')
# 添加附件
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename= {filename}')
message.attach(part)
# 4、连接到SMTP服务器
server = smtplib.SMTP('smtp.qq.com', 25) # 使用QQ邮箱的SMTP服务器,端口号为25
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password) # 登录邮箱
# 5、发送邮件
server.sendmail(sender_email, recipient_email, message.as_string())
# 6、关闭连接
server.quit()
运行结果,收到了指定文件夹下所有内容: