PHPで生メールをパースする方法:包括的ガイド

生メールをパースすることは厄介な作業になることがあります。特に、異なるフォーマットや設定に直面するとそうなります。もし、わずかな変更で崩壊する不安定な方法や力任せの解決策に悩まされているなら、あなたは一人ではありません。同様の問題に直面する多くの開発者がいます。メールメッセージの要素—件名、送信者、本文、添付ファイルなど—を効果的に処理しようとする際には特にです。このガイドでは、PHPで生メールを効率的かつ正確にパースする方法を分解して説明します。

メール構造の理解

コーディングに入る前に、RFC2822などの標準によって定義されたメールの基本的な構造を理解することが重要です。メールは2つの主要なコンポーネントで構成されています:

  1. ヘッダー:メールに関するメタデータが含まれています。
  2. 本文:メールの実際の内容です。

メールフォーマット

適切に形成されたメールは一般的に次のように見えます:

HEADERS

BODY

ヘッダーと本文の間の区切りは、二重の改行で示されます。

ヘッダーと本文の詳細

  • ヘッダー:各ヘッダーは次の形式に従います:

    HSTRING:HTEXT
    
    • HSTRINGは、行の先頭に空白やコロンなしで始まります。
    • HTEXTには、空白の後に改行が続く場合、さまざまなテキスト文字を含むことができます。
  • 本文:これは最初の空行の後に続くデータを含みます。例えば:

HEADER: HEADER TEXT
HEADER: MORE HEADER TEXT
HEADER: LAST HEADER

THIS IS ANY
ARBITRARY DATA

PHPで生メールをパースする

構造が理解できたので、PHPで生メールをパースする方法をステップバイステップで見ていきましょう。

ステップ1:生メールデータを読み込む

まず、生メールデータを読み込む必要があります。PHPスクリプトがパイプを通じてメールを処理するように設定されている場合、通常は標準入力から受信データを直接キャプチャします。

例:

$raw_email = file_get_contents('php://stdin'); // 実際の入力方法に置き換えてください

ステップ2:生メールをヘッダーと本文に分割する

次に、生メール文字列をヘッダーと本文に分割する必要があります:

list($headers, $body) = explode("\n\n", $raw_email, 2);

ステップ3:ヘッダーをパースする

explode関数を使用して、個々のヘッダーを分割します:

$header_lines = explode("\n", $headers);
$parsed_headers = [];

foreach ($header_lines as $line) {
    // 続き行を処理
    if (isset($current_header)) {
        $parsed_headers[$current_header] .= ' ' . trim($line);
    } else {
        list($key, $value) = explode(':', $line, 2);
        $current_header = trim($key);
        $parsed_headers[$current_header] = trim($value);
    }
}

ステップ4:本文を処理する

本文にはさまざまな形式が含まれている可能性があるため、MIMEタイプを適切に処理することを確認してください。プレーンテキスト、HTML、または添付ファイルに遭遇する可能性があります。本文を読む方法は次の通りです:

$body = trim($body);

特定のニーズに応じて、本文コンテンツの処理や保存に関して追加のロジックが必要な場合があります。

結論

PHPで生メールをパースすることは、フレームワークなしで処理できる基本的なタスクですが、メールフォーマットの仕組みを明確に理解していることが前提です。このガイドに outlined されたステップに従うことで、受信メールの変動に関係なく一貫して動作する効果的なパーサーを作成することができます。

質問がある場合や具体的なユースケースについてさらに指導が必要な場合は、お気軽にご連絡ください。良いコーディングを!