Как загружать вложенную почту в определенную папку с помощью 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 
}}

Я могу получить тип и имя файлов, но не знаю, как продолжить дальше

Кто-нибудь, пожалуйста, помогите мне. спасибо...

Ответ 1

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

$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. Надеюсь, что это будет полезно.

Ответ 2

Хотя использование PHP + Cron и стандартного почтового сервера может работать, объем работы, необходимой для обработки всех крайних случаев, отчетов об ошибках и т.д., может не стоить времени. Хотя я не использовал его, Postmark Inbound кажется невероятной (платной) услугой, которая устранит большую часть головной боли обработки электронной почты через PHP imap api.

Если вы хотите попробовать все с PHP, вы можете проверить этот ресурс вне.

Ответ 3

Если вы хотите загрузить вложения как 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. Надеюсь, что это будет полезно.

Ответ 4

Используя программу управления загрузкой электронной почты, вы можете загружать электронные письма с вложениями в определенную папку в хранилище компьютера. Программное обеспечение предоставляет возможность сервера IMAP для легкого доступа к вашей учетной записи веб-почты или почтового сервера.