发送邮箱
一. 模块介绍
python 内置模块 smtplib
,无需下载。
二. 常见类介绍
1. MIMEText 类
MIMEText 类用来创建邮件的正文
MIMEText(_text, _subtype='plain', _charset=None)
参数介绍:
_text:
邮件正文内容,可以是纯文本或HTML格式
_subtype:
邮件正文内容的类型,可以是 plain(纯文本)、或 html(HTML格式)
_charset:
邮件正文内容的编码方式,常用的有"utf-8"、"gbk"等
代码示例:
from email.mime.text import MIMEText
#----------方式 1----------
content = '测试邮件。收到请不用回复'
msg = MIMEText(content, 'plain', 'utf-8')
#----------方式 2----------
content = '''
<p>我的地址:</p>
<p><a href='https://www.baidu.com/'>点击进入百度</a></p>
'''
html = MIMEText(content, 'html', 'utf-8')
2. MIMEImage 类
MIMEImage 类用来创建邮件中的图片
MIMEImage(_imagedata, _subtype)
参数介绍:
_imagedata:
图片的二进制数据。
_subtype:
图片的类型,可以是"jpeg"、“gif”、"png"等。
代码示例:
from email.mime.image import MIMEImage
#----------方式 1----------
with open('test.jpeg', 'rb') as f:
image_data = f.read()
msg = MIMEImage(image_data, 'jpeg')
#----------方式 2----------
with open('test.gif', 'rb') as f:
image_data = f.read()
msg = MIMEImage(image_data, 'gif')
#----------方式 3----------
with open('test.png', 'rb') as f:
image_data = f.read()
msg = MIMEImage(image_data, 'png')
3. MIMEAudio 类
MIMEAudio 类用来创建邮件中的音频文件
MIMEAudio(_audiodata, _subtype)
参数介绍:
_audiodata:
音频文件的二进制数据。
_subtype:
音频文件的类型,可以是"mp3"、"wav"等。
代码示例:
from email.mime.audio import MIMEAudio
with open('test.mp3', 'rb') as f:
audio_data = f.read()
msg = MIMEAudio(audio_data, 'mp3')
4. MIMEBase 类
MIMEBase 类是所有 MIME 类型的基类
MIMEBase(_maintype, _subtype, _encoder, _payload)
参数解释:
_maintype:
MIME类型的大类,常见的有"text"、“image”、“audio”、“video”、"application"等。
_subtype:
MIME类型的子类,如"text/plain"、“image/jpeg”、"audio/mp3"等。
_encoder:
编码方式,可以是"base64"、"quoted-printable"等。
_payload:
MIME类型的内容,可以是文本、图片、音频、视频等。
代码示例:
from email.mime.base import MIMEBase
with open('test.pdf', 'rb') as f:
pdf_data = f.read()
msg = MIMEBase('application', 'octet-stream')
msg.set_payload(pdf_data)
三. 完整代码示例
1. 必要参数
# 发送者
MSG_FROM = '...@qq.com'
# 接收者 (可以是一个列表,可以向多个人发送邮件)
MSG_TO = '...@qq.com'
# MSG_TO = ['1...@qq.com', '2...@qq.com']
# 授权码
PASSWORD = 'jd...cfd'
# 主题
SUBJECT = "验证码"
# 邮件内容 普通文本
CONTENT = "你的验证码是:888999 ,请不要泄露"
# 邮件内容 html格式
CONTENT_HTML = '''
<h1>恭喜您中奖了</h1>
<p><a href="https://www.baidu.com">点我兑换奖品</a></p>
'''
2. 文本 + html 格式
# 1 导入模块
import smtplib
from email.mime.text import MIMEText # 往邮件中写内容的对象
from email.utils import formataddr # 发件人信息
from settings import *
#--------------------start-----------------------
# 生成一个MIMEText对象(还有一些其它参数)
msg = MIMEText(CONTENT)
# html 需改成如下代码
# msg = MIMEText(CONTENT_HTML, 'html', 'utf-8')
#--------------------end-----------------------
# 放入邮件主题
msg['Subject'] = SUBJECT
# 放入发件人,元祖中内容第一个是发件人名称,第二个是发件地址
msg['From'] = formataddr(('小高', MSG_FROM))
# 放入收件人,将收件人转化为以逗号分隔的字符串
msg['to'] = ','.join(MSG_TO)
try:
# 通过ssl方式发送,服务器地址,端口
s = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 登录到邮箱
s.login(MSG_FROM, PASSWORD)
# 发送邮件:发送方,收件方,要发送的消息
s.sendmail(MSG_FROM, MSG_TO, msg.as_string())
print('成功')
except BaseException as e:
print(e)
finally:
# 不管是否发送成功,都退出服务
s.quit()
3. 图片 + 文件格式
# 1 导入模块
import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText # 往邮件中写内容的对象
from email.utils import formataddr # 发件人信息
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from settings import *
# 创建一个带附件的实例
msg = MIMEMultipart()
# 放入邮件主题
msg['Subject'] = SUBJECT
# 放入发件人,元祖中内容第一个是发件人名称,第二个是发件地址
msg['From'] = formataddr(('景天', MSG_FROM))
# 放入收件人,将收件人转化为以逗号分隔的字符串
msg['to'] = ','.join(MSG_TO)
# 邮件正文内容
msg.attach(MIMEText('今日日报:1 xxx', 'plain', 'utf-8'))
# ------------------------- 附件 1 -------------------------
# 传送当前目录下的 ribao.txt 文件,注意文件要以rb的形式读取
file = open('ribao.txt', 'rb').read()
att1 = MIMEText(file, 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1.add_header('Content-Disposition', 'attachment', filename="日报.txt")
msg.attach(att1)
# -------------------------附件 2 -------------------------
with open('gzh.png', 'rb') as f:
# 设置附件的MIME和文件名,这里是png类型:
mime = MIMEBase('image', 'png', filename='gzh.png')
# 加上必要的头信息:
mime.add_header('Content-Disposition', 'attachment', filename='gzh.png')
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-Id', '0')
# 把附件的内容读进来:
mime.set_payload(f.read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)
# ------------------------- 附件 3 -------------------------
fp = open('gzh.png', 'rb')
msgImage = MIMEImage(fp.read(), 'png')
fp.close()
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
msgImage.add_header('Content-Disposition', 'attachment', filename="对称加密.png")
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msg.attach(msgImage)
# ------------------------- end -------------------------
try:
# 通过ssl方式发送,服务器地址,端口
s = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 登录到邮箱
s.login(MSG_FROM, PASSWORD)
# 发送邮件:发送方,收件方,要发送的消息
s.sendmail(MSG_FROM, MSG_TO, msg.as_string())
print('成功')
except BaseException as e:
print(e)
finally:
# 不管是否发送成功,都退出服务
s.quit()
四. django 中使用
django 中对 smtplib 再次做了封装
具体使用可见官方文档: https://docs.djangoproject.com/zh-hans/4.2/topics/email/
使用前需配置如下:
# -------------------- settings.py 中 --------------------
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# 你的SMTP服务器地址
EMAIL_HOST = 'smtp.qq.com'
# 根据你的邮件服务提供商,qq 邮箱是 456
EMAIL_PORT = 465
# 你的邮箱地址
EMAIL_HOST_USER = '123456@qq.com'
# 你的邮箱授权码
EMAIL_HOST_PASSWORD = 'jd.....cfd'
# 如果使用SSL,设为True
EMAIL_USE_SSL = True
# 如果使用TLS
# EMAIL_USE_TLS = False