2012-04-24 12 views
9

Gmailで「オリジナルを表示」をクリックすると、元のメールデータ(添付ファイルを含む)全体をダウンロードする方法を探しています。imap拡張子を持つ生の電子メールデータを取得するには?

現在、私はこのコードによって、生のヘッダとメール本文の一部を取得することができます:

$this->MailBox = imap_open($mailServer, $userName, $password, OP_SILENT); 
... 
$email->RawEmail = imap_fetchbody($this->MailBox, $msgNo, "0"); 
$email->RawEmail .= "\n".imap_fetchbody($this->MailBox, $msgNo, "1"); 

また、私はimap_fetchbodyの3番目のパラメータを変更すると、エンコードされた添付ファイルを返す可能性があることを知っています。私は未処理の電子メールをパートごとに取得するためにここにループが必要ですが、ループを停止する条件は何ですか?

一度にメール全体を簡単に取得する方法はありますか?

ご協力いただければ幸いです。あなたはすべてを取得したい場合は

答えて

5

は、あなたが

mime-messageは複数のボディを持つことができるため、各パートを別々に処理する必要があります。サーバーへの負荷を軽減するには、imap_fetchheaderの場合はFT_PREFETCHTEXTオプションを使用します。いくつかの例では、code about imap_fetchstructure in another answerは、imap接続を処理し、カプセル化によってすでにメッセージの一部を繰り返し処理していることを示しています。

+1

'' imap_fetchbody($ imap_stream、$ msg_num、 "") ''を使ってスクロールダウンすると、はるかに簡単で、魅力的です! –

+0

これが境界を取得しないので、これが質問に答えるかどうかもわかりません。 – MrMesees

8

hakreの回答は完全ではありません。構造について本当に気にしなければ、​​は必要ありません。

シンプルな「ソースを表示」の場合は、imap_fetchheaderimap_bodyのみ必要です。

例:

$conn = imap_open('{'."$mailServer:$port/pop3}INBOX", $userName, $password, OP_SILENT && OP_READONLY); 
$msgs = imap_fetch_overview($conn, '1:5'); /** first 5 messages */ 
foreach ($msgs as $msg) { 
    $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno); 
    print $source; 
} 
0

共通の間違いは"\n"又はPHP_EOLを使用することです。

RFC RFC821によると、RFC2060、RFC1939 "\r\n"が使用されます。 いくつかのメールサーバはその間違いを自動的に変換しますが、Cyrusは良いエラーを投げません。

PHP_EOLは、システムによって異なりますが、Linuxでは"\n"、Macでは"\r"、Windowsでは"\r\n"などです。

さらにimap_fetchheader()には、予期したとおりに末尾に"\r\n"が含まれています。したがって、正しい例は次のようになります:

$source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno); 
12

私は同じ問題を探していたときに私はこの質問に出くわしました。私はそれがhakreによる解決策よりも簡単でなければならないことを知っていたし、imap_fetchbodyのページの正しい回答がpost from 5 years agoにあった。

は完全な生のメッセージは、単に以下の使用取得するには:

$imap_stream = imap_open($server, $username, $password); 
$raw_full_email = imap_fetchbody($imap_stream, $msg_num, ""); 

お知らせimap_fetchbody本の三番目のパラメータとして空の文字列は、ヘッダーとすべての団体を含むすべての部品や電子メールのサブ部分を、意味します。

+0

すごい!添付ファイルを取得しますか? – VeeeneX

+2

@VeeeneXはい、すべてを取得します。添付ファイルは、通常、base64でエンコードされているデコードする必要があります。今日、電子メールプロバイダは、OneDrive/GoogleDriveを使用して「添付ファイル」を送信することを許可しています。これらはTrue添付ファイルではなく、取得されません。 –

+0

これは最善の解決策です。完全なメッセージを取得するためには1行で、それをパーサーに送ることができます。 $ raw_full_email = imap_fetchbody($ handle、$ num、 ""); $パーサー=新しいPhpMimeMailパーサー\パーサー(); $ Parser-> setText($ raw_full_email); – Tramov

関連する問題