利用Python email的MIMEBase及MIMEApplication发送邮件附件

 **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 消息时非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/403933.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Video generation models as world simulators-视频生成模型作为世界模拟器

原文地址&#xff1a;Video generation models as world simulators 我们探索在视频数据上进行大规模生成模型的训练。具体来说&#xff0c;我们联合训练文本条件扩散模型&#xff0c;同时处理不同持续时间、分辨率和长宽比的视频和图像。我们利用一个在视频和图像潜在编码的时…

Redis信创平替之TongRDS(东方通),麒麟系统安装步骤

我的系统: 银河麒麟桌面系统V10(SP1)兆芯版 1.先进入东方通申请使用 2.客服会发送一个TongRDS包与center.lic给你(我这里只拿到.tar.gz文件,没有网上的什么安装版) 3.上传全部文件到目录中 4.服务节点安装,并启动 tar -zxvf TongRDS-2.2.1.2_P3.Node.tar.gz cd pmemdb/bin/…

c++实现栈和队列类

c实现栈和队列类 栈(Stack)Stack示意图Stack.cpp 队列(queue)queue 示意图queue.cpp 栈(Stack) Stack示意图 Stack.cpp #pragma once #include "ListStu.cpp"template<typename T> class Stack { public: /* * void push(T& tDate)* 参数一 &#xff1a;…

【Linux从青铜到王者】 基础IO

本篇重点&#xff1a;文件描述符&#xff0c;重定向&#xff0c;缓冲区&#xff0c;磁盘结构&#xff0c;文件系统&#xff0c;inode理解文件的增删查改&#xff0c;查找一个文件为什么一定要有路径&#xff0c;动静态库&#xff0c;有的时候为什么找不到库&#xff0c;动态库的…

SQL面试题及答案

介绍 在快节奏的数据管理和信息技术世界中,导航和操作结构化数据的能力是一项非常重要的技能。SQL,即结构化查询语言,是关系数据库的基石,掌握这种语言的专业人员的需求量很大。SQL 面试在科技行业很常见,潜在的候选人会接受测试以展示他们的知识和解决问题的能力。为了帮…

酷开科技丨新年新玩法!酷开系统壁纸模式给客厅“换”新

甲辰龙年即将到来&#xff0c;新年新家新气象&#xff0c;快到酷开系统壁纸模式中挑选一款喜欢的壁纸&#xff0c;为新的一年增添一份美好和喜悦吧&#xff01; 酷开科技将更多的电视新玩法带给你&#xff0c;让你的电视成为家庭中的焦点&#xff01;酷开系统壁纸模式&#xf…

【前端素材】推荐优质后台管理系统APP Zina平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;以便更好地理解其在不同方面的作用和实际运作。 1. 功能层次 a. 用户管理功能&#xff1a; 用户注册和登录&#xff1a;管理用户账户的注册和登录过程。权限管…

easyui 手风琴Accordion 面板的高度设置

今天接到一个新的小需求&#xff0c;如下图&#xff0c;当预算表单只有一个时&#xff0c;要求不显示预算表单这块的内容。 考虑到页面创建时用到了表单的回调和点击方法&#xff0c;所以不能单纯的移除&#xff0c;移除右侧表格的创建会报错&#xff0c;所以只能隐藏。 隐藏…

突破挑战:利用沃尔玛跨境智星实现批量注册与下单

在进行沃尔玛测评时&#xff0c;确保环境安全至关重要。每个账号都应使用独立的运行环境&#xff0c;这样可以避免浏览器指纹、字体以及浏览器数据之间的关联问题。此外&#xff0c;账号的资料也需要特别注意。最好是自己注册自己下单&#xff0c;这样可以确保所有资源都掌握在…

JAVA工程师面试专题-并发编程篇

目录 一、线程 1、并发与并行的区别 2、同步和异步的区别 3、Java中创建线程有哪些方式? 4、Thread和Runnable的区别 5、Java中的Runnable、Callable、Future、FutureTask的区别和联系&#xff1f; 6、说一下你对 CompletableFuture 的理解 7、volatile关键字有什么用&…

如何下载 VisualStudio2022 离线包

1.概要&#xff0c;有些场景下&#xff0c;不允许联网&#xff0c;需要下载离线安装包。 2.过程 2.1 下载地址 创建基于网络的安装 - Visual Studio (Windows) | Microsoft Learn 2.2 选择引导程序 2.3 执行命令 2.3.1 下载全部&#xff1a; vs_Enterprise.exe --layout …

芯科科技与Arduino携手推动Matter普及化

双方的合作可助力开发人员在两分钟内将新开发板配置入网 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;日前宣布&#xff0c;公司与开源硬件和软件领域的…

如何判断领导是在培养你,还是在压榨你?

在职场中&#xff0c;判断领导的真实意图并非易事。有时&#xff0c;他们的行为可能让人困惑&#xff0c;不清楚他们是在真心培养你&#xff0c;还是在过度压榨你。 在职场提高工作效率&#xff0c;我们可以使用进度猫这样的项目管理工具来管理任务。通过使用进度猫甘特图&am…

【linux进程间通信(二)】共享内存详解以及进程互斥概念

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程间通信 1. 前言2. 共享内…

2024高效神器:思维导图,让你的思维飞翔!

在信息爆炸的时代&#xff0c;如何高效地处理、整合和记忆海量信息成为了摆在我们面前的一大挑战。而在这个关键时刻&#xff0c;思维导图凭借其独特的优势&#xff0c;正逐渐成为2024年最受欢迎的高效神器。那么&#xff0c;思维导图究竟有何魅力&#xff0c;能够助我们一臂之…

【Linux进程】冯·诺依曼体系结构以及操作系统的深入理解

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.冯诺依曼体系结构特…

igolang学习2,golang开发配置国内镜像

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct

问题1-spring-boot版本和org.springframework的spring-web兼容的版本

报错问题如下&#xff1a; Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.createHandlerMethod(AbstractHandlerMeth…

全国均薪20.7W!PMP持证者越来越吃香了!

摘要&#xff1a;现如今&#xff0c;PMP已成为全球公认的项目管理专业资格认证之一&#xff0c;得到许多国家专业人士的认可。在我国&#xff0c;项目经理的平均年薪达到了20.7w&#xff01; PMP最早是由PMI发起&#xff0c;已成为全球公认的项目管理专业资格认证之一&#xff…

音视频技术-电脑连接调音台时交流声的产生与消除

当电脑(笔记本/台式机)声卡通过音频线与调音台(或扩音机)连接时,能听到“交流声”。有时很轻微,有时很明显,甚至干扰正常的演讲或发言。 很多时候,我们在台上演讲时,都会使用电脑播放PPT,遇到视频时,还需要将视频中的音频扩大。电脑音频的输出口一般都是3.5的,我们…