Codeigniter 和 Mandrill api,无法发送电子邮件

Posted

技术标签:

【中文标题】Codeigniter 和 Mandrill api,无法发送电子邮件【英文标题】:Codeigniter and Mandrill api, unable to send email 【发布时间】:2015-02-12 14:24:51 【问题描述】:

我正在尝试通过将 Mandrill 与 CodeIgniter 一起使用来发送电子邮件。我可以按照他们的文档中的描述使用 Mandrill API:

require_once(mandrill/Mandrill.php);

$Mandrill = new Mandrill($apikey);

$params = array(
    "html" => "<p>\r\n\tHi Adam,</p>\r\n<p>\r\n\tThanks for <a    href=\"http://mandrill.com\">registering</a>.</p>\r\n<p>etc etc</p>",
    "text" => null,
    "from_email" => "xxx@xxx.example.com",
    "from_name" => "chris french",
    "subject" => "Your recent registration",
    "to" => array(array("email" => xxx@yyy.example.com")),
    "track_opens" => true,
    "track_clicks" => true,
    "auto_text" => true
);

$Mandrill->messages->send($params, true));

这很简单,但是当我尝试通过 CodeIgniter 发送 Mandrill 邮件时,我得到了错误结果;这是我的代码:

$this->load->library('mandrill/Mandrill');
$this->Mandrill->apikey($apikey);
//...
//All other options
$this->Mandrill->messages->send($params, true));

库正在成功加载,发送电子邮件是我收到错误的地方。

抛出错误:

Fatal error: Call to a member function send() on null

【问题讨论】:

显示错误,我们应该猜吗? “不能”是不够的。 是的,这是我收到的错误“致命错误:在 null 上调用成员函数 send()” 您好,我发现了问题!将重新制作我的答案。这个问题很好。 【参考方案1】:

我猜你错误地加载了 mandrill 类以使其成为“CodeIgniter 方式”,如下所示:

    放类(mandrill.php and folder mandrill文件夹中的文件application/libraries)见图 使用$this-&gt;load-&gt;library('mandrill', array($apikey));加载类 修正$params中的所有错别字(你缺少",最后一行有两个括号))最后) 修改mandrill.php,使其在构造函​​数中接受数组作为参数;请参阅解决方案部分答案 在 Mandrill 的教程中使用 API(发送、ping...随便)

有效代码

$this->load->library('mandrill', array($apikey)); //load mandrill and provide apikey

$params = array(
        "html" => "<p>\r\n\tHi Adam,</p>\r\n<p>\r\n\tThanks for <a    href=\"http://mandrill.com\">registering</a>.</p>\r\n<p>etc etc</p>",
        "text" => null,
        "from_email" => "xxx@xxx.example.com",
        "from_name" => "chris french",
        "subject" => "Your recent registration",
        "to" => array(array("email" => "xxx@yyy.example.com")),
        "track_opens" => true,
        "track_clicks" => true,
        "auto_text" => true
    );

$this->mandrill->messages->send($params, true);


编辑(cmets)

请注意:我删除了真正的 api-key = MY_KEY,电子邮件来自 = EMAIL_FROM,电子邮件至 = EMAIL_TO

$msg = array(
    "html" => "The Message",
    "text" => null,
    "from_email" => "EMAIL_FROM",
    "from_name" => "John Doe",
    "subject" => "Acme",
    "to" => array(array("email" => "EMAIL_TO")),
    "track_opens" => true,
    "track_clicks" => true,
    "auto_text" => true
);

require_once APPPATH.'libraries/Mandrill.php';
$mandrill = new Mandrill('MY_KEY');
var_dump($mandrill->messages->send($msg, true));
//var_dump($mandrill->users->ping());


$this->load->library('Mandrill', array("MY_KEY")); //load mandrill and provide apikey
var_dump($this->mandrill->messages->send($msg, true));
//var_dump($this->mandrill->users->ping());

以上代码两次发送相同的电子邮件(使用不同的加载方法);回复 && 少数var_dump() 是:

使用require_once...的方法

object(Mandrill)[14] //setup
  public 'apikey' => string 'MY_KEY' (length=22)
  public 'ch' => resource(40, curl)
  public 'root' => string 'https://mandrillapp.com/api/1.0/' (length=32)
  public 'debug' => boolean false

array (size=1) //this is response
  0 => 
    array (size=4)
      'email' => string 'EMAIL_TO' (length=24)
      'status' => string 'sent' (length=4)
      '_id' => string 'f7af72b1e1364a58a2eb302e94a1dc1e' (length=32)
      'reject_reason' => null

使用$this-&gt;load-&gt;library();的方法

object(Mandrill)[30] //setup
  public 'apikey' => string 'MY_KEY' (length=22)
  public 'ch' => resource(41, curl)
  public 'root' => string 'https://mandrillapp.com/api/1.0/' (length=32)
  public 'debug' => boolean false

array (size=1) //this is response
  0 => 
    array (size=4)
      'email' => string 'EMAIL_TO' (length=24)
      'status' => string 'sent' (length=4)
      '_id' => string '5965091637fa42dd98b40a934523022e' (length=32)
      'reject_reason' => null

解决方案

为了让它工作,我改变了在 Mandrill 构造函数中检索 API_KEY 的方式,因为 CodeIgniter 的加载器将参数发送到构造函数为 array()

山魈.php

public function __construct($apikey=null) 
    if(is_array($apikey)) $apikey = $apikey[0]; //added this line
    if(!$apikey) $apikey = getenv('MANDRILL_APIKEY');
    if(!$apikey) $apikey = $this->readConfigs();
//... rest of the file

另一个选项是CI-Mandrill,注意它使用的是1.0版本;安装时间 ~5 分钟或更短

【讨论】:

您好 Kyslik,感谢您的详细回复。我以完全相同的方式完成了每一步,但是当我像这样使用 Mendrill 时没有成功: $mandrill = new Mandrill('api-key');和 $mandrill->messages->send($params, true);它工作正常。我想知道,为什么它不能以 CI 方式工作。 你修正了所有的错别字吗,因为它对我有用,我只是测试了一切。我正在使用 CI 2.2(刚刚下载,Mandrill API 刚刚下载)。错误是一样的吗? 查看我编辑的答案,正如我所说,我设法使用这两种方法发送电子邮件;作为回应 'reject_reason' =&gt; null 只是为了让用户知道请求没有错误。 谢谢,我喜欢最后一个解决方案,编辑 Mandrill 构造函数以使其以 CI 方式工作。再次感谢您如此详细的回复。

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

使用车把和 Mandrill-dotnet -library 在 mandrill 中的每个循环

延迟作业和 Mandrill:未初始化的常量 Mandrill::API

mandrill 和嵌套的合并变量

找不到 Mandrill 红宝石宝石的方法 - 示例中的剪切和粘贴

mandrill、merge_vars 和车把阵列问题

使用 PHPMailer 和 Mandrill 发送模板