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中内置的日志模块logging用法详解
Jul 12 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
详解Python 切片语法
Jun 10 Python
一行python实现树形结构的方法
Aug 09 Python
Django异步任务线程池实现原理
Dec 17 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
Python基于内置函数type创建新类型
Oct 22 Python
Python类型转换的魔术方法详解
Dec 23 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
python基础之模块的导入
Oct 24 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中header设置常见文件类型的content-type
2015/06/23 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
javascript 命名规则 变量命名规则
2010/02/25 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
如何在Python中编写并发程序
2016/02/27 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
pandas值替换方法
2018/07/10 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
python实现字典嵌套列表取值
2019/12/16 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
大四学生毕业自荐信
2013/11/07 职场文书
数学专业毕业生自荐信
2013/11/10 职场文书
企划专员岗位职责
2013/12/09 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
房地产项目合作意向书
2015/05/08 职场文书
撤诉书怎么写
2015/05/19 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android