通过 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

Laravel api.php的使用

Laravel PHP通过多个键值过滤多维数组

php artisan serve [ErrorException] laravel

如何通过ioncube对Laravel刀片文件进行编码/加密

如何通过composer安装laravel框架