我们有一个cron‘’ed脚本,它每十分钟检查一次收件箱。此脚本的目的是为我们提供的SMS通知服务处理“停止退出”功能。如果脚本发现任何在电子邮件开头带有单词"STOP“的电子邮件,我们将从通知数据库中删除该用户。
为了覆盖我们的基础,我们希望任何不符合上述标准的电子邮件都被转发到另一个电子邮件地址(这是一个别名),几个人每小时收到并检查一次。然而,我们遇到了从这个PHP脚本转发电子邮件的问题。
知道PHP的mail函数是如何工作的,很明显我们需要在发送邮件之前重新插入头文件。然而,MIME多部分电子邮件总是以乱码文本的形式发送,包括障碍和任何base64编码的附件。
有没有人知道一种使用PHP脚本接收电子邮件并正确转发的简单方法?
我们使用内置在PHP5中的原生IMAP函数。我们还可以访问PEAR Mail模块。然而,我们一直无法找到任何例子或人做类似的任务通过搜索谷歌。
发布于 2011-01-11 06:55:12
我很久以前就编写了这个方法,使用IMAP将电子邮件消息解析成相应的部分:
function Message_Parse($id)
{
if (is_resource($this->connection))
{
$result = array
(
'text' => null,
'html' => null,
'attachments' => array(),
);
$structure = imap_fetchstructure($this->connection, $id, FT_UID);
if (array_key_exists('parts', $structure))
{
foreach ($structure->parts as $key => $part)
{
if (($part->type >= 2) || (($part->ifdisposition == 1) && ($part->disposition == 'ATTACHMENT')))
{
$filename = null;
if ($part->ifparameters == 1)
{
$total_parameters = count($part->parameters);
for ($i = 0; $i < $total_parameters; $i++)
{
if (($part->parameters[$i]->attribute == 'NAME') || ($part->parameters[$i]->attribute == 'FILENAME'))
{
$filename = $part->parameters[$i]->value;
break;
}
}
if (is_null($filename))
{
if ($part->ifdparameters == 1)
{
$total_dparameters = count($part->dparameters);
for ($i = 0; $i < $total_dparameters; $i++)
{
if (($part->dparameters[$i]->attribute == 'NAME') || ($part->dparameters[$i]->attribute == 'FILENAME'))
{
$filename = $part->dparameters[$i]->value;
break;
}
}
}
}
}
$result['attachments'][] = array
(
'filename' => $filename,
'content' => str_replace(array("\r", "\n"), '', trim(imap_fetchbody($this->connection, $id, ($key + 1), FT_UID))),
);
}
else
{
if ($part->subtype == 'PLAIN')
{
$result['text'] = imap_fetchbody($this->connection, $id, ($key + 1), FT_UID);
}
else if ($part->subtype == 'HTML')
{
$result['html'] = imap_fetchbody($this->connection, $id, ($key + 1), FT_UID);
}
else
{
foreach ($part->parts as $alternative_key => $alternative_part)
{
if ($alternative_part->subtype == 'PLAIN')
{
echo '<h2>' . $alternative_part->subtype . ' ' . $alternative_part->encoding . '</h2>';
$result['text'] = imap_fetchbody($this->connection, $id, ($key + 1) . '.' . ($alternative_key + 1), FT_UID);
}
else if ($alternative_part->subtype == 'HTML')
{
echo '<h2>' . $alternative_part->subtype . ' ' . $alternative_part->encoding . '</h2>';
$result['html'] = imap_fetchbody($this->connection, $id, ($key + 1) . '.' . ($alternative_key + 1), FT_UID);
}
}
}
}
}
}
else
{
$result['text'] = imap_body($this->connection, $id, FT_UID);
}
$result['text'] = imap_qprint($result['text']);
$result['html'] = imap_qprint(imap_8bit($result['html']));
return $result;
}
return false;
}我从来没有深入测试过它,我相信它有一些but,但这可能是一个开始……改编这段代码后,您应该能够将$result索引(text、html、attachments)与转发脚本(例如使用SwiftMailer )一起使用,而不必担心保持MIME边界的完整性。
发布于 2010-12-22 05:28:18
这并不是一个真正的答案,而是对另一种方法的建议。我认为,如果您只是将邮件移动到现有帐户内的不同文件夹中,则会简单得多,也不容易出错(即,不会出现传递问题)。也就是说,cron运行并处理收件箱中的所有电子邮件。如果发现停止,它会执行所需的工作,然后(通过IMAP函数)简单地将电子邮件移动到名为“已处理”或类似文件夹的子文件夹中。否则,它会将电子邮件移动到名为“检查这些”或类似文件夹的子文件夹中。这样,您就不需要担心转发、进一步投递或第二个帐户,每个人都可以直接监控已处理、未处理和挂起的邮件。
发布于 2010-12-22 05:22:51
你有没有看过使用Swiftmailer库的功能?
我在过去使用过它,并获得了很好的结果,尽管不是在你所描述的应用程序中,但我已经将它用于基于PHP的‘邮件列表’,在那里我检查主题并发送到适当的组。
但我创建了一条新消息,没有转发。希望这能有所帮助。
https://stackoverflow.com/questions/4503980
复制相似问题