これは少し複雑なケースです。の場合はcontent-type
、multipart/mixed
メールが複数あることを意味します。これらの 1 つ以上が添付ファイルである可能性があります (html 領域またはプレーン テキストを含む可能性に加えて)。
content-type
がの場合、multipart/mixed
境界も与えられます。この正規表現を使用して、マルチパート メールを扱っているかどうかを判断できます。
$contentType = $this->GetHeader('content-type');
$regex = '%multipart.*?boundary\s*=\s*"?(\w+)?"?%is';
$matches = array();
if (preg_match($regex, $contentType, $matches)) {
$this->isMultiPart = true;
$this->boundary = $matches[1];
} else {
$this->isMultiPart = false;
}
(このサンプルは、電子メール メッセージを扱うより大きなクラスの一部であることに注意してください)
メッセージがマルチパート メールの場合、次のステップはすべてのパートを分離することです。これは次のように行うことができます。
$parts = explode("--$this->boundary", $this->fullBody);
--
境界は常に、電子メール標準に従って で始まります。あとは、個々のパーツをそれぞれ解析するだけです。
おそらく、それを行うためのコードが既にあるでしょう。各部分には、質問で言及したのと同じヘッダーがあります:content-type
とcontent-transfer-encoding
.
他のパーツ ヘッダーも存在する可能性があり、それらを削除する必要があります (content
私の記憶が正しければ、それらはすべてプレフィックスで始まります)。
次に、パーツが base64 でエンコードされているかどうかを確認します (content-transfer-encoding
ヘッダーをチェックして、これを判断できます。単一のパーツ メッセージの場合と同様に
、個々の添付ファイルの MIME タイプがパーツのヘッダーに格納されます)。 content-type
.
1 つの注意点 - これは、メッセージの生のソースを扱っていることを前提としています。これを行うには、 と を使用できgetRawHeader
ますgetRawContent
。