Python学习

Python使用smtplib,email模块发邮件

2021-02-04  本文已影响0人  xiaogp

摘要: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  

创建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邮箱登录密码')
上一篇 下一篇

猜你喜欢

热点阅读