我使用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;
答案 0 :(得分:6)
查看MIME E-mail message parser课程。
根据作者的描述:
此类可用于解析和解码MIME电子邮件。它 支持解码单个RFC 2822 MIME消息或存档 以mbox格式聚合多条消息。 已解码的消息 数据作为描述一个或多个找到的消息的数组返回 在消息文件或数据字符串中。多部分消息的主体可以 被解码成不同的子消息。消息正文数据可以 解码并保存到单独的文件中,因此该类可以处理消息 大于可用内存。
答案 1 :(得分:2)
是的,当然有:mailparse
答案 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";
}