zoukankan      html  css  js  c++  java
  • 54.python发送邮件

    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 = "场景名:{}  状态:测试成功
    ".format(scence_name)
                file_path_list = [scence_name + ".docx", scence_name + ".doc"]
            else:
                if is_success is None:
                    content = "场景名:{}  状态:开始测试".format(scence_name)
                else:
                    content = "场景名:{}  状态:测试失败
    
    失败原因:
    {}".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:UsersyztDesktopworkInfosecTestPlatformlog1.txt",
                          r"C:UsersyztPicturesScreenshots屏幕截图(1).png",
                          r"C:UsersyztDesktop学习三剑客.md"]
        sms.send_email(send_to, title, content, file_path_list)
        
        解释:
            report_email这个函数一开始是没有的,但是这种方式好像send的接口暴露出去了,而我们的领导想的是,我不需要关心你的发送邮件接口,同时我下一次让你发送另外一种报告或者内容给其他人员,内容都不一样,你不能每次都改发邮件的send_email接口,这个接口会被改的越来越乱.你现在重新封装一个接口这个接口就是给运维人员发送,再定义一个给领导的.发送的内容以及附件都不相同.所以就出现了 report_email这个接口,只负责给运维发送邮件.给领导的内容再重新定义一个就可以了.通过这个我的大概体会是python的开放封闭原则,对发邮件本身他是封闭的,你不能动它里面的内容,而对于扩展是开放的你可以通过重新添加接口实现给种类型的人员发送邮件(感觉有种多态的意思).
            
    参考:
        https://blog.csdn.net/qq_20417499/article/details/80566265
        https://blog.csdn.net/qq_27648991/article/details/82898775
        https://www.jianshu.com/p/74d7f1b21905
        https://blog.csdn.net/qq_27648991/article/details/82898775
        https://www.yiibai.com/python/python_sending_email.html
    
  • 相关阅读:
    Eclipse快捷键
    LeeCode
    Code Complete
    Git
    sql优化策略
    FSA/FSM/FST
    索引失效情况
    实现HttpHandlerFactory的方法
    Xpath语法格式整理
    Edojs应用
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/13032395.html
Copyright © 2011-2022 走看看