環境
Laravel 4.2
Guzzle v3.9.3
TL;DR
cacert.pem
を更新する
$ cd /path/to/laravel/vendor/guzzle/guzzle/src/Guzzle/Http/Resources
$ mv cacert.pem cacert.pem.bk
$ wget curl.haxx.se/ca/cacert.pem
事の顛末
メールの配信にMailgunを使っているのですが、2018/1/23に突然メールが送れない状態になりました。
MailgunのStatus Pageを見ても何も書いていなかったので、Twitterからネトストしました。
するとこんなつぶやきがありました。
どうやらMailgunがSSL証明書を更新したことによってエラーが起きていたようです。
このTweetの後にメール送信できないぞいというリプが続々と付いてました。
対応
その後MailgunのStatus Pageを見てみると
If you are receiving errors while attempting to send messages using Mailgun, you will need to update your local CA bundle.
とのこと。
何はともあれエラーを見てみます。
exception 'Guzzle\Http\Exception\CurlException' with message '[curl] 60: [url] https://api.mailgun.net/v2/app/messages' in /directory/to/laravel/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php:359
Stack trace:
(後略)
後略の中を詳しく見てみるとClient.php
の中に下記のコードを発見。
$opts[CURLOPT_CAINFO] = __DIR__ . '/Resources/cacert.pem';
__DIR__
はPHPのマジカル定数で、そのファイルが存在するディレクトリを指します。
このファイルが存在しているlaravel/vendor/guzzle/guzzle/src/Guzzle/Http/Resources
を見てみるとありました、cacert.pem
です。
これを下記のように更新します。
$ cd /path/to/laravel/vendor/guzzle/guzzle/src/Guzzle/Http/Resources
$ mv cacert.pem cacert.pem.bk
$ wget curl.haxx.se/ca/cacert.pem
これで無事にメールが送信できるようになりました。