基于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实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
神经网络python源码分享
Dec 15 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
Python3中关于cookie的创建与保存
Oct 21 Python
python正则表达式去除两个特殊字符间的内容方法
Dec 24 Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 Python
Python如何绘制日历图和热力图
Aug 07 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
python字典进行运算原理及实例分享
Aug 02 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
2014/06/09 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
javascript控制台详解
2015/06/25 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
在windows系统中实现python3安装lxml
2016/03/23 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
JAVA软件工程师测试题
2014/07/25 面试题
《听鱼说话》教学反思
2014/02/15 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
十佳党员事迹材料
2014/08/28 职场文书
出租车拒载检讨书
2015/01/28 职场文书
男方婚前保证书
2015/02/28 职场文书
2015年资料员工作总结
2015/04/25 职场文书
《迟到》教学反思
2016/02/24 职场文书