2
--047d7b33d6decd251504bfe78895
Content-Type: multipart/alternative; boundary=047d7b33d6decd250d04bfe78893

--047d7b33d6decd250d04bfe78893
Content-Type: text/plain; charset=UTF-8

twest

ini sebuah proiduct abru

awdawdawdawdwa

aw
awdawdaw

--047d7b33d6decd250d04bfe78893
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div class=3D"gmail_quote">twest=C2=A0<div><br></div><div>ini sebuah proidu=
ct abru</div><div><br></div><div>awdawdawdawdwa</div><div><br></div><div>aw=
</div><div>awdawdaw</div>
</div><br>

--047d7b33d6decd250d04bfe78893--
  1. メールのtext/plainとtext/htmlのコンテンツを正規表現で取得するにはどうすればよいですか?
  2. メールにはコンテンツ本文が1つしかありませんか?text/htmlとtext/plainで構成されます

*ここに、現在間違っていることのスニペットがあります。

    $parts = explode('--', $this->rawemail);
    $this->headers = imap_rfc822_parse_headers($this->rawemail);
    # var_dump($parts);
    # Process the parts
    foreach ($parts as $part) 
    {
        # Get Content text/plain
        if (preg_match('/Content-Type: text\/plain;/', $part)) 
        {
            $body_parts = preg_split('/\n\n/', $part);

            # If Above the newline (Headers)
            if ($body_parts[0]) 
            {
                # var_dump($body_parts[0]);
            }

            # If Below the newline (Data)
            if ($body_parts[1]) 
            {
                var_dump($body_parts[1]);
            }
        }

        # Get Content text/html
        if (preg_match('/Content-Type: text\/html;/', $part)) 
        {
            $body_parts = preg_split('/\n\n/', $part);

            # If Above the newline (Headers)
            if ($body_parts[0]) 
            {
                # var_dump($body_parts[0]);
            }

            # If Below the newline (Data)
            if ($body_parts[1]) 
            {
                var_dump($body_parts[1]);
            }
        }
4

1 に答える 1

4

電子メールの構成でより重要なのは改行であるため、一度に電子メールの行を下っていく方がよいと思います。

あなたのルールは次のようになります。

  • 改行が 2 つある場合は、本文が開始されます - プレーン テキスト タイプ (どちらを示すかを示すヘッダーがないため)。
  • それ以外の場合は、「境界 =」ビットを取得するまで続行し、境界を記録して「境界を探す」モードにホップします。
  • 次に、境界が見つかったら、"Looking for content-type or double new-line" モードに入り、Content-Type (および content-Type に注意) または double new-line (ヘッダーが終了し、本文が次に来る) を探します。次の境界まで)
  • メッセージの本文を読んでいる間、「境界を探す」モードに戻ってプロセスを繰り返します。

昔から覚えていることなので、以下は 100% 正確ではないかもしれませんが、念のため言及します。2 つの「境界」マーカーを取得できるため、添付ファイルを含むファイルには注意してください。しかし、1 つの境界が別の境界内にあるため、上記のルールに従う (つまり、最初の境界を取得してそれに固執する) 場合は問題ありません。ただし、いくつかの添付ファイルを使用してスクリプトをテストしてください:)


編集:質問で尋ねられた追加情報。電子メールには、ユーザーがエンコードしたい数の「本文」を含めることができます。プレーン、HTML、UTF エンコード バージョン、RTF バージョン、またはモールス符号バージョン (クライアントが "Content-Type Morse/Code" の処理方法を知っていれば!) を使用できます。場合によっては、プレーン テキストが表示されず、HTML バージョンのみが表示されることがあります (悪意のあるユーザー)。HTML が実際にはコンテンツ タイプの宣言なしで提供される場合があります (クライアントによっては、HTML として表示される場合とされない場合があります)。境界もアタッチメントを分割します。リッチ テストは Outlook の落とし穴です (ただし、公平を期すために、通常は HTML に変換されます)。いいえ、0 から X 体のどこかにあります。

于 2012-05-16T11:10:22.723 に答える