zoukankan      html  css  js  c++  java
  • Python 发送邮件

    SMTP发送邮件

    SMTP是邮件发生的协议,Python内置对SMTP的支持,可以通过Pytho发送纯文本邮件、Html邮件以及带附件的邮件
    其中PYthon对SMTP只有的有smtplib和email两个模块,email负责构造邮件,smtplib负责邮件发送

    1.首先来一个纯文本邮件的demo

    from email.mime.text import MIMEText
    import smtplib
    info = MIMEText('Hello World','plain','utf-8')
    #构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,'plain'表示纯文本,最终MIME就是'text/plain',第三个为字符集 
    #定义Email地址和密码
    from_addr = 'xxx@xxx.com'
    password = 'xxxxxx'
    #收件人邮箱地址
    to_user = 'xxxxx@xxx.com'
    #SMTP邮件服务器地址
    smtp_server = 'xxx.smtp.com'
    
    s = smtplib.SMTP(smtp_server,25) #定义一个s对象
    s.set_debuglevel(1) #打印debug日志
    s.login(from_server,password) #auth发件人信息
    server.sendmail(from_addr,to_addr,info.as_string())
    s.quit()
    

    测试下,OK可以收到邮件,但是这个邮件没有主题和发件人等信息,这样的邮件很容易被邮件管理系统标记为垃圾邮件甚至被直接拒绝,所以,我们需要对邮件进行添加主题等信息

    2.对一个邮件添加主题等信息

    #!/bin/env python
    #-*- coding:utf-8 -*-
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    import smtplib
    
    from_addr = 'xxx'
    passwd = 'xxx'
    to_addr = 'xxx'
    smtp_addr = 'xxx'
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    msg = MIMEText('Hello 这封是带主题的', 'plain', 'utf-8')
    msg['From'] = _format_addr('我是发件人 <%s>' % from_addr)
    msg['To'] = _format_addr('收件人 <%s>' % to_addr)
    msg['Subject'] = Header('这是邮件主题', 'utf-8').encode()
    
    s = smtplib.SMTP(smtp_addr,25) #定义一个s对象
    s.set_debuglevel(1) #打印debug日志
    s.login(from_addr,passwd) #auth发件人信息
    s.sendmail(from_addr,to_addr,msg.as_string())
    s.quit()
    

    这里写了一个函数_format_addr()用来格式化邮件的地址

    HTMl格式的邮件
    msg = MIMEText('

    Hello

    ' +
    '

    send by Python...

    ' +
    '', 'html', 'utf-8')

    3.大招 发送附件

    #!/bin/env python
    #-*- coding:utf-8 -*-
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    from email.mime.multipart import MIMEMultipart
    from email.mime.image import MIMEImage
    from email.mime.base import MIMEBase
    import smtplib
    
    from_addr = 'xxx'
    passwd = 'xxx'
    to_addr = 'xxx'
    smtp_addr = 'xxx'
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    msg = MIMEMultipart()
    msg['From'] = _format_addr('我是发件人 <%s>' % from_addr)
    msg['To'] = _format_addr('收件人 <%s>' % to_addr)
    msg['Subject'] = Header('这是邮件主题', 'utf-8').encode()
    
    # 邮件正文是MIMEText:
    msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
    # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
    with open('/tmp/1.png', 'rb') as f:
        # 设置附件的MIME和文件名,这里是png类型:
        mime = MIMEBase('image', 'png', filename='1.png')
        # 加上必要的头信息:
        mime.add_header('Content-Disposition', 'attachment',
        filename='1.png')
        mime.add_header('Content-ID', '<0>')
    

    同时支持HTML和Plain格式
    如果发html格式邮件,收件人如果不支持就无法浏览,so可以选择同时支持

    msg = MIMEMultipart('alternative')
    msg['From'] = ...
    msg['To'] = ...
    msg['Subject'] = ...
    
    msg.attach(MIMEText('hello', 'plain', 'utf-8'))
    msg.attach(MIMEText('<html><body><h1>Hello</h1></body></html>', 'html',     'utf-8'))
    # 正常发送msg对象...
    

    加密SMTP

    smtp_server = 'smtp.gmail.com'
    smtp_port = 587
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    # 剩下的代码和前面的一模一样:
    server.set_debuglevel(1)
    

    总结:
    smtplib 只需要掌握构造方法 设置好邮件开头 就可以顺利发送邮件
    构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

            Message
        +- MIMEBase
           +- MIMEMultipart
           +- MIMENonMultipart
              +- MIMEMessage
              +- MIMEText
              +- MIMEImage
  • 相关阅读:
    准备工作
    个人作业感言
    年度书单-结对编程
    案例分析
    编程作业_词频统计
    2、阅读任务
    1、准备工作
    个人作业获奖感言
    3 20210405-1 案例分析作业
    202103226-1 编程作业
  • 原文地址:https://www.cnblogs.com/czalinux/p/7891905.html
Copyright © 2011-2022 走看看