PHP: Как определить тип MIME вложений электронной почты?

Я использую Zend's Zend_Mail_Storage_Pop3 для подключения к почтовому серверу, открытия электронной почты и повторения его вложений. Если приложение является PDF, мне нужно его загрузить. На каждой итерации каждой части сообщения я вызываю getHeaders и использую Regex для определения типа 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 таких вложений?

Это немного сложный случай. Когда content-type является multipart/mixed это означает, что есть несколько частей письма. Одним или несколькими из них может быть вложение (в дополнение, возможно, включая 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-transfer-encoding .
Могут быть и другие заголовки деталей, и вы захотите их удалить (они будут начинаться с content префикса, если я правильно помню).
Затем убедитесь, что если часть base64 закодирована, что вы ее учтете (вы можете проверить заголовок content-transfer-encoding чтобы определить это.
Тип mime отдельного вложения будет храниться в заголовке content-type части так же, как в случае сообщения с одной частью.

Одна нота – это предполагает, что вы имеете дело с исходным источником сообщения. Для этого вы можете использовать getRawHeader и getRawHeader .