2013-10-07 2 views
9

Я использую mandrill api в первый раз. Я использую следующий код. У меня есть ключ API Mandrill со мной.ошибка в отправке электронной почты с использованием Mandrill (php)

<?php 
    try { 
     $mandrill = new Mandrill('YOUR_API_KEY'); 
     $message = array(
      'html' => '<p>Example HTML content</p>', 
      'text' => 'Example text content', 
      'subject' => 'example subject', 
      'from_email' => '[email protected]', 
      'from_name' => 'Example Name', 
      'to' => array(
       array(
        'email' => '[email protected]', 
        'name' => 'Recipient Name' 
       ) 
      ), 
      'headers' => array('Reply-To' => '[email protected]'), 
      'important' => false, 
      'track_opens' => null, 
      'track_clicks' => null, 
      'auto_text' => null, 
      'auto_html' => null, 
      'inline_css' => null, 
      'url_strip_qs' => null, 
      'preserve_recipients' => null, 
      'view_content_link' => null, 
      'bcc_address' => '[email protected]', 
      'tracking_domain' => null, 
      'signing_domain' => null, 
      'return_path_domain' => null, 
      'merge' => true, 
      'global_merge_vars' => array(
       array(
        'name' => 'merge1', 
        'content' => 'merge1 content' 
       ) 
      ), 
      'merge_vars' => array(
       array(
        'rcpt' => '[email protected]', 
        'vars' => array(
         array(
          'name' => 'merge2', 
          'content' => 'merge2 content' 
         ) 
        ) 
       ) 
      ), 
      'tags' => array('password-resets'), 
      'subaccount' => 'customer-123', 
      'google_analytics_domains' => array('example.com'), 
      'google_analytics_campaign' => '[email protected]', 
      'metadata' => array('website' => 'www.example.com'), 
      'recipient_metadata' => array(
       array(
        'rcpt' => '[email protected]', 
        'values' => array('user_id' => 123456) 
       ) 
      ), 
      'attachments' => array(
       array(
        'type' => 'text/plain', 
        'name' => 'myfile.txt', 
        'content' => 'ZXhhbXBsZSBmaWxl' 
       ) 
      ), 
      'images' => array(
       array(
        'type' => 'image/png', 
        'name' => 'IMAGECID', 
        'content' => 'ZXhhbXBsZSBmaWxl' 
       ) 
      ) 
     ); 
     $async = false; 
     $ip_pool = 'Main Pool'; 
     $send_at = 'example send_at'; 
     $result = $mandrill->messages->send($message, $async, $ip_pool, $send_at); 
     print_r($result); 

    } catch(Mandrill_Error $e) { 
     echo 'A mandrill error occurred: ' . get_class($e) . ' - ' . $e->getMessage(); 

     throw $e; 
    } 
    ?> 

С помощью этого кода я получаю сообщение об ошибке, как:

произошла мандрил ошибка: Mandrill_HttpError - API вызова для сообщений/отправить не удалось: сертификат настройки ошибки проверить места: CAfile:/USR/местные/доли /certs/ca-root-nss.crt CApath: none

Почему я получаю эту ошибку?

+0

Возможный дубликат [Простая функция php для отправки электронной почты с Mandrill] (http://stackoverflow.com/questions/14473592/simple-php-function-to-send-an-email-with-mandrill) –

ответ

7

ошибка указывает на то, что у вас нет необходимого сертификата SSL, установленного локально, для проверки SSL-соединения с API-интерфейсом Mandrill. Вы можете получить комплект сертификатов через диспетчер пакетов для своей операционной системы или загрузить пакет, который распространяется вместе с Mozilla: http://curl.haxx.se/docs/caextract.html, а затем сохранить их локально.

+5

после загрузить сертификат, добавить в PHP.ini: curl.cainfo = "PATH_TO/cacert.pem" –

+0

Я все еще получаю ту же ошибку после загрузки файла pem и добавления curl.cainfo = c: \ wamp \ cacert.pem to php.ini –

+0

как-то я также не могу решить проблему даже после загрузки сертификата и настройки в правильном файле php.ini! но многие предлагают только это правильное решение –

28

В этом файле: мандрил-апи-PHP \ SRC \ Mandrill.php

В строке 58, где инициализирует локон:

$this->ch = curl_init(); 

Вам нужно добавить эти два варианта решения проблемы:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0); 

Или у вас есть этот параметр, чтобы: HTTPS and SSL3_GET_SERVER_CERTIFICATE:certificate verify failed, CA is OK

+0

это не помогло .... – behz4d

+4

работал для меня в localhost –

+6

Если вы установили эти два параметра в 0, вы фактически отключите проверку SSL, что откроет вам потенциальные уязвимости безопасности и, безусловно, не рекомендуется. – Kaitlin

4

После загрузки cacert.pem из http://curl.haxx.se/docs/caextract.html и положить его на моем сервере, я был в состоянии решить эту проблему (сохраняя при этом все безопасно) со следующим:

$mandrill = new Mandrill(MANDRILL_API_KEY); 

// Fix CA issue 
curl_setopt($mandrill->ch, CURLOPT_SSL_VERIFYHOST, true); 
curl_setopt($mandrill->ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($mandrill->ch, CURLOPT_CAINFO, 'PATH_TO/cacert.pem'); 

Завиток свойство в классе Mandrill является публичным, поэтому нет необходимости добавлять хаки в библиотеку.

+3

Это сработало для меня, но JFYI, 'CURLOPT_SSL_VERIFYHOST' должен быть установлен в' 2' не 'true', true был устарел. –

Смежные вопросы