如何从POP3电子邮件中提取数据?

时间:2013-02-06 08:58:24

标签: php email pop3

我使用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;

5 个答案:

答案 0 :(得分:6)

查看MIME E-mail message parser课程。
根据作者的描述:

  

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

答案 1 :(得分:2)

是的,当然有:mailparse

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

我建议使用具有有用功能的IMAP扩展来读取IMAP&amp; amp; POP消息。 使用imap_open打开connexion,然后使用imap_headerinfo读取标题,它将返回一个包含所有标题(Subject,To,...)的数组,然后使用imap_body来获取信息。 在不使用Regex或其他功能的情况下解析所有消息很容易。 你可以找到here一个简单的例子。

以下是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
)

答案 4 :(得分:0)

您是否尝试过Zend Framework的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";
}