ошибка при отправке электронной почты с помощью Mandrill (php)

Я использую mandrill API в первый раз. Я использую следующий код. У меня есть API-ключ Mandrill.

 <?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/local/share/certs/ca-root-nss.crt CApath: none

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


person Aakanksha    schedule 07.10.2013    source источник


Ответы (3)


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

person Kaitlin    schedule 07.10.2013
comment
после загрузки сертификата добавьте в PHP.ini: curl.cainfo = PATH_TO/cacert.pem - person Gabriel Anderson; 07.02.2014
comment
Я все еще получаю ту же ошибку после загрузки файла pem и добавления curl.cainfo = c:\wamp\cacert.pem в php.ini - person Nathan Waters; 05.03.2015
comment
почему-то я также не могу решить эту проблему даже после загрузки сертификата и настройки в правильном файле php.ini! но многие предполагают только это правильное решение - person PC.; 08.05.2015

В этом файле: mandrill-api-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 и SSL3_GET_SERVER_CERTIFICATE: ошибка проверки сертификата, ЦС в порядке

person Ricardo Martins    schedule 22.11.2013
comment
это не помогло.... - person behz4d; 20.12.2013
comment
Если вы установите для этих двух параметров значение 0, вы фактически отключите проверку SSL, что откроет вам потенциальные уязвимости безопасности, и определенно не рекомендуется. - person Kaitlin; 13.02.2014
comment
Я использую это только на локальном хосте, потому что я не мог заставить его работать с сертификатом в Windows. Для производства это закомментировано - person Mladen Janjetovic; 15.07.2015

После загрузки 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');

Свойство curl в классе Mandrill общедоступно, поэтому нет необходимости добавлять хаки в саму библиотеку.

person Jeff T    schedule 07.01.2016
comment
Это сработало для меня, но, JFYI, CURLOPT_SSL_VERIFYHOST должно быть установлено на 2, а не true, true устарело. - person Tets Tets; 16.02.2016