Python 使用office365邮箱

发布时间:2020-06-10 14:13:08编辑:admin阅读(208)

    一、概述

    最近遇到一个需求,需要使用office365邮箱发送邮件,使用SSL发送会失败,必须使用TLS加密协议才能发送成功。

     

    二、完整代码

    使用类封装了一下,功能如下:

    1. 支持附件

    2. 支持多个发件人

    3. 执行TLS

     

    MailTools.py

    #!/usr/bin/env python3
    # coding: utf-8
    
    
    import smtplib  # 加载smtplib模块
    from email.mime.text import MIMEText
    from email.utils import formataddr
    from email.mime.multipart import MIMEMultipart
    from email.mime.application import MIMEApplication
    import time
    
    class SendMail(object):
        def __init__(self,sender,title,content):
            self.sender = sender  #发送地址
            self.title = title  # 标题
            self.content = content  # 发送内容
            self.sys_sender = 'xx@office365.com'  # 系统账户
            self.sys_pwd = '123456'  # 系统账户密码
    
        def send(self,file_list):
            """
            发送邮件
            :param file_list: 附件文件列表
            :return: bool
            """
            try:
                # 创建一个带附件的实例
                msg = MIMEMultipart()
                # 发件人格式
                msg['From'] = formataddr(["", self.sys_sender])
                # 收件人格式
                msg['To'] = formataddr(["", self.sender])
                # 邮件主题
                msg['Subject'] = self.title
    
                # 邮件正文内容
                msg.attach(MIMEText(self.content, 'plain', 'utf-8'))
    
                # 多个附件
                for file_name in file_list:
                    print("file_name",file_name)
                    # 构造附件
                    xlsxpart = MIMEApplication(open(file_name, 'rb').read())
                    # filename表示邮件中显示的附件名
                    xlsxpart.add_header('Content-Disposition','attachment',filename = '%s'%file_name)
                    msg.attach(xlsxpart)
    
                # SMTP服务器
                server = smtplib.SMTP("smtp.office365.com", 587,timeout=10)
                server.ehlo()
                server.starttls()
                # 登录账户
                server.login(self.sys_sender, self.sys_pwd)
                # 发送邮件
                server.sendmail(self.sys_sender, [self.sender, ], msg.as_string())
                # 退出账户
                server.quit()
                return True
            except Exception as e:
                print(e)
                return False
    
    if __name__ == '__main__':
        # 发送地址
        sender = "12345678@qq.com"
        # 标题
        title = "测试告警"
        # 开始时间
        start_time = time.strftime('%Y-%m-%d %H:%M:%S')
        ip = "xx.xx.xx.xx"
        # 发送内容
        content = "{} ip: {} 掉线".format(start_time,ip)
        # 附件列表
        file_list = []
        ret = SendMail(sender, title, content).send(file_list)
        print(ret,type(ret))

    注意:请根据实际情况,修改邮件账号和密码。


关键字