python - 发送邮件(smtplibemail)

Posted Wilson

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python - 发送邮件(smtplibemail)相关的知识,希望对你有一定的参考价值。

发送邮件(smtplib、email)

通常在API和UI自动化测试后,都需要将运行的测试报告发送给指定邮件组接收,这个邮件发送功能可以利用python自带的两个模块完成:

  smtplib模块主要负责发送邮件如:连接邮箱服务器,登录邮箱,发送邮件

  email模块主要负责构造邮件如:发件人,收件人,主题,正文,附件、图片、HTML等

一、smtplib

 1、smtplib示例:

import smtplib
# 实例化SMTP连接(IP,端口)
smtp = smtplib.SMTP_SSL(self.SMTP_server, 465)  # 使用ssL安全加密方式连接邮箱服务器
# smtp.connect(self.SMTP_server, 465)           # 使用connect非安全方式连接邮箱服务器
#登录(邮箱账号、密码)
smtp.login(self.username, self.password)
#发送邮件(发件者邮件、收件者邮箱/多个收件者邮箱用逗号隔开,as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str)
smtp.sendmail(self.sender, "[email protected]", msg.as_string())
#关闭SMTP连接
smtp.quit()

2、smtplib常用内置函数:

SMTP.set_debuglevel(level):#设置是否为调试模式。默认为False,

SMTP.connect([host[, port]]):#连接到指定的smtp服务器。参数分别表示smpt主机和端口。
# 默认是本机的25端口。也可以写成hostname:port的形式。

SMTP.docmd(cmd[, argstring]):#向smtp服务器发送指令。可选参数argstring表示指令的参数。

SMTP.helo([hostname]) :#使用"helo"指令向服务器确认身份。相当于告诉smtp服务器“我是谁”。

SMTP.has_extn(name):#判断指定名称在服务器邮件列表中是否存在。
 #出于安全考虑,smtp服务器往往屏蔽了该指令。

SMTP.verify(address) :#判断指定邮件地址是否在服务器中存在。
 #出于安全考虑,smtp服务器往往屏蔽了该指令。

SMTP.login(user, password) :#登陆到smtp服务器。

SMTP.sendmail(self, from_addr, to_addrs, msg, mail_options=[],
             rcpt_options=[]) :#发送邮件。

SMTP.quit() :#断开与smtp服务器的连接,相当于发送"quit"指令。

 

二、email

email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范,mime包常用的内置方法如下:

  MIMEmultipart类型有三种:

MIMEMultipart(‘mixed‘) # 邮件类型为"multipart/mixed"的邮件包含附件。向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。
MIMEMultipart(‘related‘) # 邮件类型为"multipart/related"的邮件正文中包括图片,声音等内嵌资源。
MIMEMultipart(‘alternative‘) # 邮件类型为"multipart/alternative"的邮件包括纯文本正文(text/plain)和超文本正文(text/html)。

  MIMEText:用于处理邮件中的HTML文本和text文本【纯文本正文(text/plain)和超文本正文(text/html)】;

  MIMEImage: 用于处理邮件中的图片图片

1、构建发件人、收件人、主题

from email.mime.multipart import MIMEMultipart    
from email.mime.text import MIMEText    
from email.mime.image import MIMEImage
msg = MIMEMultipart(‘mixed‘)
msg[‘Subject‘] = "邮件主题"
msg[‘From‘] = "发件人邮箱"
msg[‘To‘] = ‘收件人邮箱‘
msg[‘Date‘]=‘2012-3-16‘

注:

msg.add_header(_name,_value,**_params):添加邮件头字段。
msg.as_string():是将msg(MIMEText对象或者MIMEMultipart对象)变为str,如果只有一个html超文本正文或者plain普通文本正文的话,一般msg的类型可以是MIMEText;如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。
msg.attach(MIMEText对象或MIMEImage对象):将MIMEText对象或MIMEImage对象添加到MIMEMultipart对象中。MIMEMultipart对象代表邮件本身,MIMEText对象或MIMEImage对象代表邮件正文,通俗的讲就是将文本,HTML,附件,图片都何以添加到MIMEMultipart(‘mixed‘)中。

2、构建文本内容

text = "test,test!!!"    
text_plain = MIMEText(text,‘plain‘, ‘utf-8‘)    
msg.attach(text_plain)    

3、构建HTML内容

html = """
<html>  
  <head></head>  
  <body>  
    <p>Hi!<br>  
       test<br>  
       Here is the <a href="http://www.baidu.com">link</a> you wanted.<br> 
    </p> 
  </body>  
</html>  
"""    
text_html = MIMEText(html,‘html‘, ‘utf-8‘)
text_html["Content-Disposition"] = ‘attachment; filename="texthtml.html"‘   
msg.attach(text_html)  

4、构建图片内容

sendimagefile=open(r‘E:\python\image.png‘,‘rb‘).read()
image = MIMEImage(sendimagefile)
image.add_header(‘Content-ID‘,‘<image1>‘)
image["Content-Disposition"] = ‘attachment; filename="testimage.png"‘
msg.attach(image)

5、构建附件内容

from email import encoders
sendfile=open(r‘D:\pythontest\report--201805171734.html‘,‘rb‘).read()
report = email.mime.text.MIMEText(sendfile,‘html‘, ‘utf-8‘)
report["Content-Type"] = ‘application/octet-stream‘
report.add_header(‘Content-Disposition‘, ‘attachment‘, filename=(‘gbk‘, ‘‘, report_name))
encoders.encode_base64(report) #将report进行base64编码处理
msg.attach(report)

 

三、完整示例

python 发送邮件,包含文本、HTML、图片、附件:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email import encoders

#设置smtplib所需的参数
#下面的发件人,收件人是用于邮件传输的。
smtpserver = ‘smtp服务器IP‘
username = ‘邮箱账号‘
password=‘邮箱密码‘
sender=‘发件者邮箱‘
#receiver=‘[email protected]‘
#收件人为多个收件人
receiver=[‘[email protected]‘,‘[email protected]‘]

#下面的主题,发件人,收件人,日期是显示在邮件页面上的。
msg = MIMEMultipart(‘mixed‘)
msg[‘Subject‘] = "邮件test"
msg[‘From‘] = ‘发件者邮箱‘
#msg[‘To‘] = ‘[email protected]‘
#收件人为多个收件人,通过join将列表转换为以;为间隔的字符串
msg[‘To‘] = ";".join(receiver)
#msg[‘Date‘]=‘2012-3-16‘

#构造文字内容
text = "test,test!!!"
text_plain = MIMEText(text,‘plain‘, ‘utf-8‘)
msg.attach(text_plain)    

#构造图片链接
sendimagefile=open(‘E:\python\image.png‘,‘rb‘).read()
image = MIMEImage(sendimagefile)
image.add_header(‘Content-ID‘,‘<image1>‘)
image["Content-Disposition"] = ‘attachment; filename="testimage.png"‘
msg.attach(image)

#构造html
html = """
<html>
  <head></head>
  <body>
    <p>test!!!
    </p>
  </body>
</html>
"""
text_html = MIMEText(html,‘html‘, ‘utf-8‘)
text_html["Content-Disposition"] = ‘attachment; filename="texthtml.html"‘
msg.attach(text_html)


#构造附件
sendfile=open(‘D:\pythontest\report--201805171734.html‘,‘rb‘).read()
report = email.mime.text.MIMEText(sendfile, ‘html‘, ‘utf-8‘)
report["Content-Type"] = ‘application/octet-stream‘
report.add_header(‘Content-Disposition‘, ‘attachment‘, filename=(‘gbk‘, ‘‘, report_name))
encoders.encode_base64(report) #将report进行base64编码处理
msg.attach(report)

#发送邮件
smtp = smtplib.SMTP()
smtp.connect(smtpserver,465)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

  

 

以上是关于python - 发送邮件(smtplibemail)的主要内容,如果未能解决你的问题,请参考以下文章

python发送邮件

python发送邮件(转)

如何用python通过163发送邮件

Python 发送邮件

python发送邮件

Python发送邮件