如何使用Perl提取SMTP信封和标头?

时间:2009-09-22 09:40:44

标签: perl smtp

什么是SMTP Envelope和SMTP标头以及它们之间的关系是什么?如何用Perl提取它们?

4 个答案:

答案 0 :(得分:4)

信封是在初始会话期间通过“MAIL FROM:”和“RCPT TO:”命令发送到服务器的寻址信息。

SMTP标头是在发出DATA命令后发送的标题行的集合。

您如何找到它们取决于您从何处/何处收到消息,我们需要更多线索来尝试回答这些消息。

答案 1 :(得分:4)

SMTP邮件包含一组标题,例如From,To,CC,Subject和一系列其他内容。

SMTP信封只是在邮件传输代理(即SMTP服务器)移动邮件时,为标准SMTP邮件前缀的一小组标题指定的名称。最常见的信封标题是X-Sender,X-Receiver和Received。

例如,微软SMTP服务器将消息放入其Drop文件夹时,将X-Sender和一系列X-Receiver标头添加到邮件顶部。每个邮箱都有一个X-Receiver,与Drop文件夹所用的域相匹配。

另一个示例是SMTP服务器在收到来自其他SMTP服务器的邮件时添加Receive:标头。此标题提供了交换的各种详细信息。因此,一旦到达最终目的地,tinternet上的大多数电子邮件将具有一系列接收标头,指示SMTP服务器跳过该消息到达的消息。通常,当邮件最终移动到POP3邮箱时,服务器会删除X-Sender,X-Receiver标头。

访问标题

在Windows平台上,我发现访问信封标题的唯一方法是简单地打开并解析eml文件。它是一种非常简单的格式(namevalue CR LF)。

再次在Windows平台上,可以使用基于CDOSYS.dll COM的对象集访问主要的邮件头和正文部分。你如何在我不知道的其他平台上做到这一点。然而,根据信封标题,标题格式非常简单,它可以访问需要更多创意编码的正文部分。

答案 2 :(得分:1)

对于Perl电子邮件相关内容,请查看Perl Email Project

答案 3 :(得分:1)

你可以在这里想到三件不同的事情。在SMTP MTA之间交换了指令(在消息的每一跳期间)...... MUA生成的标头和MTA沿着给定消息遍历的路由添加(或修改)的标头。

“信封”是指提供给MTA的信息(通常是最近或最终目的地MTA)。发件人在SMTP连接中的DATA指令之后包含一组标题(通过空行与消息正文分开...但如果具体应该是CR / LF对,请仔细检查RFC)。请注意,本地MTA可能会添加额外的标头,甚至可能在存储或转发消息之前修改某些标头。

(通常它只应添加Received-by:headers)。

某些MTA配置为添加X-Envelope-To:和/或X-Envelope-From:标头。其中一些仍将过滤这些标题的内容(例如,以防止盲目的副本泄漏)。 (Senario:原来的MUA有一个BCC:行目录,在邮件中复制了许多人,他们的名字在CC:header中相互出现;对于每个收件人域(MX结果),MTA只会发出RCPT TO:仅对于主机(如果有适当的结果)(其自己的集线器,智能主机或目标的任何有效MX)的地址子集 - 因此任何彼此共享MX的接收者子集都会看到泄漏X-Envelope-To:由MTA生成的标题,这些标题对于处理这个细节很邋。)。

此外,Envelope-From行不会包含SMTP交换中HELO FROM:或EHLO FROM:指令提供的主机/域名。例如,它不能用作回复地址。