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

 更新时间:2020年06月02日 09:07:58   作者:郑静174  
这篇文章主要介绍了基于python实现自动发送邮件教程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

最近工作中的一个项目需要自动发送一些信息邮件到指定邮箱的需求,那么如何实现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()


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

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

好了,目标完成。

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

相关文章

  • python字符串与url编码的转换实例

    python字符串与url编码的转换实例

    今天小编就为大家分享一篇python字符串与url编码的转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python爬虫动态IP代理使用及防止被封的方法

    Python爬虫动态IP代理使用及防止被封的方法

    在进行网络爬虫时,经常会遇到网站的反爬机制,其中之一就是通过IP封禁来限制爬虫的访问,为了规避这种限制,使用动态IP代理是一种有效的方法,本文将介绍在Python爬虫中如何使用动态IP代理,以及一些防止被封的方法,文中有详细的代码讲解,需要的朋友可以参考下
    2023-11-11
  • Python利用字典树实现猎词游戏

    Python利用字典树实现猎词游戏

    猎词(word hunt)是一类很常见的游戏,给你一张字母组成的表,然后让你在这些字母中尽可能多的去寻找单词。这类游戏用字典树就能轻松完成,本文就来具体讲讲实现步骤,需要的可以参考一下
    2022-06-06
  • Python实现批量识别银行卡号码以及自动写入Excel表格步骤详解

    Python实现批量识别银行卡号码以及自动写入Excel表格步骤详解

    这篇文章主要介绍了使用Python实现高效摸鱼,批量识别银行卡号码并且自动写入Excel表格,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Python实现的扫码工具居然这么好用!

    Python实现的扫码工具居然这么好用!

    二维码作为一种信息传递的工具在当今社会发挥了重要作用.从手机用户登录到手机支付,生活的各个角落都能看到二维码的存在.那你知道二维码是怎么解析的吗?有想过自己实现一个扫码工具吗?如果想的话就继续看下去吧!需要的朋友可以参考下
    2021-06-06
  • python 合并多个excel中同名的sheet

    python 合并多个excel中同名的sheet

    这篇文章主要介绍了python 如何合并多个excel中同名的sheet,帮助大家更好的利用python处理excel表格,感兴趣的朋友可以了解下
    2021-01-01
  • Python实现贪吃蛇小游戏(单人模式)

    Python实现贪吃蛇小游戏(单人模式)

    这篇文章主要为大家详细介绍了Python实现单人模式的贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python实现E-Mail收集插件实例教程

    Python实现E-Mail收集插件实例教程

    这篇文章主要给大家介绍了关于Python实现E-Mail收集插件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2019-02-02
  • Python用requests库爬取返回为空的解决办法

    Python用requests库爬取返回为空的解决办法

    这篇文章主要介绍了Python用requests库爬取返回为空的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • django实现web接口 python3模拟Post请求方式

    django实现web接口 python3模拟Post请求方式

    今天小编就为大家分享一篇django实现web接口 python3模拟Post请求方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11

最新评论