как загрузить вложение почты в определенную папку с помощью IMAP и php
Я разрабатываю сайт, на котором пользователи могут отправлять билеты по почте и прикреплять файлы любого типа к определенному почтовому идентификатору. Мне нужно добавить тему письма, содержимое и вложение в базу данных. Я делаю это с помощью cron. За исключением вложений, все работает идеально. Я видел некоторые сообщения, которые создают ссылки для скачивания. Поскольку я использую cron, я не могу сделать это вручную.
$hostname = '{xxxx.net:143/novalidate-cert}INBOX';
$username = '[email protected]';
$password = 'zzzz';
/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to : ' . imap_last_error());
$emails = imap_search($inbox,'ALL');
if($emails) {
$output = '';
rsort($emails);
foreach($emails as $email_number) {
$structure = imap_fetchstructure($inbox, $email_number);
$name = $structure->parts[1]->dparameters[0]->value; // name of the file
$type = $structure->parts[1]->type; //type of the file
}}
Я могу получить тип и имя файлов, но не знаю, как действовать дальше
Кто-нибудь, пожалуйста, помогите я. спасибо...
3 answers
Чтобы сохранить вложения в виде файлов, вам необходимо проанализировать структуру сообщения и удалить все части, которые являются вложениями, самостоятельно (расположение содержимого). Вы должны объединить это в собственные классы, чтобы у вас был легкий доступ и вы могли легче обрабатывать ошибки с течением времени, анализ электронной почты может быть хрупким:
$savedir = __DIR__ . '/imap-dump/';
$inbox = new IMAPMailbox($hostname, $username, $password);
$emails = $inbox->search('ALL');
if ($emails) {
rsort($emails);
foreach ($emails as $email) {
foreach ($email->getAttachments() as $attachment) {
$savepath = $savedir . $attachment->getFilename();
file_put_contents($savepath, $attachment);
}
}
}
Код этих классов более или менее обертывает функции imap_...
, но для классов вложений он также выполняет синтаксический анализ структур. Вы найдете код на github. Надеюсь, это полезно.
Хотя использование PHP+ Cron и стандартного почтового сервера может работать, объем работы, необходимый для обработки всех крайних случаев, отчетов об ошибках и т. Д., Может не стоить затраченного времени. Хотя я им не пользовался, Входящий почтовый штемпель кажется невероятной (платной) услугой, которая устранит большую часть головной боли при обработке электронной почты через PHP imap api.
Если вы хотите попытаться обработать все с помощью PHP, вы можете проверить этот ресурс .
В случае, если вы хотите загрузить вложения в виде zip
$zip = new ZipArchive();
$tmp_file = tempnam('.', '');
$zip->open($tmp_file, ZipArchive::CREATE);
$mailbox = $connection->getMailbox('INBOX');
foreach ($mailbox->getMessage() as $message) {
$attachments = $message->getAttachments();
foreach ($attachments as $attachment) {
$zip->addFromString($attachment->getFilename(), $attachment->getDecodedContent());
}
}
$zip->close();
# send the file to the browser as a download
header('Content-disposition: attachment; filename=download.zip');
header('Content-type: application/zip');
readfile($tmp_file);
Этот код использует библиотеку, размещенную на GitHub. Надеюсь, это полезно.