• 用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邮箱为例):

    好了,目标完成。

  • 相关阅读:
    怎么自定义修改CnBlogs博客园主题模板css样式
    前端怎么避免无效的请求,减轻服务器负载
    360浏览器奇葩问题:非得打开一次控制台才能登录(try catch finally 用法)
    react中<br/>不换行、多个&nbsp;只显示一个空格的问题 dangerouslySetInnerHTML
    webpack压缩文件错误:ERROR in bundle.js from UglifyJs
    webpack css单独打包 及extract-text-webpack-plugin插件
    css如何引入第三方字体
    计数排序
    接口
    抽象方法和抽象类
  • 原文地址:https://www.cnblogs.com/mysqlanzhuang/p/12994783.html
Copyright © 2020-2023  润新知