Python 发送邮件方法总结


Posted in Python onAugust 10, 2020

1. 前言

邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到

我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本、富文本、HTML 等格式的邮件

本文将聊聊利用 Python 发送邮件的 3 种方式

2. 准备

以 126 邮箱为例,在编码之前,我们需要开启 SMTP 服务

Python 发送邮件方法总结

然后,手动新增一个授权码

其中,账号、授权码和服务器地址用于连接登录邮箱服务器

3. 方式一:smtplib

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()

4. 方式二:zmail

Zmail 项目创建目的是,使邮件处理变得更简单

使用 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)

5. 方式三:yagmail

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()

6. 最后

上面总结了 Python 发送邮件的 3 种方式,实际项目中,更推荐使用后两种方式。

以上就是Python 发送邮件方法总结的详细内容,更多关于Python 发送邮件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用PYTHON创建XML文档
Mar 01 Python
Python中Collection的使用小技巧
Aug 18 Python
python根据给定文件返回文件名和扩展名的方法
Mar 27 Python
用Python中的wxPython实现最基本的浏览器功能
Apr 14 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python3+PyQt5泛型委托详解
Apr 24 Python
Python将多个list合并为1个list的方法
Jun 27 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
使用python制作一个解压缩软件
Nov 13 Python
python 爬取B站原视频的实例代码
Sep 09 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
python playwright 自动等待和断言详解
Nov 27 Python
Python getattr()函数使用方法代码实例
Aug 10 #Python
Python matplotlib模块及柱状图用法解析
Aug 10 #Python
Python如何操作docker redis过程解析
Aug 10 #Python
基于Python实现下载网易音乐代码实例
Aug 10 #Python
Python grequests模块使用场景及代码实例
Aug 10 #Python
基于Python pyecharts实现多种图例代码解析
Aug 10 #Python
Python Celery异步任务队列使用方法解析
Aug 10 #Python
You might like
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
javascript插入样式实现代码
2012/02/22 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
Python3遍历目录树实现方法
2015/05/22 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
python实现五子棋小游戏
2020/03/25 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
python实现机器人卡牌
2019/10/06 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
在keras里实现自定义上采样层
2020/06/28 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
Python操作Excel的学习笔记
2021/02/18 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
DataReader和DataSet的异同
2014/12/31 面试题
linux面试题参考答案(11)
2012/05/01 面试题
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
函授教育个人学习的自我评价
2013/12/31 职场文书
批评与自我批评材料
2014/02/15 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
《刷子李》教学反思
2016/02/20 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技