gpt4 book ai didi

php - 使用 PHP 脚本转发电子邮件

转载 作者:可可西里 更新时间:2023-11-01 12:32:17 24 4
gpt4 key购买 nike

我们有一个 cron'ed PHP 脚本,每十分钟检查一次收件箱。此脚本的目的是为我们提供的 SMS 通知服务处理“STOP to quit”功能。如果脚本发现任何电子邮件开头带有“STOP”一词,我们就会从通知数据库中删除该用户。

为了涵盖我们的基础,我们希望将任何不符合上述条件的电子邮件转发到另一个电子邮件地址(这是一个别名),几个人每小时都会收到并检查一次。但是,我们在转发来自此 PHP 脚本的电子邮件时遇到了问题。

了解 PHP 的 mail 功能是如何工作的,很明显我们需要在邮寄之前重新插入 header 。但是,MIME 多部分电子邮件总是作为乱码文本发送,包括障碍和任何 base64 编码的附件。

有谁知道使用 PHP 脚本接收电子邮件并正确转发它的简单方法?

我们正在使用 PHP 5 中内置的 native 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 边界的完整性。

关于php - 使用 PHP 脚本转发电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4503980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com