我需要使用 php 解析 mbox 或电子邮件文件,也就是说,我将传递一个包含多封电子邮件的文件 .mbox 或 .eml 并将其解析为其组成部分,例如 from、to、bcc 等。
是否有任何库可以做到这一点,或者有任何关于如何在 php 中执行此操作的代码?
谢谢
有一个 PEAR 类http://pear.php.net/package/Mail_Mbox。
尽管手动分离 .mbox 文件并不难。单个邮件仅由/^From\s/
(可能永远不会出现在邮件正文中)和一个Headers:
. 大多数邮件应用程序也会在其中存储一个长度字段。但是使用现成的脚本来处理所有的变化确实更容易。
上面的 PEAR 类用于从 MBOX 中获取单个消息,但如果您还想将消息解析为其组成元素,如“发件人地址”、“附件”等,那么我会推荐mime_parser.php
事实上,mime_parser.php 也可以处理从 MBOX 中提取消息,因此根据您的需要,您可能不需要 PEAR 类。
这是用于解析 mbox 数据的 PEAR 模块 Mail_Mbox:
如果你需要一些更快的东西来满足小需求,比如通过分组到标签中提取你收集到 gmail 的所有电子邮件并使用谷歌外卖导出,以便导入列表让我们说给 mailchimp...
<?php
// tested with google mail > account > privacy > data exporter (with label)
// https://takeout.google.com/settings/takeout
$raw = file_get_contents('emails.mbox');
preg_match_all('/^Reply-To:\s(.*)$/im', $raw, $matches);
// avoid duplicate
$emails = array_unique($matches[1]);
$filtered_out = '';
// CSV field example (tested with mailchimp)
$filtered_in = 'Email Address' . "\n";
foreach ($emails as $email) {
$email = strtolower($email);
// filter out invalid emails, rarely
// happens that exporters makes mistakes ;)
// for example xxxxxxxxx@gmail.comx.xxxxxxxxxx.org
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$filtered_in .= $email . "\n";
} else {
$filtered_out .= $email . "\n";
}
}
header('Content-Type: text/plain');
// save to file
// file_put_contents('emails.csv', $filtered_in);
echo $filtered_in;
?>
希望这有帮助!