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