laravel
mailgun

Laravel環境でMailgunがcURL error 60を返すようになった

環境

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からネトストしました。
するとこんなつぶやきがありました。

スクリーンショット 2018-01-24 15.09.13.png

どうやら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 

これで無事にメールが送信できるようになりました。