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服务获取授权码,开启后就会跳出授权码

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
:文本邮件对象,可以指定格式plain
,html
,base64
,分别传输字符串文本,超文本,文本文件 -
MIMEImage
:图片对象,将图片以二进制rb的形式读取传入 -
MIMEMultipart
:多种内容邮件,有三种模式alternative
,related
,mixed
,默认mixed,将上面创建的文本和图片对象作为附件attach
进去
创建html格式的文本邮件内容
修改快速开始中的部分代码
html_info = """
<h1>你好</h1>
<h2 style="color: #E47833;">这是一个html邮件</h2>
"""
html = MIMEText(html_info, 'html', 'utf-8')
msg.attach(html)
重新运行代码发送效果如下

创建带有文本文件附件的邮件
修改快速开始部分代码
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)

也可以发送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)

创建带有图片文件附件的邮件
修改快速开始部分代码
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)

创建带有混合附件的邮件
只需要分别定义图片,文本等文件对象,然后多次使用attach即可
使用公司zimbra发送邮件
以zimbra作为邮箱,使用Python发送邮件,zimbra不需要授权码,但是也需要登录,登录密码就是邮箱密码,修改快速开始部分代码
SMTP_HOST = "smtp.公司邮箱后缀.com"
SMTP_PORT = 465
conn.login(FROM_EMAIL_ACCOUNT, 'zimbra邮箱登录密码')