4

我使用 PHP 接收来自 POP3 服务器的电子邮件。我有一个包含标题和正文的原始字符串。如何以类或数组的形式解析标题和正文?

我所拥有的示例:

Return-path: Envelope-to: x@x.de Delivery-date:
Wed, 06 Feb 2013 09:35:37 +0100 Received: from mail by
host6.toxpress.com with spam-scanned (Exim 4.80.1) (envelope-from ) id
1U30Tc-0003sH-LQ for x@x.de; Wed, 06 Feb 2013
09:35:36 +0100 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06)
on host6.toxpress.com X-Spam-Level: X-Spam-Status: No, score=-1.9
required=5.0 tests=BAYES_00,FREEMAIL_FROM,
RCVD_IN_DNSWL_NONE,TVD_SPACE_RATIO autolearn=ham version=3.3.2
Received: from moh3-ve2.go2.pl ([193.17.41.86] helo=moh3-ve1.go2.pl)
by host6.toxpress.com with esmtp (Exim 4.80.1) (envelope-from ) id
1U30Tc-0003rk-2b for x@x.de; Wed, 06 Feb 2013
09:35:32 +0100 Received: from moh3-ve1.go2.pl (unknown [10.0.0.157])
by moh3-ve1.go2.pl (Postfix) with ESMTP id BC734AF611B for ; Wed, 6
Feb 2013 09:34:31 +0100 (CET) Received: from unknown (unknown
[10.0.0.108]) by moh3-ve1.go2.pl (Postfix) with SMTP for ; Wed, 6 Feb
2013 09:34:31 +0100 (CET) Received: from
43.dynamic.chello.pl [89.69.42.127] by poczta.o2.pl with
ESMTP id jtIGfv; Wed, 06 Feb 2013 09:34:31 +0100 Message-ID:
<51121593.3090008@o2.pl> Date: Wed, 06 Feb 2013 09:34:27 +0100 From:
Tomasz Reply-To: tomasz_smykrowski@o2.pl Organization: Tomasz
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101
Thunderbird/20.0a2 MIME-Version: 1.0 To: x@x.de
Subject: adaads Content-Type: text/plain; charset=ISO-8859-1;
format=flowed Content-Transfer-Encoding: 7bit X-O2-Trust: 2, 64
X-O2-SPF: neutral dsadasdsaas .

而我希望能够做到的:

echo $from;
echo $replyTo;
echo $date;
echo $body;
echo $subject;
echo $charset;
4

5 回答 5

6

查看MIME 电子邮件消息解析器类。
根据作者的描述:

此类可用于解析和解码 MIME 电子邮件消息。它支持解码单个 RFC 2822 MIME 消息或以 mbox 格式聚合多条消息的存档。解码后的消息数据以数组形式返回,该数组描述在消息文件或数据字符串中找到的一条或多条消息。多部分消息的主体可以被解码为不同的子消息。消息正文数据可以解码并保存到单独的文件中,因此该类可以处理大于可用内存的消息。

于 2013-02-10T21:00:08.600 回答
2

是的,当然有:mailparse

http://php.net/manual/en/book.mailparse.php

于 2013-02-06T09:02:47.523 回答
1

您可以使用bounce_driver.class将电子邮件切成数组:

https://github.com/cfortune/PHP-Bounce-Handler/blob/master/bounce_driver.class.php

于 2013-02-06T09:05:28.317 回答
1

我建议使用具有有用功能的 IMAP 扩展来读取 IMAP 和 POP 消息。使用 打开连接imap_open,然后使用 读取标头imap_headerinfo,它将返回一个包含所有标头(主题,收件人,...)的数组,然后用于imap_body获取消息的正文。无需使用 Regex 或其他函数即可轻松解析所有消息。你可以在这里找到一个简单的例子。

这是一个简单的输出imap_headerinfo

stdClass Object (
    [Date] => 23 Apr 2003 22:10:21 +0100
    [Subject] => Top Deals: GBP 15 Gift Certificate Offer and at Least 30% off Recommended Books
    [message_id] => <.AAA-39045660-13180,1295.1051132221@mail-ems-103.amazon.com>
    [toaddress] => xxxx@yyyy.co.uk
    [to] => Array ([0] => stdClass Object ([mailbox] => xxxx [host] => yyyy.co.uk ) )
    [fromaddress] => "Amazon.co.uk" <foryou@amazon.co.uk>
    [from] => Array ( [0] => stdClass Object ( [personal] => Amazon.co.uk [mailbox] => foryou [host] => amazon.co.uk ) )
    [reply_toaddress] => "Amazon.co.uk" <foryou@amazon.co.uk>
    [reply_to] => Array ( [0] => stdClass Object ( [personal] => Amazon.co.uk [mailbox] => foryou [host] => amazon.co.uk ) )
    [senderaddress] => "Amazon.co.uk" <foryou@amazon.co.uk>
    [sender] => Array ( [0] => stdClass Object ( [personal] => Amazon.co.uk [mailbox] => foryou [host] => amazon.co.uk ) )
    [Recent] =>
    [Unseen] =>
    [Flagged] => F
    [Answered] =>
    [Deleted] =>
    [Draft] =>
    [Msgno] => 250
    [MailDate] => 23-Apr-2003 22:22:32 +0100
    [Size] => 36375
    [udate] => 1051132952
)
于 2013-02-06T09:25:08.017 回答
0

你试过 Zend 框架的Zend_Mail模块吗?

根据手册页: *Zend_Mail 可以从多个本地或远程邮件存储中读取邮件消息。它们都具有相同的基本 API 来计算和获取消息,其中一些实现了额外的接口以实现不那么常见的功能。*

http://framework.zend.com/manual/1.12/en/zend.mail.read.html

$mail = new Zend_Mail_Storage_Pop3(array('host'     => 'localhost',
                                         'user'     => 'test',
                                         'password' => 'test'));

echo $mail->countMessages() . " messages found\n";
foreach ($mail as $message) {
    echo "Mail from '{$message->from}': {$message->subject}\n";
}
于 2013-02-06T09:01:49.797 回答