python关于邮件发送包smtplib的实践分享

  最近在编写接口自动化测试平台,其中用到了自动发送邮件的功能,查询相关资料,最成熟、使用量最大的还是smtplib库,调试过程中也遇到了一些坑,现在做些简单整理:
  调试的邮件发送功能基于SMTP(Simple Mail Transfer Protocol,SMTP)协议,用SMTP把电子邮件从一台主机传送到另一台主机,发电子邮件时,必须要连接到一个外部SMTP服务器,此时邮件程序是一个SMTP客户端。而SMTP服务器也因此成为消息的第一站。

  smtplib模块和需要实例话的smtplib.SMTP类,整个传输过程:

  1. 连接到服务器
  2. 登录
  3. 发送服务请求
  4. 退出

  登录是可选的,只有在服务器启用了SMTP身份验证(SMTP-AUTH)时才需要登录。SMTP通信时需要一个端口,默认端口号是25(另外的SMTP_SLL类,作用类似SMTP,默认端口号是465)。该类中核心方法只需要两个sendmail()和quit()。下表列出了SMTP对象常用的方法:

方法 描述
sendmail() 将msg从from发送至to,还可以选择性地设置ESMTP邮件(mopts)和收件人(ropts)选项
ehlo()或者helo() 使用EHLO或HELO初始化SMTP或ESMTP服务器的会话。这是可选的,因为sendmail()会在需要时自动调用相关内容
starttls() 让服务器启用TLS模式。如果给定参数,则用它们来创建安全socket
set_debuglevel() 为服务器通信设置调试级别
quit() 关闭连接,并退出
login() 使用用户名和密码登录SMTP服务器

一个小demo:

 1 import smtplib
 2 
 3 # 连接服务器
 4 conn = smtplib.SMTP("smtp.qq.com", 25)
 5 # 登录邮箱
 6 conn.login("xxxx@qq.com", "qq邮箱授权码")
 7 # 发送邮件
 8 conn.sendmail("from发件人邮箱", “to收件人邮箱”, “内容”)
 9 # 退出邮箱
10 conn.quit()

以上能实现调通邮箱,但是收到的邮件内容展示为空,因为没有设置邮件主题,内容,附件等信息,这个时候就要用到另一个模块来处理邮件信息了,即email。

关于email包,可自行百度,以下是调试demo:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

# **************邮箱配置信息*****************
fromAddr = "发件人邮箱地址"
fromPWD = "发件人邮箱密码"
toAddr = "收件人邮箱地址"
emailMsg = "邮件文本内容"

# 1. 连接邮箱服务器
con = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登录邮箱
con.login(fromAddr, fromPWD)

# 2. 准备数据
# 创建邮件对象
msg = MIMEMultipart()
# 设置邮件主题
subject = Header('邮件主题', 'utf-8').encode()
msg['Subject'] = subject
# 设置邮件发送者
msg['From'] = fromAddr
# 设置邮件接受者
msg['To'] = toAddr
# 添加文字内容
text = MIMEText(emailMsg, 'plain', 'utf-8')
msg.attach(text)

3.发送邮件
con.sendmail(fromAddr, toAddr, msg.as_string())

4.退出登录,断开连接
con.quit()

有些邮箱可能有除了账号密码外的其他验证信息,比如QQ邮箱需要验证授权码,密码处改为授权码即可;还有确保邮箱开启了smtp服务,一般在邮箱设置中开启。

以上内容供参考。

 

原文地址:https://www.cnblogs.com/marvintester/p/14460550.html