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 形式で複数のメッセージを集約するアーカイブのデコードをサポートします。デコードされたメッセージ データは、メッセージ ファイルまたはデータ文字列で見つかった 1 つ以上のメッセージを記述する配列として返されます。マルチパート メッセージの本文は、個別のサブメッセージにデコードできます。メッセージ本文のデータをデコードして別のファイルに保存できるため、クラスは使用可能なメモリよりも大きなメッセージを処理できます。

于 2013-02-10T21:00:08.600 に答える
2

はい、もちろんあります:mailparse

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

于 2013-02-06T09:02:47.523 に答える
1

ounce_driver.classを使用して、メールを配列に切り刻むことができます。

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

于 2013-02-06T09:05:28.317 に答える
1

IMAP および POP メッセージを読むのに便利な機能を備えた IMAP 拡張機能を使用することをお勧めします。を使用して接続を開きimap_open、 を使用してヘッダーを読み取ります。imap_headerinfoすべてのヘッダー (Subject、To、...) を含む配列を返し、 を使用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 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";
}
于 2013-02-06T09:01:49.797 に答える