邮件发送

2021-05-17  本文已影响0人  酷飒de小姐姐

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

SMTP发送邮件Python对SMTP的支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

Python创建SMTP对象的语法如下:

smtpObj=smtplib.SMTP([host [, port [, local_hostname]]])

语法中各个参数说明如下:

● host:SMTP服务器主机。可以指定主机的IP地址或域名(如www.baidu.com),是可选参数。

● port:如果提供了host参数,就需要指定SMTP服务使用的端口号。一般情况下,SMTP的端口号为25。

● local_hostname:如果SMTP在本地主机上,只需要指定服务器地址为localhost即可。

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

语法中各个参数说明如下:

● from_addr:邮件发送者的地址。

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

● msg:发送消息。msg是字符串,表示邮件内容。我们知道邮件一般由标题、发信人、收件人、邮件内容、附件等构成,发送邮件时,要注意msg的格式。这个格式就是SMTP协议中定义的格式。

普通文本邮件发送的实现关键要将MIMEText中的_subtype设置为plain。首先导入smtplib和MIMEText。创建smtplib.smtp实例,连接邮件SMTP服务器,登录后发送,具体代码如下(send_email.py):

#! /usr/bin/python

# -*-coding:UTF-8-*-

import smtplib

from email.mime.textimport MIMEText

from email.headerimport Header

sender ='1510101@163.com'

pwd ='xxxxx' #开通邮箱服务后,设置的客户端授权密码

receivers = ['to@uzoo.cn']# 接收邮件,可设置为你的邮箱

# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码

message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')

message['From'] = Header("邮件测试", 'utf-8')

message['To'] = Header("测试", 'utf-8')

subject ='Python SMTP 邮件测试'

message['Subject'] = Header(subject, 'utf-8')

try:

# 使用非本地服务器,需要建立SSL连接

    smtpObj = smtplib.SMTP_SSL("smtp.163.com", 465)

smtpObj.login(sender, pwd)

smtpObj.sendmail(sender, receivers, message.as_string())

print("邮件发送成功")

except smtplib.SMTPExceptionas se:

print(f"Error: 无法发送邮件.Case:{se}")

发送HTML格式的邮件如果我们要发送的是HTML邮件,而不是普通的纯文本文件怎么办呢?方法很简单,在构造MIMEText对象时把HTML字符串传进去,再把第二个参数由plain变为html就可以了。代码实现如下(send_html_email.py):

#! /usr/bin/python

    # -*-coding:UTF-8-*-

    import smtplib

    from email.mime.text import MIMEText

    from email.header import Header

    sender = '15101@163.com'

    pwd = 'xxxxx' #开通邮箱服务后,设置的客户端授权密码

    receivers = ['to@uzoo.cn']  # 接收邮件,可设置为你的邮箱

    mail_msg = """

    <p>Python 邮件发送测试...</p >

    <p>< a href=" ">这是一个链接</ a></p >

    """

    message = MIMEText(mail_msg, 'html', 'utf-8')

    message['From'] = Header("邮件测试", 'utf-8')

    message['To'] =  Header("测试", 'utf-8')

    subject = 'Python SMTP 邮件测试'

    message['Subject'] = Header(subject, 'utf-8')

    try:

        # 使用非本地服务器,需要建立SSL连接

        smtpObj = smtplib.SMTP_SSL("smtp.163.com", 465)

        smtpObj.login(sender, pwd)

        smtpObj.sendmail(sender, receivers, message.as_string())

        print("邮件发送成功")

    except smtplib.SMTPException as se:

        print(f"Error: 无法发送邮件.Case:{se}")

发送带附件的邮件,可以构造一个MIMEMultipart对象代表邮件本身,然后往里面添加一个MIMEText作为邮件正文,再添加表示附件的MIMEBase对象即可。代码实现如下(send_fujian_email.py):

#coding:utf-8

import smtplib

from email.mime.multipartimport MIMEMultipart

from email.mime.textimport MIMEText

#发送邮件smtblib,邮件格式:MIMEText

import os

class SendEmail:

#全局变量

    global send_user

global email_host

global password

email_host ="smtp.163.com"

    send_user ="151010@163.com"

    password ="ALFIUIP"

    def send_mail(self,user_list,sub,content,att1):

#构建

        user ="1510101" +"<"+send_user+">"

        #构建邮件内容格式

# message = MIMEText(content,_subtype='plain',_charset='utf-8')

        message = MIMEMultipart(_charset='utf-8')

message['Subject'] = sub#主题格式

        message['From'] = user#发送人

        message['To'] =";".join(user_list)#多个收件人,分号分割

        message.attach(MIMEText(content,_subtype='plain',_charset='utf-8'))

# 构造附件1,传送当前目录下的文件

        att1 = MIMEText(open('../dataconfig/appellation.xls', 'rb').read(), 'base64', 'utf-8')

att1["Content-Type"] ='application/octet-stream'

        # 这里的filename可以任意写,写什么名字,邮件中显示什么名字

        att1["Content-Disposition"] ='attachment; filename="test.xls"'

        message.attach(att1)

message.attach(MIMEText(content, 'html', _charset='utf-8'))

server = smtplib.SMTP()#创建邮件服务

        server.connect(email_host)#连接服务

        server.login(send_user,password)

server.sendmail(user,user_list,message.as_string())

server.close()

def send_main(self,pass_list,fail_list):

pass_num =len(pass_list)#成功总数

        fail_num =len(fail_list)#错误总数

        count_num = pass_num+fail_num#执行用例总数

#百分比

        pass_result ="%.2f%%" %(pass_num/count_num*100)#%.2f指却取值小数点后两位,%表示百分号

        fail_result ="%.2f%%" %(fail_num/count_num*100)

att1 = MIMEText(open('../dataconfig/appellation.xls', 'rb').read(),'base64','utf-8')

att1["Content-Type"] ='application/octet-stream'

        # 这里的filename可以任意写,写什么名字,邮件中显示什么名字

        att1["Content-Disposition"] ='attachment; filename="test.xls"'

        user_list = ['li@uzoo.cn']

sub ='接口自动化测试报告'

        content="<p>此次一共运行接口个数为%s个</p><html><body><div><tr id="" class="" style=""><td><h1>用例集/测试用例</h1></td></tr></div></body></html>" \

"通过个数为%s个,失败个数为%s个,通过率为%s,失败率为%s"%(count_num,pass_num,fail_num,pass_result,fail_result)

# content = """

此次一共运行接口个数为%count_num个

# 通过个数%s失败个数%s

# 通过个数%pass_num失败个数%fail_num

#

# 通过率%s失败率%s

# 通过率%pass_result失败率%fail_result"""

        if fail_num>=0:

self.send_mail(user_list,sub,content,att1)

else:

print("")

if __name__ =='__main__':

sen = SendEmail()

sen.send_main([1,2],[3,4])

上一篇 下一篇

猜你喜欢

热点阅读