美文网首页
Python3发邮件(HTML/图片/Excel)

Python3发邮件(HTML/图片/Excel)

作者: 惑也 | 来源:发表于2019-04-01 14:11 被阅读0次

    一、思路

    1. 使用脚本发送邮件的思路,其实和客户端发送邮件一样,过程如下:
      登录 -—> 邮件 -—> 发送
    2. 思维脑图

    二、Python中的email模块

    1. SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件;
    2. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件;
    3. smtplib是关于 SMTP(简单邮件传输协议)的操作模块,在发送邮件的过程中,起到服务器之间互相通信的作用;
    4. email是用来设置服务器之间通信的信息,包括信息头、信息主体等等;
    5. 用脚本发邮件时,需要先打开自己邮箱的 SMTP 功能,各家邮箱的设置方法不同,可自行百度;

    三、代码

    1. 以用163邮箱给qq、126、gmail邮箱发送邮件为例,其中,邮件包含:文本、超链接、表格、插入式图片、附件excel等;
    2. 本文代码在Jupyter notebook中实现,提前准备好照片、表格数据等;
    3. 入参:邮箱账户密码及接受人
    # 入参:邮箱账户密码及接受人
    host = "smtp.163.com"
    user = "1*******0@163.com"
    pwd = "W*******i"
    sender = "l*******1@163.com"
    title = "Python_test_mail"
    receiver = "l*******1@gmail.com,1*******1@qq.com"
    cc = "l*******2.com,1*******1@qq.com"
    bcc = "6*******5@qq.com"
    
    1. 设置邮件主体
    msg = MIMEMultipart()    # 发送多种形态的邮件
    msg.add_header("Subject", title)    # 邮件主题
    msg.add_header("From", sender)    # 发件人
    msg.add_header("To", receiver)    # 收件人
    msg.add_header("Cc", cc)    # 抄送人
    msg.add_header("BCc", bcc)   # 密抄人
    to_list = receiver.split(",") + cc.split(",") + bcc.split(",")    # 接收邮件人列表
    
    1. 设置txt/Html,包括:文本、超链接、图片、数据表格
    # 设置txt/Html,包括:文本、超链接、图片、数据表格
    txt_html = """
            <p>Hello!&nbsp;This is a test mail.</p>
            <p>Send by <a href = "http://www.python.org">Python...</a></p>
            <p>Picture Case:</p>
            <p><img src="cid:image01"></p>
            """ + open("data.html", "r").read()
    part_html = MIMEText(txt_html, "html", "utf-8")
    msg.attach(part_html)
    
    1. 设置excel附件
    # 设置excel附件
    part_excel = MIMEApplication(open("data.xlsx", "rb").read())
    part_excel.add_header("Content-Disposition", "attachment", filename="data.xlsx")
    msg.attach(part_excel)
    
    1. 设置正文图片
    # 设置正文图片
    part_picture = MIMEApplication(open("fighting.jpeg", "rb").read())
    part_picture.add_header("Content-Disposition", "attachment", filename="fighting.jpeg")
    part_picture.add_header("Content-ID", "<image01>")    # 设置图片ID,插入正文
    part_picture.add_header("X-Attachment-Id", "image01")
    msg.attach(part_picture)
    
    1. 发送邮件
    # 发送邮件
    try:
        smtp_obj = smtplib.SMTP()
        smtp_obj.connect(host, 25)    # 连接到服务器,SMTP协议默认端口是25,需要SSL认证的邮箱,SMTP_SSL连接
        smtp_obj.login(user, pwd)    # 登录服务器
        smtp_obj.sendmail(sender, to_list, msg.as_string())    # 发送
        smtp_obj.quit()    # 退出
    except smtplib.SMTPException as e:
        print("Error:", e)    # 发送失败,返回异常
    
    1. 邮件展示

    四、小结

    1. 需要SSL认证的邮箱,SMTP不能满足要求,需要使用SMTP_SSL连接服务器,如QQ邮箱:smtp_obj = smtplib.SMTP_SSL(mail_host)
    2. 收件人(To)、抄送人(Cc)、暗抄人(BCc)均为字符串,有多人时中间用逗号隔开;
    3. 所有收信人、抄送人、暗抄人都一样,放在sendmail()的第二个参数里,具体区别由sendmail()里第三个参数的关键词决定;
    4. 实际上,email中收件人和sendmail中的收件人没啥联系。前者是前端邮件里展示的收件人/抄送人/暗抄人,必须是字符串;后者是服务器发送的地址,必须是邮箱地址组成的列表;
    5. 构造一个邮件对象就是一个Messag对象;如果构造一个MIMEText对象,表示一个文本邮件对象;如果构造一个MIMEImage对象,就表示一个含图片的邮件对象;要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象;
    6. 需要添加附件时,推荐使用MIMEApplication,支撑常见的各种附件类型,如:txt、excel、pdf、csv、image、mp3等;
    7. 推荐使用html格式的正文内容,这样比较灵活,可以拼接各种内容,插入图片,调整格式等。

    相关文章

      网友评论

          本文标题:Python3发邮件(HTML/图片/Excel)

          本文链接:https://www.haomeiwen.com/subject/bfbybqtx.html