基于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 Django(图文)
Nov 04 Python
python继承和抽象类的实现方法
Jan 14 Python
Python多线程爬虫简单示例
Mar 04 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
使用python os模块复制文件到指定文件夹的方法
Aug 22 Python
opencv设置采集视频分辨率方式
Dec 10 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 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静态新闻列表自动生成代码
2007/06/14 PHP
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
javascript Excel操作知识点
2009/04/24 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
JS与C#编码解码
2013/12/03 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
js定时器实现倒计时效果
2017/11/05 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
vue实现全屏滚动效果(非fullpage.js)
2020/03/07 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
Vue3为什么这么快
2020/09/23 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
2019/06/11 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
老教师工作总结的自我评价
2013/09/27 职场文书
课外活动总结范文
2014/07/09 职场文书
青年志愿者活动方案
2014/08/17 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
tensorflow中的数据类型dtype用法说明
2021/05/26 Python