使用python发送邮件

前言

在使用python发送邮件通常用到两个标准模块smtplibemail模块
smtplib 模块主要负责发送邮件,功能包括但不限于:连接邮箱服务器、登录邮箱,发送邮件。你可以理解为一个邮递员的角色
email模块主要负责构造邮件,功能包括但不限于:创建一个电子邮件,解析一个电子邮件。你可以理解为这个包可以将你的邮件打包。然后就可以交给smtplib(邮递员)发出去了

准备工作

首先需要两个邮箱用来收发邮件
首先进入发件邮箱的网页,下面以QQ邮箱为例
第一二步骤的操作

先点上面第一第二步骤,然后找到下面这里点击开启服务,像我下面图一样。

在这里插入图片描述

通过验证以后,会得到下面这样的授权码,授权码等于在python中的密码,要保存以下,并且不能告诉其他人哦~

在这里插入图片描述

最后一部是找到发件邮箱的STMP服务器地址和端口号,各个邮箱均不相同,QQ邮箱的路径是:
右上角“账号与安全”->“安全设置”->“ 配置 SMTP/IMAP 方法”找到下图
在这里插入图片描述
到这里为止我们的准备工作就完成了。

Python语法部分

第一步我们要先创建一封邮件,那么我们需要知道一封邮件都包括哪些部分
在这里插入图片描述
Subject:主题
From:来自谁,发送者对自己的昵称,可以随便
To:发送者,对接收者的昵称,可以随便
context:类似实体邮件的内部的内容,包括但不限于:文本,附件,链接。

Email创建邮件

示例代码和注释如下:

from email.message import EmailMessage

# 创建邮件对象
msg = EmailMessage() #定义一个邮件的实例

# 设置发件人、收件人和主题
msg['From'] = 'sender@example.com' # 来自谁,发送者对自己的昵称,可以随便
msg['To'] = 'recipient@example.com' # 发送者对接收者的昵称,可以随便
msg['Subject'] = '我是主题' # 这是邮件的主题

# 添加正文内容
msg.set_content('我是正文') # 类似实体邮件的内部的内容,可以添加文件、文本等,但是只能添加一个,想要有多种类的,请向下看

set_content()是添加邮件的正文,建议写文本哦,如果重复执行会覆盖之前的内容哦。
msg['From'] 这里虽然可以随便写,但是部分邮箱会有自己的要求,QQ邮箱要求这里需要遵循RFC2047,RFC822协议,具体的我也不懂,可以参考这里那么我们可以使用下述代码来解决这个问题

#这个方法是用来将提交的内容来格式化邮件地址,符合上述协议
from email.utils import formataddr
msg['From'] = formataddr(["昵称", '发件人的邮箱']) #注意,这里的昵称可以有中文。
# 发件人的邮箱需要真实,不可以乱写我不懂为什么,但是确实试出来是这样的。
# 添加excel文件
with open(r"C:\Users\DELL\Desktop\abcd.xlsx", 'rb') as f:
    file_data = f.read()

msg.add_attachment(file_data, maintype='application', subtype='octet-stream', filename='ccdd.xlsx')
# 添加pdf文件
with open(r"C:\Users\DELL\Desktop\2024-02-26_171157.pdf", 'rb') as f:
    file_data = f.read()

msg.add_attachment(file_data, maintype='application', subtype='octet-stream', filename='eedd.pdf')

这里先使用with open将本地文件读到file_data变量中,然后再将附件添加进邮件中

add_attachment() 方法是用来向邮件消息中添加附件的,可以多次添加
参数解析
maintype:指定附件的主类型,默认为 "application"
subtype指定附件的子类型,默认为 "octet-stream"
filename:指定附件的文件名,这里需要写正确的文件后缀。

在 add_attachment() 方法中,常见的 subtype 选项取决于 maintype 类型,例如:
如果 maintype 是 “text”(文本),那么 subtype 可以是 “plain”(表示普通文本)或者 “html”(表示 HTML 格式的文本)。
如果 maintype 是 “image”(图片),那么 subtype 可以是 “jpeg”、“png”、“gif” 等图片格式的标识符。
如果 maintype 是 “audio”(音频),那么 subtype 可以是 “mpeg”、“wav”、“ogg” 等音频格式的标识符。
如果 maintype 是 “application”(应用文件),那么 subtype 可以是 “pdf”、“msword”、“zip” 等应用程序相关的标识符。
实际上 subtype 可以是任何有效的 MIME 子类型。根据具体的需求和附件的内容类型,可以选择合适的 subtype 类型来描述你的附件。
“application”是MIME主类型,表示该附件是一个应用程序文件。
”octet-stream“是MIME子类型,表示该附件是一个二进制数据流,没有特定的格式或结构。
因此,maintype='application’和subtype='octet-stream’的组合表示该附件是一个通用的二进制文件,没有特定的格式或结构。这种MIME类型通常用于传输任意类型的文件,例如文档、图片、音频等

除了述参数,还有一些可选参数可用于更详细地定义附件。以下是一些常用的可选参数:
charset:指定附件的字符编码。
description:指定附件的描述信息。
transfer_encoding:指定附件的传输编码方式,默认为 “base64”。
content_type:指定附件的完整内容类型。如果同时指定了 maintype 和 subtype,则该参数会自动计算。

#添加HTML格式的邮件正文
msg.add_alternative('<h1>HTML 邮件正文</h1>', subtype='html')

add_alternative方法用于向邮件对象中添加替代的正文内容。
在电子邮件中,有时会需要发送富文本格式的内容,如HTML,以提供更好的视觉效果和格式化选项。然而,并非所有的邮件客户端都支持HTML格式的邮件,有些只能显示纯文本内容。为了确保所有收件人都能接收到邮件内容,可以同时发送纯文本和HTML两种格式的邮件正文。
add_alternative方法就是用来添加这样一种替代内容的。当你使用这个方法添加了替代正文后,邮件客户端会根据自身的能力选择显示哪种格式的内容。如果客户端支持HTML,那么它会显示HTML格式的内容;如果不支持,就会显示纯文本内容。
具体来说,add_alternative方法接受一个MIMEText或MIMEBase对象作为参数,这个对象包含了要添加的替代正文内容。你可以先创建一个纯文本的MIMEText对象,然后使用add_alternative方法添加一个HTML格式的MIMEText对象,从而提供两种格式的正文内容。
这种方法的好处是提高了邮件的兼容性,确保不同邮件客户端的用户都能阅读邮件内容。

smtplib 模块连接服务器发送邮件

示例代码和注释如下:

import smtplib

# 设置发件人邮箱和密码
sender = 'XXXXXXXXXX@qq.com' #这里填写发件人的邮箱
password = 'XXXXXX' #这里填写前言部分获得的授权码,部分邮箱是使用的邮箱的密码

#设置发件邮箱的地址和端口号
host = 'smtp.qq.com' #前言部分获得的邮箱的服务器地址只是举例
port = 465 #服务器地址对应的端口号
# 设置收件人邮箱
receivers = ["XXXXXXXXXX@qq.com"] #这里是收件人地址,是个列表也可以填一个字符串

# 连接 SMTP 服务器
smtp_server = smtplib.SMTP_SSL(host, port) #这一步就是python连接邮箱服务器的步骤

# 登录邮箱
smtp_server.login(sender , password) #这里就是通过服务器使用发件人的账号密码来登陆发件人的邮箱

# 发送邮件
smtp_server.sendmail(sender , receivers , msg.as_string()) # 这里分别传入发件邮箱,收件邮箱,以及邮件
# 断开连接
smtp_server.quit() #既然用代码连接了服务器,那么就在使用完毕断开连接,当然也可以使用with函数。

msg.as_string()用于将消息对象转换为表示邮件内容的字符串。它返回一个包含整个邮件内容的字符串,这个字符串可以直接传递给 sendmail() 方法发送邮件。

smtplib 模块常用的类有两个smtplib.SMTP_SSLsmtplib.SMTP
这两个模块是很相似的模块,区别就是smtplib.SMTP_SSL在连接的时候就进行了SSL加密
你需要知道我们在和服务器交互的时候需要进行加密来保护我们的数据安全,常用的加密方式有SSL(Secure Sockets Layer) TLS(Transport Layer Security)smtplib.SMTP是没有进行加密直连的,所以一般需要下面这样
因为有些邮箱提供商没有SSL功能,所以需要smtplib.SMTP

# smtplib.SMTP 功能示例
smtplib.SMTP('smtp.qq.com', 465) # 这里的用法和上述smtplib.SMTP_SSL 是一样的,在这里还是没有进行加密的
server.starttls() #需要增加这一步来开启TLS加密
server.login(sender, password) #后续都一样

完整代码

附上参考链接

ChatGPT
python-email
python-smtplib
讯飞星火AI大模型
Python 标准包 email
Python SMTP发送邮件-smtplib模块
Python smtplib的详细介绍
python发送邮件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值