使用PHP脚本转发电子邮件

我们有一个cron'ed PHP脚本,每十分钟检查一次收件箱。此脚本的目的是为我们提供的SMS通知服务处理“STOP to quit”功能。如果脚本在电子邮件的开头找到任何带有“STOP”字样的电子邮件,我们会从通知数据库中删除该用户。 为了覆盖我们的基础,我们希望将任何不符合上述标准的电子邮件转发到另一个电子邮件地址(这是一个别名),几个人每小时收到并检查一次。但是,我们遇到了从这个PHP脚本转发电子邮件的问题。 知道PHP的
mail
函数是如何工作的,很明显我们需要在邮件发送之前重新插入头文件。但是,MIME多部分电子邮件总是作为一堆文本发送,包括障碍和任何base64编码的附件。 有没有人知道一种简单的方法来接收电子邮件并使用PHP脚本正确转发它? 我们正在使用PHP 5内置的本机IMAP功能。我们还可以访问PEAR Mail模块。但是,我们无法通过搜索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),而不必担心保持MIME边界不变。     
这不是一个真正的答案,而是一个替代方法的建议。如果您只是将消息移动到现有帐户中的不同文件夹,我认为它会更简单,更不容易出错(即没有交付问题)。即,cron运行并处理INBOX中的所有电子邮件。如果if找到STOP,它会执行所需的工作,然后(通过IMAP函数)只需将电子邮件移动到名为“已处理”或类似的子文件夹。否则,它会将电子邮件移动到名为“检查这些”或类似的子文件夹。然后,您无需担心转发,进一步交付或第二个帐户,并且每个人都可以直接监控已处理,未处理和待处理的邮件。     
你有没有看过使用Swiftmailer库的功能? http://swiftmailer.org/ 我过去曾经使用过这个并取得了不错的结果,虽然不是在你所描述的应用程序中,但我已经将它用于基于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使用的c-client调用。这将为您提供php所需的步骤。 c-client文档相当少,访问pine源是获取使用细节的最佳方式。 我想你可能会发现php扩展的作者“为了你的方便或保护”省略或改变了阻止这条路径的东西。     

要回复问题请先登录注册