美文网首页Python学习
Python使用smtplib,email模块发邮件

Python使用smtplib,email模块发邮件

作者: xiaogp | 来源:发表于2021-02-04 16:24 被阅读0次

    摘要:Python

    模块依赖

    Python发邮件需要依赖两个模块,smtplib主要负责发送邮件,和email主要负责构造邮件。SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址目的地址传送邮件的规则,由它来控制信件的中转方式;email模块主要负责邮件对象的创建,邮件头,正文,附件,图片的处理等。

    快速开始

    import traceback
    import smtplib
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.header import Header
    
    SMTP_HOST = "smtp.163.com"  # smtp服务器host
    SMTP_PORT = 465    # smtp服务器port
    FROM_EMAIL_ACCOUNT = '...'  # 163邮箱账号
    TO_EMAIL_ACCOUNT = '...'  # 发送到的邮箱账号
    AUTHORIZATION_CODE = '...'  # 163授权码
    
    
    if __name__ == '__main__':
        conn = None
        try:
            conn = smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT)
            conn.login(FROM_EMAIL_ACCOUNT, AUTHORIZATION_CODE)
            msg = MIMEMultipart()
            subject = Header('测试邮件', 'utf-8').encode()
            msg['Subject'] = subject
            msg['From'] = FROM_EMAIL_ACCOUNT
            msg['To'] = TO_EMAIL_ACCOUNT
            text = MIMEText('测试邮件发送', 'plain', 'utf-8')
            msg.attach(text)
            conn.sendmail(FROM_EMAIL_ACCOUNT, TO_EMAIL_ACCOUNT, msg.as_string())
        except Exception as e:
            traceback.print_exc()
        finally:
            if conn:
                conn.quit()
    

    其中TO_EMAIL_ACCOUNT可以定义一个list,发送给一群用户,代码如下

    TO_EMAIL_ACCOUNT = ['xxx@xx.com', 'xxx@xx.com']
    msg['To'] = ",".join(TO_EMAIL_ACCOUNT)
    conn.sendmail(FROM_EMAIL_ACCOUNT, TO_EMAIL_ACCOUNT, msg.as_string())
    

    报错解决

    ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1076)
    

    修改port,在25和465两个中多试几次


    smtplib.SMTPAuthenticationError: (550, b'User has no permission')
    

    163邮箱客户端未设置授权密码,需要开启SMTP服务获取授权码,开启后就会跳出授权码


    开启SMTP.png
    smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed')
    

    login验证错误登录不上发送者邮箱,需要用授权码而不是邮箱密码。

    email创建不同类型的邮件对象

    email创建邮箱对象有三大类

    from email.mime.text import MIMEText    
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart  
    
    • MIMEText:文本邮件对象,可以指定格式plainhtmlbase64,分别传输字符串文本,超文本,文本文件
    • MIMEImage:图片对象,将图片以二进制rb的形式读取传入
    • MIMEMultipart:多种内容邮件,有三种模式alternativerelatedmixed,默认mixed,将上面创建的文本和图片对象作为附件attach进去

    创建html格式的文本邮件内容

    修改快速开始中的部分代码

    html_info = """
            <h1>你好</h1>
            <h2 style="color: #E47833;">这是一个html邮件</h2>
            """
    html = MIMEText(html_info, 'html', 'utf-8')
    msg.attach(html)
    

    重新运行代码发送效果如下


    html格式文本.png
    创建带有文本文件附件的邮件

    修改快速开始部分代码

    text_file = open('/home/gp/abc20200204.txt', 'rb').read()
    text = MIMEText(text_file, 'base64', 'utf-8')
    text["Content-Type"] = 'application/octet-stream'
    text.add_header('Content-Disposition', 'attachment', filename='hello_world.txt')
    msg.attach(text)
    
    发送带有文本附件的邮件.png

    也可以发送pdf等文件,使用base64编码

    pdf_file = open('/home/gp/book/Maven实战.pdf', 'rb').read()
    pdf = MIMEText(pdf_file, 'base64', 'utf-8')
    pdf["Content-Type"] = 'application/octet-stream'
    pdf.add_header('Content-Disposition', 'attachment', filename='hello_world.pdf')
    msg.attach(pdf)
    
    带有pdf附件的邮件.png
    创建带有图片文件附件的邮件

    修改快速开始部分代码

    image_file = open("/home/gp/static/img/level_1.jpeg", 'rb').read()
    image = MIMEImage(image_file)
    image.add_header('Content-ID', '<image1>')
    image["Content-Disposition"] = 'attachment; filename="img.png"'
    msg.attach(image)
    
    image.png
    创建带有混合附件的邮件

    只需要分别定义图片,文本等文件对象,然后多次使用attach即可

    使用公司zimbra发送邮件

    以zimbra作为邮箱,使用Python发送邮件,zimbra不需要授权码,但是也需要登录,登录密码就是邮箱密码,修改快速开始部分代码

    SMTP_HOST = "smtp.公司邮箱后缀.com"
    SMTP_PORT = 465
    conn.login(FROM_EMAIL_ACCOUNT, 'zimbra邮箱登录密码')
    

    相关文章

      网友评论

        本文标题:Python使用smtplib,email模块发邮件

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