11

我正在使用 Mandrill 从我的 Rails 3 应用程序发送电子邮件。在生产中,我使用我在他们的管理控制台中设置的 API 密钥。为了防止可能向我们所有用户发送电子邮件的开发和测试 SNAFU,我已将垃圾密钥放入开发和测试环境配置中,而我只将真正的密钥放入生产配置中。Mandrill 允许您创建多个 API 密钥。有谁知道是否有办法配置 Mandrill,以便使用开发或测试密钥发送电子邮件的 API 调用将失败,除非满足某个先决条件(例如电子邮件域与 mycompany.com 匹配)?

4

4 回答 4

14

Mandril 现在添加了测试 API 密钥。在他们的网站上阅读更多

于 2013-07-05T12:26:34.687 回答
10

Mandrill API 密钥的功能相同,并且对帐户中的所有 API 调用具有完全访问权限。目前没有开发、沙盒或测试密钥或范围 API 密钥的概念。但是,测试模式/功能在开发路线图上。我目前没有预计到达时间,但这绝对是我们正在努力的事情。

编辑添加:截至最初回答此问题时,这是不可能的。Mandrill 现在确实有一个测试模式

于 2013-04-02T00:33:05.520 回答
7

在 Mandrill 中创建“开发”API 密钥有两种可能的方法,它们服务于不同的用例:

  1. 创建一个测试密钥。实际上不会发送使用此密钥发送的电子邮件。这是最简单的方法,如果您的测试流程不需要您实际接收测试电子邮件,则该方法适用。(您仍然可以在“出站”选项卡中看到本应发送的电子邮件的内容

  2. 创建一个实时 API 密钥,并使用规则引擎创建它,以便使用此密钥发送的电子邮件将被自动拒绝,除非收件人地址与某种模式匹配。如果您的测试流程需要实际接收您发送的电子邮件,您应该使用这种方法 - 例如,如果您对密码重置功能进行了自动端到端测试。

方法 1:使用测试模式

测试模式于 2013 年添加到 Mandrill。要使用它,首先从设置选项卡的SMTP 和 API 信息部分的API 密钥子部分创建一个测试密钥。您在此处创建的第一个密钥将始终是实时密钥,但如果您再次单击“新建 API 密钥”,您将能够选择创建一个测试密钥:

屏幕截图显示

完成此操作后,使用测试密钥“发送”一些电子邮件(实际上不会发送电子邮件),然后从屏幕右上角的下拉菜单中单击打开测试模式选项:

显示如何打开测试模式的屏幕截图

当管理面板处于测试模式时,如果您转到出站选项卡,您将能够看到您要求 Mandrill 使用您的测试 API 密钥发送的电子邮件,就好像它们真的已经发送一样。

方法 2:使用规则引擎

首先,从设置选项卡的SMTP 和 API 信息部分的API 密钥子部分创建一个新的实时 API 密钥。您必须为密钥提供描述,否则您将无法从规则引擎中引用它。

接下来,转到出站选项卡的规则部分,然后单击“添加规则”:

显示“出站”、“规则”和“添加规则”的图像

在规则界面中,设置一个规则,如果 API 密钥是您的测试密钥并且收件人的电子邮件与您选择的某些模式匹配,则该规则将拒绝电子邮件。该模式可以是单个电子邮件地址,例如testbot@yourdomain.com,也可以是整个域,例如*@yourdomain.com.

示例规则

如果您想制作自己的复杂模式,请注意,根据文档,Mandrill 使用 Python 的fnmatch模块将您的模式与电子邮件地址匹配(它使用 glob 语法,如果您使用 Unix,您可能会在 shell 中熟悉该语法) .

您使用此密钥发送到与您的模式匹配的域的电子邮件将真正被发送并显示在实时出站选项卡中。与模式不匹配的将不会发送,并将在实时出站选项卡中显示为“已拒绝”。

于 2015-06-14T16:08:37.203 回答
0

即使在测试/开发中,我们也希望看到电子邮件发送出去,这样我们就可以看到事情是端到端的。为了防止客户收到测试电子邮件时出现问题,我们配置了一个初始化程序(Ruby on Rails),如果不是生产,它将替换收件人。不要把检查留给个别的 Mailer 实现——有人会忘记。

MandrillMailer.configure do |config|
  config.api_key = ENV['MANDRILL_API_KEY']

  # Set recipients to test@ourdomain.com if we're not in production
  if !Rails.env.production?
    config.interceptor = Proc.new do |params|
       params[:to] = [{ email: "test@ourdomain.com", name: "Test", type: "to" }]
    end
  end

end
于 2016-09-18T23:28:58.127 回答