如何用PHP提取电子邮件附件?

时间:2009-08-06 12:45:13

标签: php parsing email

我正在从数据库中提取电子邮件,并将其存储为字符串。我需要解析这些电子邮件以提取其附件。我想已经有一些库可以很容易地做到这一点,但我找不到任何。

6 个答案:

答案 0 :(得分:3)

PEAR::Mail::mimeDecode应该做你正在寻找的事情

答案 1 :(得分:3)

PHP有一个MailParse扩展,比使用本机PHP的PEAR替代方法快得多。

这是一个包装此扩展程序的库:

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();

答案 2 :(得分:1)

这可以使用Zend Framework的Zend_Mail组件

来完成

也许这个例子也可以在文档中找到帮助:

// 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读取字符串,也许有一些工作需要这样做,但是你会有一个完整的fletched库来做你想要的和更多(如阅读主题等。)。

修改

我只是第二次看了它,并意识到你所要做的就是编写一个自己的存储实现(子类Zend_Mail_Storage_Abstract),这应该不会那么难。

我认为这是最简洁的解决方案,尽管需要付出一些努力才能使其发挥作用。

如果您正在寻找更快速的解决方案,其他人可能会帮助您。

希望有所帮助。

答案 3 :(得分:1)

PhpMimeParser - 解析多部分mime消息(附件,内嵌图像,base64,quoted-printable)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);

答案 4 :(得分:0)

电子邮件附件是MIME编码的,并使用标头添加到邮件正文中。 PEAR MIME解码包将满足您的需求: http://pear.php.net/package/Mail_mimeDecode

答案 5 :(得分:0)

那里有一个更好的图书馆: https://github.com/php-mime-mail-parser/php-mime-mail-parser

可通过Composer安装。

由于这个名称与Google Code上链接到此SO帖子中其他地方的名称相同,我认为它是它的继承者,但我不能说。在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)
  }
}