通过 Laravel / PHP 的 Mandrill 入站电子邮件
Posted
技术标签:
【中文标题】通过 Laravel / PHP 的 Mandrill 入站电子邮件【英文标题】:Mandrill inbound emails through Laravel / PHP 【发布时间】:2014-01-17 20:54:39 【问题描述】:我想知道是否有人可以帮助我解决我在研究 Laravel 和通过 Mandrill 处理入站电子邮件时遇到了一些麻烦。 基本上我希望能够通过 Mandrill 接收电子邮件并将它们存储在我的 Laravel 数据库中。现在我不确定我是否用错误的眼光阅读文档,但 Mandrill 说它处理入站电子邮件和出站电子邮件,但我开始认为 Mandrill 处理入站电子邮件详细信息,而不是到实际的入站电子邮件,例如是否发送了消息等。
我创建了一个新的 Mandrill 帐户,创建了一个 API 密钥,创建了一个入站域和我网站的相应子域(例如 inboundmail.myproject.co.uk),设置了 MX 记录并且 MX 记录显示为有效.从那里我设置了一个路由(例如 queries@inboundmail.myproject.co.uk)和一个相应的 webhook(myproject.co.uk/inboundmail.php),并在这个 webhook 中尝试了 API 中给出的各种示例(https://mandrillapp.com/api/docs/inbound.php.html),例如添加新路由、检查路由并尝试添加新域。所有这些都工作并产生了正确的结果,所以我对 Mandrill 的身份验证没有问题,但我真正的问题是是否有一个特定的 webhook 来处理接受传入的邮件消息?
我不禁觉得自己像个白痴一样问这个问题,因为我确信答案要么是盯着我的脸,要么就是无法通过 Mandrill。
提前致谢。
【问题讨论】:
但 Mandrill 确实接受传入的消息。您在寻找哪种 webhook? 基本上是一个如何获取传入邮件的示例。我想从收到的电子邮件中获取数据,所以说每封电子邮件的所有数据的数组,对其进行解析,然后将其存储到数据库中。这可能吗?例如,如果我从我的电子邮件地址向 query@inboundmail.myproject.co.uk 发送了一封电子邮件,我将如何从 webhook 访问该电子邮件? 你应该在 Laravel 论坛上提问。 【参考方案1】:感谢 Duellsy 和 debest 的帮助,最后我找到了一个脚本并对其进行了扩展,以将邮件添加到我自己的数据库并相应地设置/显示它。希望这对可能遇到同样问题的人有所帮助:
<?php
require 'mandrill.php';
define('API_KEY', 'Your API Key');
define('TO_EMAIL', 'user@example.com');
define('TO_NAME', 'Foo Bar');
if(!isset($_POST['mandrill_events']))
echo 'A mandrill error occurred: Invalid mandrill_events';
exit;
$mail = array_pop(json_decode($_POST['mandrill_events']));
$attachments = array();
foreach ($mail->msg->attachments as $attachment)
$attachments[] = array(
'type' => $attachment->type,
'name' => $attachment->name,
'content' => $attachment->content,
);
$headers = array();
// Support only Reply-to header
if(isset($mail->msg->headers->'Reply-to'))
$headers[] = array('Reply-to' => $mail->msg->headers->'Reply-to');
try
$mandrill = new Mandrill(API_KEY);
$message = array(
'html' => $mail->msg->html,
'text' => $mail->msg->text,
'subject' => $mail->msg->subject,
'from_email' => $mail->msg->from_email,
'from_name' => $mail->msg->from_name,
'to' => array(
array(
'email' => TO_EMAIL,
'name' => TO_NAME,
)
),
'attachments' => $attachments,
'headers' => $headers,
);
$async = false;
$result = $mandrill->messages->send($message, $async);
print_r($result);
catch(Mandrill_Error $e)
// Mandrill errors are thrown as exceptions
echo 'A mandrill error occurred: ' . get_class($e) . ' - ' . $e->getMessage();
// A mandrill error occurred: Mandrill_PaymentRequired - This feature is only available for accounts with a positive balance.
throw $e;
?>
【讨论】:
我一直没有意识到你需要json_decode
mandrill_events。我应该更仔细地阅读文档,但无论如何都要 +1。
如何轻松调试入站邮件?例如,我想使用file_put_contents()
将消息文本保存到日志文件中?
这可能会对您有所帮助***.com/questions/16225437/… 我只是将 var_dump $message 放入其中。
我现在使用此代码创建“支持票”,以防有与电子邮件关联的用户帐户。如果没有与我可以回答的另一个邮箱关联的用户帐户,有没有办法发送整个电子邮件(带附件)?所以只是整个邮件的简单“转发”。
我不确定,因为它已经来自 Mandrill,您可能必须将 PHP 邮件功能 (php.net/manual/en/function.mail.php) 合并到解决方案中,这会将其置于此特定 SO 的上下文之外问题【参考方案2】:
与使用来自其他邮件解析服务的 webhook 一样,您需要使用
file_get_contents("php://input")
这将为您提供来自 webhook 的原始数据,然后您可以json_decode
处理结果。
【讨论】:
以上是关于通过 Laravel / PHP 的 Mandrill 入站电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 GitHub 将 Laravel php 应用程序部署到 azure
php artisan serve [ErrorException] laravel