Как сохранить вложения электронной почты на сервер в PHP?

Я работаю над функциями чтения электронной почты PHP в течение большей части двух дней. Я пишу скрипт для чтения писем из почтового ящика и сохранения любых вложений на сервере. Если вы когда-либо делали что-то подобное, вы могли бы понять мою боль: PHP не очень хорошо работает с электронной почтой!

Я подключился к POP3-серверу, и я могу перебирать файлы. Вот приблизительный контур кода:

if (!$mbox = imap_open ("{myserver.com:110/pop3/notls}INBOX", "u", "p")) die ('Cannot connect/check mail! Exiting'); if ($hdr = imap_check($mbox)) $msgCount = $hdr->Nmsgs; else die ("Failed to get mail"); foreach ($overview as $message) { $msgStruct = imap_fetchstructure($mbox, $message->msgno); // if it has parts, there are attachments that need reading if ($msgStruct->parts) { foreach ($msgStruct->parts as $key => $part) { switch (strtoupper($part->subtype)) { case 'GIF': case 'JPEG':case 'PNG': //do something - but what?! break; } } } } 

Я отметил, где я застрял. Я могу использовать imap_fetchbody($mbox, $message->msgno, $key+1) но это дает мне кучу данных вроде этого:

 /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8S EhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEU Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAAR CAHiAi0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA ... 

Я убежден, что это данные MIME. Мне нужно это как изображение! Я видел, как несколько классов бомбили по интернету, которые утверждают, что делают необходимое волшебство. Я не могу заставить их работать. Я не понимаю, почему я так сильно нахожу это!

Короче говоря , я ищу что-то, что может превратить исходную строку MIME в реальные данные.

Я нашел краткое руководство, как обрабатывать электронные письма с помощью PHP: здесь .

В нижней части этой страницы есть echo -вложение-тело:

 if (substr($ContentType,0,4) == "text") { echo imap_qprint($fileContent); } else { echo imap_base64($fileContent); } 

Я думаю, это то, что вам может понадобиться …

(отредактируйте: в вашем случае, если это изображение, вы всегда можете пропустить часть if . И, конечно, сохраните файл, а не эхом. 🙂

MIME-данные кодируются с базой-64, поэтому я думаю, что вы должны иметь возможность декодировать его с помощью base64_decode

вы можете использовать функцию imap_base64 и просто выводить ее в файл или использовать imap_savebody

Zend Framework содержит Zend_Mail, что значительно упрощает чтение почтовых сообщений, а Zend_Mime, который, я считаю, может анализировать многопользовательское сообщение mime в разумной структуре данных.

http://framework.zend.com/manual/en/zend.mail.read.html