python email模块
email模块
电子邮件包是一个用于管理电子邮件消息的库。它的特殊设计不用于向SMTP (RFC 2821)、NNTP或其他服务器发送任何电子邮件消息;这些是模块的函数,如smtplib和nntplib。电子邮件包尝试尽可能符合RFC,支持RFC 5233和RFC 6532,以及与mime相关的RFC 2045、RFC 2046、RFC 2047、RFC 2183和RFC 2231。
电子邮件包的总体结构可以分为三个主要组件,以及控制其他组件行为的第四个组件。
包的核心组件是表示电子邮件消息的“对象模型”。应用程序主要通过消息子模块中定义的对象模型接口与包进行交互。应用程序可以使用这个API询问关于现有电子邮件的问题,构造新的电子邮件,或者添加或删除本身使用相同对象模型接口的电子邮件子组件。也就是说,根据电子邮件消息及其MIME子组件的性质,电子邮件对象模型是所有提供EmailMessage API的对象的树结构。
包的另外两个主要组件是解析器和生成器。解析器获取电子邮件消息的序列化版本(字节流),并将其转换为EmailMessage对象树。生成器接收电子邮件消息并将其转换回序列化的字节流。(解析器和生成器也处理文本字符流,但不建议使用这种用法,因为很容易出现以某种方式无效的消息。)
控制组件是策略模块。每个电子邮件消息、每个生成器和每个解析器都有一个关联的策略对象来控制其行为。通常,应用程序只需要在创建EmailMessage时指定策略,方法是直接实例化EmailMessage来创建新电子邮件,或者使用解析器解析输入流。但是,当使用生成器序列化消息时,策略可以更改。例如,这允许从磁盘解析一般的电子邮件消息,但是在将其发送到电子邮件服务器时,可以使用标准SMTP设置对其进行序列化。
电子邮件包尽力向应用程序隐藏各种治理rfc的详细信息。从概念上讲,应用程序应该能够将电子邮件消息视为unicode文本和二进制附件的结构化树,而不必担心这些附件在序列化时是如何表示的。然而,在实践中,经常需要了解至少一些管理MIME消息及其结构的规则,特别是MIME“内容类型”的名称和性质,以及它们如何标识多部分文档。在大多数情况下,这些知识只应该在更复杂的应用程序中使用,即使在这种情况下,也应该只是高级结构,而不是那些结构如何表示的细节。由于MIME内容类型在现代互联网软件中被广泛使用(不仅仅是电子邮件),这对许多程序员来说将是一个熟悉的概念。
以下部分描述了电子邮件包的功能。我们从消息对象模型开始,它是应用程序将使用的主要接口,然后是解析器和生成器组件。然后介绍策略控制,它完成了对库的主要组件的处理。
接下来的三个部分将讨论包可能引发的异常和解析器可能检测到的缺陷(不符合rfc)。然后,我们将介绍headerregistry和contentmanager子组件,它们分别为更详细地操作头部和有效负载提供了工具。这两个组件都包含与消费和生成非平凡消息相关的特性,而且还记录了它们的可扩展性api,这将是高级应用程序感兴趣的。
下面是一组使用前面几节中介绍的api的基本部分的示例。
上面所示的是电子邮件包的现代(unicode友好)API。余下的部分,从Message类开始,将介绍遗留的compat32 API,它更直接地处理如何表示电子邮件消息的细节。compat32 API不会向应用程序隐藏rfc的细节,但是对于需要在该级别上操作的应用程序,它们可能是有用的工具。由于向后兼容性的原因,本文档还适用于仍然使用compat32 API的应用程序。
在3.6版更改:文档重组和重写,促进新的EmailMessage / EmailPolicy API。
Contents of the email package documentation:
email.message: Representing an email message
email.parser: Parsing email messages
FeedParser API
Parser API
Additional notes
email.generator: Generating MIME documents
email.policy: Policy Objects
email.errors: 异常和缺陷类
email.headerregistry: Custom Header Objects
email.contentmanager: Managing MIME Content
Content Manager Instances
email: 示例
Legacy API:
email.message.Message: Representing an email message using the compat32 API
email.mime: Creating email and MIME objects from scratch
email.header: Internationalized headers
email.charset: Representing character sets
email.encoders: Encoders
email.utils: 其他工具
email.iterators: Iterators
Email模块
如果想在邮件中携带附件、使用html书写邮件,附带图片等等,就需要使用email模块及其子模块。下面来看看email包,email包是用来管理email信息的,它包括MIME和其他基于RFC 2822的消息格式。email包的主要特征是在它内部解析和生成email信息是分开的模块来实现的。
MIME消息由消息头和消息体两大部分组成,在邮件里就是邮件头和邮件体。邮件头与邮件体之间以空行进行分隔。
邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的。
邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。最常见的类型有text/plain(纯文本)和text/html(超文本)。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。
在email的包里面包含了很多模块:
主要来看看email.mime,在邮件中携带附件、图片、音频时,主要使用的是该模块。一般情况下,你通过解析一个文件或者一段text来生成一个消息对象结构,你也可以从头开始建立一个消息结构,实际上,你可以给一个已经存在的消息结构追加一个新的消息对象。你可以通过创建message实例来创建一个对象结构,然后给该结构追加附件和头部信息。email包提供了一些子类使得该操作变得很容易。
模拟在邮件内容中携带图片,如下:
邮件内容中携带图片
邮件中携带附件
发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送
模拟在 邮件中携带附件 ,如下:
SMTP
SMTP模块的方法:
1.注意:本人测试使用新浪邮箱:
2.如果你们使新浪邮箱一定要开启POP3/SMTP服务:
3.另外注意:本人登陆使用的是用户名密码,但是如网易邮箱,登陆需要授权码!
使用sendmail发送邮件得测试代码
爬取天气预报并发到指定人的QQ邮箱(使用新浪邮箱)