1

ZendZend_Mail_Storage_Pop3を使用してメールサーバーに接続し、メールを開いて、添付ファイルを繰り返し処理しています。添付ファイルがPDFの場合は、ダウンロードする必要があります。各メッセージ部分の反復ごとに、を呼び出し、getHeaders正規表現を使用して添付ファイルのmimeタイプを判別します。ほとんどの場合、私は次のようなものを取得します。

["content-type"]=> string(64) "application/octet-stream; name=abc.pdf"
["content-transfer-encoding"]=> string(6) "base64"

しかし、場合によっては、次のようなものが表示されます。

multipart/mixed; boundary=--boundary_2_1dca5b3b-499e-4109-b074-d8b5f914404a

そのような添付ファイルのMIMEタイプを確認するにはどうすればよいですか?

4

1 に答える 1

0

これは少し複雑なケースです。の場合はcontent-typemultipart/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-typecontent-transfer-encoding.
他のパーツ ヘッダーも存在する可能性があり、それらを削除する必要があります (content私の記憶が正しければ、それらはすべてプレフィックスで始まります)。
次に、パーツが base64 でエンコードされているかどうかを確認します (content-transfer-encodingヘッダーをチェックして、これを判断できます。単一のパーツ メッセージの場合と同様に
、個々の添付ファイルの MIME タイプがパーツのヘッダーに格納されます)。 content-type.

1 つの注意点 - これは、メッセージの生のソースを扱っていることを前提としています。これを行うには、 と を使用できgetRawHeaderますgetRawContent

于 2011-10-18T02:33:59.637 に答える