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求解水仙花数的方法
May 11 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
python解析xml简单示例
Jun 21 Python
python 猴子补丁(monkey patch)
Jun 26 Python
pycharm新建一个python工程步骤
Jul 16 Python
python调用c++返回带成员指针的类指针实例
Dec 12 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
python爬虫用mongodb的理由
Jul 28 Python
深入浅析Python代码规范性检测
Jul 31 Python
如何完美的建立一个python项目
Oct 09 Python
发工资啦!教你用Python实现邮箱自动群发工资条
May 10 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
PHP5 安装方法
2006/10/09 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
ie浏览器使用js导出网页到excel并打印
2014/03/11 Javascript
jquery选择器使用详解
2014/04/08 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
js使用generator函数同步执行ajax任务
2017/09/05 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
Vue实现日历小插件
2019/06/26 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
js页面加载后执行的几种方式小结
2020/01/30 Javascript
Python栈类实例分析
2015/06/15 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
Python理解递归的方法总结
2019/01/28 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
优秀党员申报材料
2014/12/18 职场文书
春秋淹城导游词
2015/02/11 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
python接口测试返回数据为字典取值方式
2022/02/12 Python
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏
Java数据结构之堆(优先队列)
2022/05/20 Java/Android