基于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实现测试磁盘性能的方法
Mar 12 Python
python以环状形式组合排列图片并输出的方法
Mar 17 Python
Python验证企业工商注册码
Oct 25 Python
Django 前后台的数据传递的方法
Aug 08 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
Python探索之SocketServer详解
Oct 28 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
零基础小白多久能学会python
Jun 22 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
Dec 27 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
PHP 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
帝国cms常用标签汇总
2015/07/06 PHP
利用php生成验证码
2017/02/23 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
JavaScript 验证码的实例代码(附效果图)
2013/03/22 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
javascript修改图片src的方法
2015/01/27 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
JavaScript取得gridview中获取checkbox选中的值
2017/07/24 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
Django Path转换器自定义及正则代码实例
2020/05/29 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
canvas使用注意点总结
2013/07/19 HTML / CSS
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
"序列点" 是什么
2016/07/29 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
五年级英语教学反思
2014/01/31 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
上甘岭观后感
2015/06/10 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL