题
我们有一个Cron'Ed PHP脚本,每隔十分钟检查收件箱。此脚本的目的是处理我们提供的SMS通知服务的“停止退出”功能。如果脚本在电子邮件开头找到了带有“停止”一词的任何电子邮件,我们将从我们的通知数据库中删除用户。
为了覆盖我们的基础,我们希望任何不符合上述条件的电子邮件转发到另一个电子邮件地址(这是一个别名),几个人会收到和检查每小时。但是,我们在转发此PHP脚本的电子邮件时遇到问题。
知道如何 mail
PHP的功能工作,很明显,我们需要在邮寄前重新插入标题。但是,MIME多部分电子邮件总是以文本垃圾的形式发送,包括障碍物和任何Base64编码附件。
有谁知道使用PHP脚本正确地将电子邮件转发并在正确转发上的简单方法?
我们正在使用内置在PHP 5中的本机IMAP功能。我们还可以访问梨邮件模块。但是,我们无法通过搜索Google找到任何示例或执行类似任务的人。
解决方案
我很久以前对此方法进行了编码,以使用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;
}
我从未对其进行深入测试,我敢肯定它有一些错误,但这可能是一个开始...调整此代码后,您应该能够使用该代码 $result
索引(text
, html
, attachments
)使用转发脚本(例如使用SwiftMailer),而不必担心保持哑光边界完整。
其他提示
这并不是真正的答案,而是对另一种方法的建议。我认为,如果您简单地将消息移至现有帐户中的其他文件夹中,那将更简单,更容易出错(即没有交货问题)。即,Cron运行并处理收件箱中的所有电子邮件。如果发现停止,则进行所需的工作,然后(通过IMAP功能)将电子邮件移至名为“处理”或类似的子文件夹。否则,它将电子邮件移至名为“检查”或类似的子文件夹。那么,您就不必担心转发或进一步交付或第二个帐户,每个人都可以直接监视处理,未加工和待处理的邮件。
您是否使用 SwiftMailer 图书馆 ?
我过去曾经使用过它,并且取得了不错的成绩,尽管没有像您所描述的那样的应用程序,但我还是将其用于基于PHP的“邮件列表”,我检查了主题并发送到适当的组。
但是我创建了一个新信息,没有向前。希望有帮助。
这以前发生在我身上。为了修复它,我必须在我使用imap_fetchbody()之后,在电子邮件正文上进行imap_base64()。
$body = imap_fetchbody($imap, 1, 1);
$headers = imap_headerinfo($imap, 1);
$body = imap_base64($body);
使用IO处理程序将电子邮件的内容捕获为字符串,将标题分开,然后使用PHP“ Mail()”功能发送它。
否则,如果您真的想使用PHP-IMAP执行此操作,
PHP-IMAP扩展名是libc-client,它是Pine电子邮件客户端软件的一部分,以找出使用Pine进行的手动步骤,然后查看Pine pine做的C-Client调用。这将为您提供PHP所需的步骤。
C-CLIENT文档相当小,转到Pine来源是获取使用详细信息的最佳方法。
我认为您可能会发现,PHP扩展程序的作者“为了方便或保护”,省略或更改了阻止这一路径的东西。