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读写配置文件的方法
Jun 03 Python
深入理解Python中装饰器的用法
Jun 28 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
python MySQLdb使用教程详解
Mar 20 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
python3.6编写的单元测试示例
Aug 17 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
Django ORM 查询表中某列字段值的方法
Apr 30 Python
Python实现画图软件功能方法详解
Jul 28 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 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 Session生命周期介绍
2010/03/02 PHP
php SQL Injection with MySQL
2011/02/27 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
jquery的键盘事件修改代码
2011/02/24 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
Django中的session用法详解
2020/03/09 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
365 Tickets英国:全球景点门票
2019/07/06 全球购物
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
汽车检测与维修专业求职信
2013/10/30 职场文书
积极贯彻学习两会精神总结
2014/03/17 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
装修公司管理制度
2015/08/05 职场文书