基于python SMTP实现自动发送邮件教程解析


Posted in Python onJune 02, 2020

最近工作中的一个项目需要自动发送一些信息邮件到指定邮箱的需求,那么如何实现Python自动发送邮件的功能呢?接下来我们就来简单的介绍下如何利用Python来实现自动发送邮件的功能。

Python SMTP发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议 ,说白了就是发送邮件的协议,python的smplib库对SMTP协议进行了简单的封装,提供了对SMTP的支持,可以发送纯文本邮件、HTML文件以及带附件的邮件。

首先我们构建一个SendEmailManager类,也是遵循着面向对象编程的思想来做,大体结构如下:

class SendEmailManager(object):

  def __init__(self, **kwargs):
    # 初始化参数
    ...

  def _get_conf(self, key):
    # 获取配置参数
    ...

  def _init_conf(self):
    # 初始化配置参数
    ...

  def _login_email(self):
    # 登录邮箱服务器
    ...
  def _make_mail_msg(self):
    # 构建文本邮件对象
    ...

  def do_send_mail(self):
    # 邮件发送
    ...

def __init__(self, **kwargs)

类的初始化函数,可以用来设置对象属性,并给予初始值,可以是参数或者固定值 ,其中参数**kwargs是将一个可变的关键字参数的字典传给函数实参,这里里我们主要是对SMTP服务器(这里使用qq邮箱)、发送邮件的代理邮箱、在邮箱中设置的客户端授权密码、可变参数进行一些初始化。具体代码如下:

# SMTP服务器,这里使用qq邮箱,其他邮箱自行百度
EMAIL_HOST = 'smtp.qq.com'
# 发送邮件的代理邮箱
EMAIL_HOST_USER = 'xxxx@xxxx.com'
# 在邮箱中设置的客户端授权密码, 注意这里不是邮箱密码,如何获取邮箱授权码,请看本文最后教程
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxxxx'
def __init__(self, **kwargs):
  # 初始化参数
  self.email_host = EMAIL_HOST
  self.email_host_user = EMAIL_HOST_USER
  self.email_host_pass = EMAIL_HOST_PASSWORD
  self.kwargs = kwargs

def _get_conf(self, key)

主要负责通过key读取 可变参数self.kwargs 字典里的值,供其他函数使用。

def _get_conf(self, key):
  # 获取配置参数
  value = self.kwargs.get(key)
  if key != "attach_file_list" and (value is None or value == ''):
    raise Exception("configuration parameter '%s' cannot be empty" % key)
  return value

def _init_conf(self)

该函数主要负责初始化 函数_get_conf 返回的配置参数, 以便接下来的函数可以调用相关配置参数。

def _init_conf(self):
  # 初始化配置参数
  print(self._get_conf('receives'))
  self.receives = self._get_conf('receives')
  self.msg_subject = self._get_conf('msg_subject')
  self.msg_content = self._get_conf('msg_content')
  self.msg_from = self._get_conf('msg_from')
  # attachment
  self.attach_file_list = self._get_conf('attach_file_list')

def _login_email(self)

登录邮件服务器, 我这里登陆的是qq邮箱的服务器,端口号为465,其他邮箱端口号请自行百度,代码如下:

def _login_email(self):
  # 登录邮箱服务器
  try:
    server = smtplib.SMTP_SSL(self.email_host, port=465)
    # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
    server.set_debuglevel(1)
    # 登录邮箱
    server.login(self.email_host_user, self.email_host_pass)
    return server
  except Exception as e:
    print("mail login exception:", e)
    raise e

def _make_mail_msg(self)

该函数的功能为构建一个邮件实例对象,来处理邮件的内容。一封正常的邮件一般有收发件者信息,邮件主题,邮件正文,有些邮件还附带有附件,具体的设置参见如下代码:

def _make_mail_msg(self):
  # 构建邮件对象
  msg = MIMEMultipart()
  msg.attach(MIMEText(self.msg_content, 'plain', 'utf-8'))
  # 邮件主题
  msg['Subject'] = Header(self.msg_subject, "utf-8")
  # 发件人邮箱信息
  msg['From'] = "<%s>" % self.msg_from
  # msg['From'] = Header(self.msg_from + "<%s>" % self.email_host_user, "utf-8")
  msg['To'] = ",".join(self.receives)
  print("---", self.attach_file_list)
  if self.attach_file_list:
    for i, att in enumerate(self.attach_file_list):
      # 构造附件,传送当前目录下的文件
      if not att:
        break
      att_i = MIMEText(open(att, 'rb').read(), 'base64', 'utf-8')
      att_i["Content-Type"] = 'application/octet-stream'
      # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
      att_i["Content-Disposition"] = 'attachment; filename="%s"' % att
      msg.attach(att_i)
  return msg

def do_send_mail(self)

发送邮件,就是把上几个函数串起来,直接上代码:

def do_send_mail(self):
  # 邮件发送
  try:
    self._init_conf()
    server = self._login_email()
    msg = self._make_mail_msg()
    server.sendmail(self.email_host_user, self.receives, msg.as_string())
    server.close()
    print("发送成功!")
  except Exception as e:
    print("邮件发送异常", e)

配置参数,测试能否正常发送邮件:

if __name__ == "__main__":
  mail_conf = {
    'msg_from': 'xxxx@qq.com', # 邮件发送者的地址
    'receives': ['xxxx@qq.com', 'xxxxxxxx@xxxx.com', ], # 邮件接收者的地址,这是个list,因为邮件的接收者可能不止一个
    'msg_subject': 'Python 自动发送邮件测试!!', # 邮件的主题
    'msg_content': '人生苦短,我用python!!!', # 邮件的内容
    'attach_file_list': {"test_file1.py": "test.py", "test_file2.pem": "./public.pem"}, # 为附件文件路径列表,也是个list,也可没有这项
  }

  manager = SendEmailManager(**mail_conf)
  manager.do_send_mail()

基于python SMTP实现自动发送邮件教程解析

ok,发送成功,添加附件也是没问题的。

开始我们讲的获取客户端邮箱的授权码,教程如下(以qq邮箱为例):

基于python SMTP实现自动发送邮件教程解析

好了,目标完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编程语言的35个与众不同之处(语言特征和使用技巧)
Jul 07 Python
Python专用方法与迭代机制实例分析
Sep 15 Python
Python json模块使用实例
Apr 11 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
Pycharm之快速定位到某行快捷键的方法
Jan 20 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
python处理RSTP视频流过程解析
Jan 11 Python
python实现串口通信的示例代码
Feb 10 Python
基于FME使用Python过程图解
May 13 Python
浅析NumPy 切片和索引
Sep 02 Python
python 多线程中join()的作用
Oct 29 Python
python 实现性别识别
Nov 21 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
Jun 02 #Python
QML实现钟表效果
Jun 02 #Python
Pymysql实现往表中插入数据过程解析
Jun 02 #Python
Django全局启用登陆验证login_required的方法
Jun 02 #Python
python爬虫基础知识点整理
Jun 02 #Python
如何理解python面向对象编程
Jun 01 #Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 #Python
You might like
让PHP开发者事半功倍的十大技巧小结
2010/04/20 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
python多线程编程中的join函数使用心得
2014/09/02 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
python两种注释用法的示例
2020/10/09 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
Python页面加载的等待方式总结
2021/02/28 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
社会实践活动报告
2015/02/05 职场文书
班主任开场白
2015/06/01 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android