**MIMEBase、 MIMEApplication背景知识点总结**
- MIMEBase 和 MIMEApplication 都是用于创建 MIME 消息的类,但它们之间有一些异同点。
异同点如下:
用途:
MIMEBase 是一个基类,用于表示任何类型的 MIME 消息部分。它提供了一种通用的方式来创建和处理 MIME 消息。
MIMEApplication 是 MIMEBase 的子类之一,专门用于表示应用程序数据的 MIME 消息部分。它通常用于将二进制文件作为附件添加到邮件中。
参数:
MIMEBase 的构造函数需要指定 _maintype 和 _subtype,用于指定消息的主类型和子类型。
MIMEApplication 的构造函数需要指定 _data 参数,表示要作为附件添加的数据,还可以指定 _subtype、_encoder 和其他 _params 参数。
默认的子类型:
MIMEBase 没有默认的子类型,需要手动指定 _subtype。
MIMEApplication 的默认子类型是 'octet-stream',通常用于表示未知或二进制数据。
编码器:
MIMEBase 没有默认的编码器,需要根据具体情况选择合适的编码方式。
MIMEApplication 的默认编码器是 email.encoders.encode_base64,用于将数据转换为 Base64 编码。
总的来说,MIMEBase 提供了一种通用的方式来创建和处理任意类型的 MIME 消息部分,而 MIMEApplication 则是 MIMEBase 的子类,专门用于表示应用程序数据的 MIME 消息部分,常用于添加二进制文件附件到邮件中。
- MIMEBase 类是表示 MIME 消息部分的基类,它通常用于创建特定 MIME 类型的自定义消息部分。其构造函数的签名如下:
MIMEBase(_maintype, _subtype, *, policy=compat32, **_params)
构造函数参数说明:
_maintype: 指定 MIME 消息主类型,例如 'text'、'image'、'audio' 等。
_subtype: 指定 MIME 消息子类型,例如 'plain'、'html'、'jpeg'、'pdf' 等。
policy: 控制邮件生成过程中的行为的策略对象,默认为 email.policy.compat32。
**_params: 可选参数,用于指定消息的 Content-Type 的其他参数,例如 charset 等。
你可以从 MIMEBase 类派生出自己的 MIME 部分类,并使用其构造函数来创建包含特定 MIME 类型的自定义消息部分。例如,MIMEText、MIMEImage 和 MIMEAudio 类都是从 MIMEBase 类派生而来的子类,用于分别表示文本、图像和音频数据。
- MIMEApplication 类是用于表示应用程序数据的 MIME 消息部分的一种特殊类型,在 Python 的 email.mime.application 模块中提供。它通常用于将二进制文件或应用程序特定格式的数据作为附件添加到电子邮件中。
MIMEApplication 类的构造函数签名如下:
MIMEApplication(_data, _subtype='octet-stream', *, policy=compat32, **_params)
构造函数参数说明:
_data: 要添加到消息部分的数据,可以是字节串或类文件对象。
_subtype: 指定消息部分的 MIME 子类型,默认为 'octet-stream',通常用于表示二进制数据。
policy: 控制邮件生成过程中的行为的策略对象,默认为 email.policy.compat32。
**_params: 可选参数,用于指定消息的 Content-Type 的其他参数,例如 charset、name 等。
MIMEApplication 类通常用于创建包含二进制数据的 MIME 邮件附件。你可以通过创建一个 MIMEApplication 对象,并将要添加的二进制数据作为 _data 参数传递给构造函数来实现这一功能。在创建完对象后,你可以将其作为附件添加到邮件中的 MIMEMultipart 对象中。
如果你需要在 Python 中处理邮件附件或将二进制文件添加到邮件中,MIMEApplication 类是一个非常方便和实用的工具。
- 使用 email.mime.application.MIMEApplication 类创建应用程序数据附件有如下优点:
# 简单方便:MIMEApplication 类封装了常见的应用程序数据类型,例如 TXT、PDF、ZIP 等,可以直接使用类名创建相应类型的附件。
因此,使用 MIMEApplication 创建应用程序数据附件非常简单和方便,无需手动设置附件的 MIME 类型和编码方式等信息。
# 易于阅读:由于 MIMEApplication 类已经将附件的 MIME 类型和编码方式等信息封装在内部,
因此,邮件消息中只需要添加附件内容即可,不需要手动设置复杂的头部信息,使邮件消息更加易于阅读和理解。
# 可扩展性强:由于 MIMEApplication 类是 email.mime.base.MIMEBase 的子类,
因此,它继承了父类的所有属性和方法,具有很强的可扩展性。如果需要定义自己的应用程序数据类型,只需要继承 MIMEApplication 类并重写相应的属性和方法即可。
# 总之,使用 MIMEApplication 类创建应用程序数据附件可以帮助我们更快速地构造邮件消息,减少出错的可能性,并提高代码的可读性和可维护性。
#下方代码已经测试,正常发送附件;(如果你需要使用,请向163申请登录授权码)
#保证代码py同目录下有附件document1/2/3.pdf存在;
from email.mime.base import MIMEBase
from email import encoders
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import smtplib
from email.mime.text import MIMEText
# 创建 MIMEMultipart 对象作为根容器
msg_root = MIMEMultipart()
# 发件人和收件人
sender = 'xxxx@163.com'
recipient = 'yyyy@163.com'
msg_root['Subject'] = '这是一封测试邮件,内嵌一张图片'
msg_root['From'] = sender
msg_root['To'] = recipient
# email.mime.base.MIMEBase:所有非文本和非图像类型文件的基类。常用方法包括:
# set_payload(payload):设置消息的内容。例如读取文件内容后使用 set_payload() 方法设置到邮件消息中。
# add_header(name, value):添加消息头部信息。
# 通过调用这个方法,可以为附件添加各种头部信息,如 Content-Disposition、Content-Type、Content-Transfer-Encoding 等,以描述附件的类型、处理方式和编码方式等属性。
# 使用 MIMEBase 类创建的具体对象,通常需要对其内容进行编码,以确保在包含非 ASCII 字符或二进制数据时能够正确传输和显示。
# 常见的编码方式包括 Base64 编码和 Quoted-Printable 编码。
# 在发送包含附件的邮件时,通常需要对附件的内容进行编码,以确保附件能够被正确地处理和传输。
# 一种常见的做法是使用 Base64 编码,可以通过调用 encoders.encode_base64() 方法来实现。
# 创建 MIMEBase 对象作为附件
with open("document3.pdf", "rb") as f:
attachment_data = f.read()
attachment_part3 = MIMEBase("application", "pdf",name ="document3.pdf")
# 使用 set_payload 方法将 attachment_data 设置为 attachment_part3 的主体内容。这样就将 PDF 文件的内容成功设置到了 MIME 部件中。
attachment_part3.set_payload(attachment_data)
# 使用 MIMEBase 类创建的具体对象,通常需要对其内容进行编码,以确保在包含非 ASCII 字符或二进制数据时能够正确传输和显示。
encoders.encode_base64(attachment_part3)
# 使用 set_payload 方法将 PDF 文件的内容设置为附件部件attachment_part3 的主体内容,
# 然后对内容进行 Base64 编码。
# 最后,通过 msg_root.attach(attachment_part3) 将这个附件部件添加到邮件消息中。
msg_root.attach(attachment_part3)
# 添加附件头部信息
# attachment_part.add_header("Content-Disposition", "attachment", filename="document1.pdf")
# attachment_part.add_header("Content-Type", "application/pdf")
# attachment_part.add_header("Content-Transfer-Encoding", "base64")
# 添加应用程序数据附件
with open("document1.pdf", "rb") as f:
data = f.read()
attachment_part1 = MIMEApplication(data, _subtype="pdf", name="document1.pdf")
# 将附件添加到邮件消息中
msg_root.attach(attachment_part1)
# MIMEApplication 类是用于表示应用程序数据的 MIME 消息部分的一种特殊类型,在 Python 的 email.mime.application 模块中提供。它通常用于将二进制文件或应用程序特定格式的数据作为附件添加到电子邮件中。
# MIMEApplication 类的构造函数签名如下:
# MIMEApplication(_data, _subtype='octet-stream', *, policy=compat32, **_params)
# 构造函数参数说明:
# _data: 要添加到消息部分的数据,可以是字节串或类文件对象。
# _subtype: 指定消息部分的 MIME 子类型,默认为 'octet-stream',通常用于表示二进制数据。
# policy: 控制邮件生成过程中的行为的策略对象,默认为 email.policy.compat32。
# **_params: 可选参数,用于指定消息的 Content-Type 的其他参数,例如 charset、name 等。
# MIMEApplication 类通常用于创建包含二进制数据的 MIME 邮件附件。你可以通过创建一个 MIMEApplication 对象,并将要添加的二进制数据作为 _data 参数传递给构造函数来实现这一功能。在创建完对象后,你可以将其作为附件添加到邮件中的 MIMEMultipart 对象中。
# 如果你需要在 Python 中处理邮件附件或将二进制文件添加到邮件中,MIMEApplication 类是一个非常方便和实用的工具。
# 添加应用程序数据附件
with open("document2.pdf", "rb") as f:
data = f.read()
attachment_part2 = MIMEApplication(data)
attachment_part2.add_header("Content-Disposition", "attachment", filename="document2.pdf")
msg_root.attach(attachment_part2)
# 使用 email.mime.application.MIMEApplication 类创建应用程序数据附件有如下优点:
# 简单方便:MIMEApplication 类封装了常见的应用程序数据类型,例如 TXT、PDF、ZIP 等,可以直接使用类名创建相应类型的附件。
# 因此,使用 MIMEApplication 创建应用程序数据附件非常简单和方便,无需手动设置附件的 MIME 类型和编码方式等信息。
# 易于阅读:由于 MIMEApplication 类已经将附件的 MIME 类型和编码方式等信息封装在内部,
# 因此,邮件消息中只需要添加附件内容即可,不需要手动设置复杂的头部信息,使邮件消息更加易于阅读和理解。
# 可扩展性强:由于 MIMEApplication 类是 email.mime.base.MIMEBase 的子类,
# 因此,它继承了父类的所有属性和方法,具有很强的可扩展性。如果需要定义自己的应用程序数据类型,只需要继承 MIMEApplication 类并重写相应的属性和方法即可。
# 总之,使用 MIMEApplication 类创建应用程序数据附件可以帮助我们更快速地构造邮件消息,减少出错的可能性,并提高代码的可读性和可维护性。
# 添加 HTML 正文
html = '''\
<html>
<head></head>
<body>
<p># 创建 MIMEBase 对象作为附件</p>
<p>with open("document3.pdf", "rb") as f:</p>
<p> attachment_data = f.read()</p>
<p>attachment_part3 = MIMEBase("application", "pdf",name ="document3.pdf")</p>
<p># 使用 set_payload 方法将 attachment_data 设置为 attachment_part3 的主体内容。这样就将 PDF 文件的内容成功设置到了 MIME 部件中。</p>
<p>attachment_part3.set_payload(attachment_data)</p>
<p># 使用 MIMEBase 类创建的具体对象,通常需要对其内容进行编码,以确保在包含非 ASCII 字符或二进制数据时能够正确传输和显示。</p>
<p>encoders.encode_base64(attachment_part3)</p>
<p># 使用 set_payload 方法将 PDF 文件的内容设置为附件部件attachment_part3 的主体内容,</p>
<p># 然后对内容进行 Base64 编码。</p>
<p># 最后,通过 msg_root.attach(attachment_part3) 将这个附件部件添加到邮件消息中。</p>
<p>msg_root.attach(attachment_part3)</p>
</body>
</html>
'''
part2 = MIMEText(html, 'html')
msg_root.attach(part2)
# 发送邮件
try:
server = smtplib.SMTP('smtp.163.com', 25)
server.ehlo()
server.starttls()
server.login('xxxx', '此处请向163申请登录授权码')
server.send_message(msg_root)
server.quit()
print('邮件发送成功')
except Exception as e:
print('邮件发送失败:', e)
正常发送邮件:
- # email.mime 模块是 Python 中用于创建和处理 MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)消息的模块。
# 它提供了一组类和函数,用于构建各种类型的 MIME 消息,例如文本、HTML、附件等,并将其用作电子邮件的内容。
# 下面是 email.mime 模块中主要的几个子模块和类:
# email.mime.text:用于创建纯文本消息的类。主要包含 MIMEText 类,可以设置文本内容、编码方式等属性。
# email.mime.image:用于创建图片消息的类。主要包含 MIMEImage 类,可以添加图像数据、设置图像类型等属性。
# email.mime.audio:用于创建音频消息的类。主要包含 MIMEAudio 类,可以添加音频数据、设置音频类型等属性。
# email.mime.multipart:用于创建多部分消息的类。主要包含 MIMEMultipart 类,可以添加多个子部分,例如文本、附件等。
# email.mime.application:用于创建应用程序特定消息的类。主要包含 MIMEApplication 类,可以添加应用程序特定的数据,例如 PDF、Excel 文件等。
# email.mime.base:包含一些基本的 MIME 类的基类和辅助函数。
# 这些类提供了一系列方法和属性,让你可以设置 MIME 消息的各种属性、添加附件、设置头部信息等。你可以使用这些类来构建符合 MIME 标准的消息,然后将其发送作为电子邮件。
- 每个类的构造函数和对应的媒体类型示例:
MIMEText:
构造函数:MIMEText(_text, _subtype='plain', _charset=None, *, policy=None)
示例:创建一个包含纯文本消息的对象
from email.mime.text import MIMEText
text = "这是一条纯文本消息。"
msg = MIMEText(text)
MIMEImage:
构造函数:MIMEImage(_imagedata, _subtype=None, *, policy=None, **_params)
示例:创建一个包含图像的对象
from email.mime.image import MIMEImage
with open('image.jpg', 'rb') as f:
image_data = f.read()
msg = MIMEImage(image_data, _subtype='jpeg')
MIMEApplication:
构造函数:MIMEApplication(_data, _subtype=None, *, policy=None, **_params)
示例:创建一个包含应用程序数据的对象
from email.mime.application import MIMEApplication
with open('document.pdf', 'rb') as f:
document_data = f.read()
msg = MIMEApplication(document_data, _subtype='pdf')
MIMEAudio:
构造函数:MIMEAudio(_audiodata, _subtype=None, *, policy=None, **_params)
示例:创建一个包含音频数据的对象
from email.mime.audio import MIMEAudio
with open('audio.mp3', 'rb') as f:
audio_data = f.read()
msg = MIMEAudio(audio_data, _subtype='mp3')
这些构造函数中的第一个参数 _data 或 _text 是必需的,它们分别指定了要包含在消息中的数据或文本内容。对于其他参数(如 _subtype、_charset 等),可以根据需要进行设置。
---------------------
在 Python 的 email 模块中,MIMEBase 类及其子类(如 MIMEText、MIMEImage 等)提供了一个 add_header() 方法,用于添加自定义的消息头部字段。
常见的一些消息头部字段包括但不限于:
Content-Type:指定消息主体的媒体类型和子类型,如 text/plain、text/html、image/jpeg、audio/wav、video/mp4、application/pdf等。
Content-Disposition:指定消息主体的处理方式,如 inline(内联显示)、attachment(作为附件下载)等。
Content-ID:指定消息主体的唯一标识符,在 multipart/related 消息中通常用于关联资源。
Content-Transfer-Encoding:指定消息主体的编码方式,如 base64、quoted-printable 等。
MIME-Version:指定 MIME 协议的版本号。
除了上述常见的消息头部字段外,您也可以根据需要添加其他自定义的消息头部字段,以满足特定的需求。
在使用 add_header() 方法时,需要指定头部字段的名称和值,例如:
message.add_header('Content-Type', 'text/plain; charset=utf-8')
message.add_header('Content-Disposition', 'attachment; filename="example.txt"')
message.add_header('Content-ID', '<image001>')
message.add_header('Content-Transfer-Encoding', 'base64')
通过适当设置这些消息头部字段,可以控制消息的内容类型、处理方式、编码方式等,在构建复杂的 MIME 消息时非常有用。