Как извлечь почтовое приложение с помощью PHP? - PullRequest
3 голосов
/ 06 августа 2009

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

Ответы [ 6 ]

3 голосов
/ 06 августа 2009

PHP имеет расширение MailParse, которое намного быстрее, чем использование альтернативы PEAR, которая является нативным PHP.

Вот библиотека, которая упаковывает это расширение:

http://code.google.com/p/php-mime-mail-parser/

Пример:

// require mime parser library
require_once('MimeMailParser.class.php');

// instantiate the mime parser
$Parser = new MimeMailParser();

// set the email text for parsing
$Parser->setText($text);

// get attachments
$attachments = $Parser->getAttachments();
3 голосов
/ 06 августа 2009

PEAR :: Mail :: mimeDecode должен делать то, что вы ищете

1 голос
/ 04 ноября 2017

PhpMimeParser - анализировать сообщения MIME из нескольких частей (вложения, встроенные изображения, base64, для печати в кавычках) https://github.com/breakermind/PhpMimeParser Вы можете вырезать сообщения MIME из файлов, строк.

// Load .eml mime message from file
$str = file_get_contents('mime-mixed-related-alternative.eml');

// Format output
echo "<pre>";

// Create object MimeParser
$m = new PhpMimeParser($str);

// Show Emails
print_r($m->mTo);
print_r($m->mFrom);
print_r($m->mBcc);
print_r($m->mCc);

// Show Message
echo $m->mSubject;
echo $m->mHtml;
echo $m->mText;
print_r($m->mInlineList);

// Show Files
print_r($m->mFiles);
1 голос
/ 06 августа 2009

Это можно сделать с помощью компонента Zend_Mail Zend Framework

Может быть, этот пример, который также можно найти в документации, помогает:

// get the first none multipart part
$part = $message;
while ($part->isMultipart()) {
    $part = $message->getPart(1);
}
echo 'Type of this part is ' . strtok($part->contentType, ';') . "\n";
echo "Content:\n";
echo $part->getContent();

Однако я не знаю, как вы можете сказать Zend Mail читать из строк, может быть, для этого требуется некоторая работа, но тогда у вас будет полноценная библиотека, которая делает то, что вы хотите, и еще немного (например, чтение темы и т. д.).

Редактировать

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

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

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

Надеюсь, это поможет.

0 голосов
/ 08 апреля 2018

Есть лучшая библиотека: https://github.com/php-mime-mail-parser/php-mime-mail-parser

Устанавливается через Composer.

Поскольку это имя совпадает с именем в Google Code, которое было связано с другими разделами этого поста, я думаю, что оно является его преемником, но не могу сказать. Информацию об авторстве труднее найти в Google Code, поэтому я не могу подтвердить, что это тот же автор.

Пример кода (из проекта README):

// Include the library first
require_once __DIR__.'/vendor/autoload.php';

$path = 'path/to/mail.txt';
$Parser = new PhpMimeMailParser\Parser();

$Parser->setStream(fopen($path, "r"));

//  Loop through all the Attachments
if (count($attachments) > 0) {
  foreach ($attachments as $attachment) {
    echo 'Filename : '.$attachment->getFilename().'<br />'; // logo.jpg
    echo 'Filesize : '.filesize($attach_dir.$attachment->getFilename()).'<br />'; // 1000
    echo 'Filetype : '.$attachment->getContentType().'<br />'; // image/jpeg
    echo 'MIME part string : '.$attachment->getMimePartStr().'<br />'; // (the whole MIME part of the attachment)
  }
}
0 голосов
/ 06 августа 2009

Вложения электронной почты кодируются MIME и добавляются в тело сообщения с использованием заголовков. Пакет декодирования PEAR MIME сделает то, что вам нужно: http://pear.php.net/package/Mail_mimeDecode

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