• python:利用smtplib模块发送邮件


    自动化测试中,测试报告一般都需要发送给相关的人员,比较有效的一个方法是每次执行完测试用例后,将测试报告(HTML、截图、附件)通过邮件方式发送。

    参考代码:send_mail.py

    一、python对SMTP的支持

    SMTP(Simple Mail Transfer Protocol)是简单传输协议,它是一组用于用于由源地址到目的地址的邮件传输规则。

    python中对SMTP进行了简单的封装,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

    1、python对SMTP的支持

    ①email模块:负责构建邮件

    ②smtplib模块:负责发送邮件

    可以通过help()方法查看SMTP提供的方法:

     1 >>> from smtplib import SMTP
     2 >>> help(SMTP)
     3 Help on class SMTP in module smtplib:
     4 
     5 class SMTP(builtins.object)
     6  |  This class manages a connection to an SMTP or ESMTP server.
     7  |  SMTP Objects:
     8  |      SMTP objects have the following attributes:
     9  |          helo_resp
    10  |              This is the message given by the server in response to the
    11  |              most recent HELO command.
    12  |  
    13  |          ehlo_resp
    14  |              This is the message given by the server in response to the
    15  |              most recent EHLO command. This is usually multiline.
    16  |  
    17  |          does_esmtp
    18  |              This is a True value _after you do an EHLO command_, if the
    19  |              server supports ESMTP.
    20 | ......

     导入SMTP,查看对象注释。。。。。。

    2、sendmail()方法的使用说明

    ①connect(host,port)方法参数说明

      host:指定连接的邮箱服务器

      port:指定连接的服务器端口

    ②login(user,password)方法参数说明

      user:登录邮箱用户名

      password:登录邮箱密码

    ③sendmail(from-addr,to_addrs,msg...)方法参数说明

      from_addr:邮件发送者地址

      to_addrs:字符串列表,邮件发送地址

      msg:发送消息

    ④quit():结束当前会话

    二、发送不同格式的邮件

    1、纯文本格式的邮件

     1 # coding=utf-8
     2 import smtplib
     3 from email.mime.text import MIMEText
     4 # 发送纯文本格式的邮件
     5 msg = MIMEText('hello,send by python_test...','plain','utf-8')
     6 #发送邮箱地址
     7 sender = 'sender@163.com'
     8 #邮箱授权码,非登陆密码
     9 password = '123456'
    10 #收件箱地址
    11 receiver = 'receiver@qq.com'
    12 #smtp服务器
    13 smtp_server = 'smtp.163.com'
    14 #发送邮箱地址
    15 msg['From'] = sender
    16 #收件箱地址
    17 msg['To'] = receiver
    18 #主题
    19 msg['Subject'] = 'from IMYalost'
    20 server = smtplib.SMTP(smtp_server,25)
    21 
    22 server.login(sender,password)
    23 server.sendmail(sender,receiver,msg.as_string())
    24 server.quit()

    login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str。

    为了方便演示,这里用的是163和QQ邮箱,收到的邮件内容如下:

    2、HTML格式的邮件

    如果想发送HTML类型的邮件,只需要下面的一段代码即可:

    1 # coding=utf-8
    2 import smtplib
    3 from email.mime.text import MIMEText
    4 # 发送HTML格式的邮件
    5 msg = MIMEText('<html><h1>人生苦短,我用python</html></h1>','html','utf-8')

    收到的邮件内容如下:

    PS:注意这里的区别,msg中输入的是邮件正文,因此需要根据具体内容格式选择合适的类型!

    关于不同类型文件的对应类型,可参考此链接:HTTP Content-type 对照表

    3、邮件格式的关系

    构造一个邮件对象就是一个message对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片;

    要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

    1 Message
    2 +- MIMEBase
    3    +- MIMEMultipart
    4    +- MIMENonMultipart
    5       +- MIMEMessage
    6       +- MIMEText
    7       +- MIMEImage

    可以通过email.mime文档查看它们所在的包以及详细的用法。

    三、SMTP发送邮件之坑

    1、协议之坑

    因为采用的是SMTP协议,那么需要确保自己的发送优邮箱地址开启了SMTP服务,否则,会报错

    2、password之坑

    看了很多例子,都是将邮箱登录密码设置为password,然后就华丽丽的懵逼了,报错!!!whf!!!

    事实的真相是:password需要输入邮箱授权码,而非邮箱登录密码!!!

    3、各种报错

    我在调试的时候,遇到很多的报错,大多都是这些:smtplib.SMTPDataError(553/554...)

    根据报错里面的链接:see http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html,找到对应的问题,仔细检查代码,慢慢debug吧。。。

    PS:如果收件邮箱的传输经过加密,必须经过SSL加密再STMP传输,出现554(发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件),发生了一件有趣的事情:

        网易邮箱的处理结果是发生回退,即邮件发送失败,转回了收件箱。。。

        QQ邮箱的处理结果,是将邮件放进垃圾邮件里面。。。

    总结:发生报错的原因还是技术不到家,不够细心啊,唉,年轻人。。。

    附:常用的邮箱服务器(POP3、SMTP)地址、端口

    利用python对SMTP的内置封装支持,发送邮件的代码和注意事项基本就是以上几点,当然,其中的代码都是demo,具体实践过程还需要根据实际情况做调整。。。

        

  • 相关阅读:
    装饰器和迭代器
    闭包函数
    函数对象
    Python函数
    函数的基本使用
    文件处理
    量化策略
    Android--生命周期
    算法转AI平台工程师记录-0
    python3.6安装
  • 原文地址:https://www.cnblogs.com/imyalost/p/7383901.html
Copyright © 2020-2023  润新知