Products
GG网络技术分享 2025-03-18 16:13 0
优质文章,第一时间送达!
邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到
我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本、富文本、HTML 等格式的邮件
本文将聊聊利用 Python 发送邮件的 3 种方式
以 126 邮箱为例,在编码之前,我们需要开启 SMTP 服务
然后,手动新增一个授权码
其中,账号、授权码和服务器地址用于连接登录邮箱服务器
smtplib是 Python 自带的依赖库,可以直接导入使用
首先,通过邮箱账号、授权码、邮箱服务器地址初始化一个 SMTP 实例,然后进行连接
def __init__(self):
# 初始化
self.smtp = smtplib.SMTP
# 连接邮箱服务器地址
self.smtp.connect(\'smtp.126.com\')
# 加入主题和附件,邮件体
self.email_body = MIMEMultipart(\'mixed\')
# 发件人地址及授权码
self.email_from_username = \'**@126.com\'
self.email_from_password = \'授权码\'
# 登录
self.smtp.login(self.email_from_username, self.email_from_password)
然后,将收件人列表、邮件标题、邮件正文内容、附件路径及附件文件名加入到上面定义的邮件体中
def generate_email_body(self, email_to_list, email_title, email_content, attchment_path, files):
\"\"\"
组成邮件体
:param email_to_list:收件人列表
:param email_title:邮件标题
:param email_content:邮件正文内容
:param attchment_path:附件的路径
:param files:附件文件名列表
:return:
\"\"\"
self.email_body[\'Subject\'] = email_title
self.email_body[\'From\'] = self.email_from_username
self.email_body[\'To\'] = \",\".join(email_to_list)
for file in files:
file_path = attchment_path + \'/\' + file
if os.path.isfile(file_path):
# 构建一个附件对象
att = MIMEText(open(file_path, \'rb\').read, \'base64\', \'utf-8\')
att[\"Content-Type\"] = \'application/octet-stream\'
att.add_header(\"Content-Disposition\", \"attachment\", filename=(\"gbk\", \"\", file))
self.email_body.attach(att)
text_plain = MIMEText(email_content, \'plain\', \'utf-8\')
self.email_body.attach(text_plain)
接着,就可以使用 SMTP 实例对象,将邮件发送出去
# 收件人列表
email_to_list = [\'收件人1地址\',\'收件人2地址\']
# 发送邮件
# 注意:此处必须同时指定发件人与收件人,否则会当作垃圾邮件处理掉
self.smtp.sendmail(self.email_from_username, email_to_list, self.email_body.as_string)
邮件发送完毕之后,退出服务即可
def exit(self):
\"\"\"
退出服务
:return:
\"\"\"
self.smtp.quit
使用 Zmail 发送接收邮件方便快捷,不需要手动添加服务器地址、端口以及适合的协议,可以轻松创建 MIME 对象和头文件
注意:Zmail 仅支持 Python3,不支持 Python2
首先,安装依赖库
# 安装依赖库
pip3 install zmail
然后,使用邮箱账号、授权码创建一个邮箱服务对象
class ZMailObject(object):
def__init__(self):
# 邮箱账号
self.username = \'**@126.com\'
# 邮箱授权码
self.authorization_code = \'授权码\'
# 构建一个邮箱服务对象
self.server = zmail.server(self.username, self.authorization_code)
接着,将邮件主题、邮件内容、包含的附件路径加入到一个字典中,组成邮件主体
# 邮件主体
mail_body = {
\'subject\': \'测试报告\',
\'content_text\': \'这是一个测试报告\', # 纯文本或者HTML内容
\'attachments\': [\'./attachments/report.png\'],
}
最后,将调用send_mail函数,将邮件发送出去即可
# 收件人
# 可以指定一个人,字符串;也可以是多个人,列表
mail_to = \"收件人1\"
# 发送邮件
self.server.send_mail(mail_to, mail_body)
yagmail 只需要几行代码,就能实现发送邮件的功能
相比 zmail,yagmail 实现发送邮件的方式更加简洁优雅
首先,安装依赖库
# 安装依赖库
pip3 install yagmail
然后,通过账号、授权码和服务器地址连接邮箱服务器,返回一个服务对象
import yagmail
# 连接服务器
# 用户名、授权码、服务器地址
yag_server = yagmail.SMTP(user=\'**@126.com\', password=\'授权码\', host=\'smtp.126.com\')
接着,通过 send 函数,将邮件发送出去
# 发送对象列表
email_to = [\'**@qq.com\', ]
email_title = \'测试报告\'
email_content = \"这是测试报告的具体内容\"
# 附件列表
email_attachments = [\'./attachments/report.png\', ]
# 发送邮件
yag_server.send(email_to, email_title, email_content, email_attachments)
邮件发送完毕之后,关闭连接即可
# 关闭连接
yag_server.close
上面总结了 Python 发送邮件的 3 种方式,实际项目中,更推荐使用后两种方式
回复下方「关键词」,获取优质资源
回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版
回复关键词「m」,立即获取Python精选优质文章合集
回复关键词「」,将数字替换成 0 及以上数字,有惊喜好礼哦~
题图:pexels,CC0 授权。
好文章,我在看❤️
一些主机不支持发送邮件功能,所以我们才用到了WP-Mail-SMTP插件,使用WP-Mail-SMTP插件后即可通过QQ、163、新浪等邮件服务器发送邮件。
通常WP-Mail-SMTP插件发信失败都是设置错误造成的,相关的教程网上很多,这里要说的是一个特殊案例。
我的一些插件使用了wp_mail函数发信,安装WP-Mail-SMTP插件前没有任何问题,但是使用主机发信100{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}进垃圾箱,我使用的是虚拟主机又没有权限修改相关配置,所以才安装了WP-Mail-SMTP插件。
今天发现邮件发送失败,读了一下WP-Mail-SMTP插件的代码,基本原理是这样的:
看上去没有任何问题,再看我的发信代码:
$headers[] = \\\'Content-Type: text/html; charset=UTF-8\\\';$headers[] = \\\'From: \\\' . $blogname . \\\' <\\\' . $adminemail . \\\'>\\\';wp_mail( $author_name . \\\' <\\\' . $author_email . \\\'>\\\', $mail_title, $mail_txt, $headers );
表面上看也没有问题,通过错误日志发现问题原因是From中的邮件地址与授权邮件地址不同,$adminemail取的是WordPress常规设置中邮件地址,而我插件中设置的邮件地址不同,把这两处的邮件地址设置成一样就解决了。
Demand feedback