12

Gmailで[オリジナルを表示]をクリックして取得するのと同じように、生のメールデータ全体(添付ファイルを含む)をダウンロードする方法を探しています。

現在、次のコードで生のヘッダーとメール本文の一部を取得できます。

$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番目のパラメーターを変更すると、エンコードされた添付ファイルが返される可能性があることも知っています。生の電子メールを部分的に取得するためにここでループが必要だと思いますが、ループを停止するための条件は何ですか?

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

どんな助けでもいただければ幸いです。

4

4 に答える 4

19

同じ問題を探していたときに、この質問に出くわしました。私はそれがhakreによる解決策よりも簡単でなければならないことを知っていました、そして私は5年前からimap_fetchbodyの投稿のページで正しい答えを見つけました。

完全な生のメッセージを取得するには、次を使用します。

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

imap_fetchbodyこの3番目のパラメータは、ヘッダーとすべての本文を含む、電子メールのすべての部分とサブ部分を示しているため、空の文字列に注意してください。

于 2015-01-27T04:48:59.687 に答える
9

hakreによる答えは完全ではありません。構造をあまり気にしないのであれば、imap_fetchstructureは必要ありませ

単純な「ソースの表示」の場合、必要なのは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;
}
于 2013-07-26T09:39:19.640 に答える
4

私の答えは「過剰」です。電子メールの構造全体が必要ない場合の、より簡単な「ソースの表示」方法については、 BoyBaukemaの回答を参照してください。

すべてをフェッチしたい場合は、フェッチする必要があります

mime-messageは複数の本文を持つことができるため、各部分を次々に処理する必要があります。サーバーへの負荷を減らすには、のFT_PREFETCHTEXTオプションを使用しますimap_fetchheader別の回答のいくつかのサンプルコードimap_fetchstructureは、imap接続の処理と、カプセル化によってすでにメッセージの一部を反復処理することを示しています。

于 2012-04-24T07:49:11.500 に答える
0

よくある間違いは、"\n"またはを使用することPHP_EOLです。

RFC RFC821、RFC2060、RFC1939に従って"\r\n"使用する必要があります。一部のメールサーバーはその間違いを自動変換しますが、Cyrusは自動変換せず、すばらしいエラーをスローします。

PHP_EOLは定数に依存するシステムです。たとえば、"\n"Linux、"\r"Mac、 Windowsにあります。"\r\n"

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

 $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno);
于 2014-04-09T21:13:28.073 に答える