发送邮箱

一. 模块介绍

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

posted @ 2024-05-17 19:33  codegjj  阅读(1)  评论(0编辑  收藏  举报