1.python发送邮件:
import os
import smtplib, email
from email.header import Header
# 连接邮件服务器
from utils.email import email_config
import traceback
import logging
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename='email.txt',
filemode='a')
class Send_Email(object):
def __init__(self):
self.sender = email_config.sender # 这个是你们企业的邮箱
self.passwd = email_config.passwd # 企业邮箱认证码
self.mail_server = email_config.mail_server # 企业版邮箱的额server如:个人smtp.163.com,企业邮箱是另一种smtp.qiye.163.com
self.mail_from = email_config.mail_from # 邮件是谁发送的
def send_email(self, send_to, title, content, file_path_list=None):
"""
发送邮件
:param send_to: 接收方列表["123456@qq.com", "987654@qq.com"]
:param tiltle: 标题
:param content: 内容
:param file_path: 附件
:param flag: 是否携带附件
"""
# 格式化邮件整体信息
msg = email.mime.multipart.MIMEMultipart()
msg['Subject'] = Header(title, 'utf-8')
msg['From'] = self.mail_from
msg['To'] = "".join(send_to)
# 邮件正文内容
msg_context = MIMEText(content, 'plain', 'utf-8')
msg.attach(msg_context)
if file_path_list:
# 添加附件
self.annex(msg, file_path_list)
# 连接并发送邮件
ret = {}
try:
# 创建smtp对象
smtpSSLClient = smtplib.SMTP_SSL(self.mail_server)
# 上面的和下面的创建sntp对象都可以
# smtpSSLClient = smtplib.SMTP()
# smtpSSLClient.connect(self.mail_server)
login_res = smtpSSLClient.login(self.sender, self.passwd)
if login_res[0] != 235:
ret = {"code": "1001", "msg": "源用户登录失败,请检查发送邮箱和密码"}
return ret
else:
smtpSSLClient.sendmail(self.sender, send_to, msg.as_string())
smtpSSLClient.quit()
ret["code"] = 1000,
ret["msg"] = "发送成功"
return ret
except Exception as e:
logging.info(traceback.format_exc())
ret["code"] = 1002,
ret["msg"] = "发送失败,请查看email日志文件"
return ret
def annex(self, smtp_obj, file_path_list):
"""添加附件文本"""
for file_path in file_path_list:
if os.path.exists(file_path):
filename = os.path.split(file_path)[-1]
file = MIMEApplication(open(file_path, 'rb').read())
file.add_header('Content-Disposition', 'attachment', filename=filename)
smtp_obj.attach(file)
else:
ret = {"code": "1003", "msg": "附件文件不存在"}
return ret
def report_email(self, scence_name: str, sends_to: list, is_success=None, fail_info=None):
"""
发送场景测试报告
:param scence_name: 场景名
:param sends_to: 接受方:list
:param is_success: True:测试成功; False:测试失败, None:开始测试
:param fail_info: fail_info: 失败原因
:return: {'code': (1000,), 'msg': '发送成功'}
"""
if not all((scence_name, sends_to)):
ret = {"code": 1003, "msg": "请求输入场景名和目标邮箱"}
return ret
title = "{}场景测试结果通知".format(scence_name)
if is_success:
content = "场景名:{} 状态:测试成功\n".format(scence_name)
file_path_list = [scence_name + ".docx", scence_name + ".doc"]
else:
if is_success is None:
content = "场景名:{} 状态:开始测试".format(scence_name)
else:
content = "场景名:{} 状态:测试失败\n\n失败原因:\n{}".format(scence_name, fail_info)
file_path_list = []
ret = self.send(sends_to, title, content, file_path_list)
return ret
if __name__ == '__main__':
sms = Send_Email()
send_to = ["318***6382@qq.com"]
title = "监控报告"
content = "使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部"
file_path_list = [r"C:\Users\yzt\Desktop\work\InfosecTestPlatform\log1.txt",
r"C:\Users\yzt\Pictures\Screenshots\屏幕截图(1).png",
r"C:\Users\yzt\Desktop\学习\三剑客.md"]
sms.send_email(send_to, title, content, file_path_list)
解释:
report_email这个函数一开始是没有的,但是这种方式好像send的接口暴露出去了,而我们的领导想的是,我不需要关心你的发送邮件接口,同时我下一次让你发送另外一种报告或者内容给其他人员,内容都不一样,你不能每次都改发邮件的send_email接口,这个接口会被改的越来越乱.你现在重新封装一个接口这个接口就是给运维人员发送,再定义一个给领导的.发送的内容以及附件都不相同.所以就出现了 report_email这个接口,只负责给运维发送邮件.给领导的内容再重新定义一个就可以了.通过这个我的大概体会是python的开放封闭原则,对发邮件本身他是封闭的,你不能动它里面的内容,而对于扩展是开放的你可以通过重新添加接口实现给种类型的人员发送邮件(感觉有种多态的意思).
参考:
https://www.jianshu.com/p/74d7f1b21905
https://www.yiibai.com/python/python_sending_email.html