как скачать вложение почты в определенную папку с помощью IMAP и php - PullRequest
10 голосов
/ 02 апреля 2012

Я занимаюсь разработкой сайта, на котором пользователи могут отправлять билеты и прикреплять файлы любого типа к определенному почтовому идентификатору.Мне нужно добавить тему письма, содержание и вложение в базу данных.Я делаю это с помощью 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 ]

7 голосов
/ 12 апреля 2012

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

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

5 голосов
/ 02 апреля 2012

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

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

0 голосов
/ 08 декабря 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...