как загрузить вложение почты в определенную папку с помощью IMAP и php

Я разрабатываю сайт, на котором пользователи могут отправлять билеты и прикреплять файлы любого типа к определенному почтовому идентификатору. Мне нужно добавить тему почты, содержимое и вложение в базу данных. Я делаю это с помощью cron. Кроме привязанностей, все работает идеально. Я видел некоторые сообщения, которые создают ссылки для загрузки. Поскольку я использую cron, я не могу сделать это вручную.

        $hostname = '{xxxx.net:143/novalidate-cert}INBOX';
        $username = 'yyy@xxxx.net';
        $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 ответов


чтобы сохранить вложения в виде файлов, необходимо проанализировать структуру сообщения и вынуть все части, которые являются вложениями самостоятельно (расположение содержимого). Вы должны обернуть это в свои собственные классы, чтобы у вас был легкий доступ, и вы можете легче обрабатывать ошибки с течением времени, разбор электронной почты может быть хрупким:

$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. Надеюсь, это поможет.