通过 Mandrill 发送电子邮件

Posted

技术标签:

【中文标题】通过 Mandrill 发送电子邮件【英文标题】:send email by Mandrill 【发布时间】:2016-07-04 08:59:40 【问题描述】:

我需要为山魈发送电子邮件。这个 Mandrill API 在我的项目中实现,并通过客户端提供的 apikey 发送测试邮件。我有两种发送邮件的选择,一种是通过我的 Mandrill 帐户,另一种是用户可以通过 MailChimp 登录。然后将 API KEY 山魈插入您的帐户。

我在 conf 文件中有一个默认变量,如下所示:

public $default = array(
    'transport' => 'Smtp',
    'from' => array('noreply@example.com' => 'Example'),
    'host' => 'smtp.mandrillapp.com',
    'port' => 587,
    'timeout' => 30,
    'username' => 'example@example.com',
    'password' => '12345678',
    'client' => null,
    'log' => false
    //'charset' => 'utf-8',
    //'headerCharset' => 'utf-8',
);

要通过我的帐户山魈发送邮件,我这样做:

$email = new FrameworkEmail();
$email->config('default');
$email->emailFormat('html');

我给我的帐户 Mandrill 数据。但是,如果用户选择使用 MailChimp 进行识别并添加您的 API KEY Mandrill 邮件应该从您的帐户交易电子邮件发送,而不是我的。知道这是否可能吗?

【问题讨论】:

【参考方案1】:

我认为这不可能通过 MailChimp 进行身份验证,然后通过 Mandrill 发送。 Mandrill API 使用与 MailChimp API 不同的一组密钥,因此如果用户通过 MailChimp 登录,您将无法访问用户的 Mandrill API 密钥。

编辑:如果您有用户的 Mandrill API 密钥,您应该能够将其直接从 Mandrill SDK 提供给 Mandrill 发送函数:

<?php 
$mandrill = new Mandrill('USER_PROVIDED_API_KEY_GOES_HERE');
$message = array(
    'html' => '<p>html content here</p>',
    // other details here
)
$async = False;
$ip_pool = null;
$send_at = null;

$result = $mandrill->messages->send($message, $async, $ip_pool, $send_at);
?>

更多关于SDK中Message函数的详细信息,请查看here。

编辑 #2:使用 CakeEmail 可以实现相同的方法 - 您只需在收到用户的 API 密钥时实例化 $email 类,而不是之前。

CakeEmail 建议您在初始配置中使用标准设置:

class EmailConfig 
    public $mandrill = array(
        'transport' => 'Mandrill.Mandrill',
        'from' => 'from@example.com',
        'fromName' => 'FromName',
        'timeout' => 30,
        'api_key' => 'YOUR_API_KEY',
        'emailFormat' => 'both',
    );

但我们不能使用默认值设置它,然后使用他们的 API 密钥为每个用户更改它。我们需要在收到用户的电子邮件时实例化它,如下所示:

App::uses('CakeEmail', 'Network/Email');

// PHP code that takes in user email
$user_api_key = // this would come from a form, or from a user's record in the database

$email = new CakeEmail(array(
    'transport' => 'Mandrill.Mandrill',
    'from' => 'from@example.com',
    'fromName' => 'FromName',
    'timeout' => 30,
    'api_key' => $user_api_key,
    'emailFormat' => 'both',
));

// add CakeEmail details like $email->template, $email->subject(), etc.

$email->send();

所以无论使用什么框架,原理都是一样的。与其在全局设置中实例化 Mandrill 配置细节(就像大多数电子邮件框架推荐的那样),您需要在用户想要发送电子邮件时使用特定于用户的详细信息来实例化它们。

【讨论】:

谢谢!我想我理解得更好了。但我还有另一个问题,Mandrill 在我的项目中不是作为插件作为供应商,只导入类然后尝试使用您的代码发送邮件我收到插件未安装在我的项目中的错误。 @hateful 听起来像 Mandrill CakePHP 插件只需要安装。这个link here 提供了安装说明,无论您喜欢将git clone 插件直接放入您的存储库还是使用 Composer 来管理依赖项。 谢谢!,不幸的是我无法在我的项目中安装 mandrill。每个客户我都会复制我的项目,我有大约 40 个并继续添加,所以你应该在每个 Mandrill 上安装,所以我想单独做,不管班级。如果我解释,也不可能,但你的答案即将服务,我有希望:(

以上是关于通过 Mandrill 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

Mandrill:无法通过表单发送邮件

通过 Mandrill 使用 Elmah 发送错误电子邮件

在 Lumen 框架内通过 Mandrill 发送电子邮件

通过 Mandrill NodeJS API 发送时我没有收到电子邮件

通过 Mandrill 发送 Gmail - 电子邮件延迟

通过 Java 发送电子邮件模板时的 Mandrill-Error code-5