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的正则表达式re模块的常用方法
Mar 09 Python
从零学Python之hello world
May 21 Python
python读取txt文件中特定位置字符的方法
Dec 24 Python
Python XlsxWriter模块Chart类用法实例分析
Mar 11 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
Python中的list与tuple集合区别解析
Oct 12 Python
python matplotlib拟合直线的实现
Nov 19 Python
wxpython多线程防假死与线程间传递消息实例详解
Dec 13 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
详解Python类和对象内容
Jun 22 Python
python的变量和简单数字类型详解
Sep 15 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
无线电的诞生过程
2021/03/01 无线电
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
第五章 php数组操作
2011/12/30 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
动态表格Table类的实现
2009/08/26 Javascript
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
使用Vue写一个datepicker的示例
2018/01/27 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
es6中new.target的作用和使用场景简单示例分析
2020/03/14 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
Python中处理时间的几种方法小结
2015/04/09 Python
简单谈谈Python流程控制语句
2016/12/04 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
维稳工作情况汇报
2014/10/27 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
python如何进行基准测试
2021/04/26 Python
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
基于PyQt5制作一个群发邮件工具
2022/04/08 Python
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers