Я использую 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
.