CodeigniterでPHPMailer入れてSMTP送信使おうとしたらハマった話

2017-11-20 2017-12-05

簡素なサービスには簡素なフレームワーク。
ということで、重量級のシステムでない限りは、codeigniterを利用しています。

Railsも使いますが、RailsはModelありきなので、DBをあまり利用しない際などはcodeigniterの方が簡素で良い。composer使えば程々にパッケージ管理できるし。

ところが、このcodeigniter、全然更新されないため各種ライブラリ機能が相当に貧弱です。ほとんど実用に耐えない。

mailライブラリもその実用に耐えないライブラリの一つで、PHP5.6以上だと、まず使い物になりません。

ということで、仕方なくPHPMailerを利用しているわけですが、その辺のあれこれを軽く解説してみます。

PHP5.6以上ではSMTP利用がめんどくさい

PHP5.6から、verify_peerのデフォルトがtrueになりました。verify_peerというのは、「ピア証明書の検証を要求するかどうか」という設定項目です。trueにしたら当然証明書を要求します。

しかし、レンタルサーバなどでは自由にphp.iniもいじれません。つまり、「証明書のパスを設定できない=要求されても検証不能=SMTP利用でメールは送れない」ということになります。

そこで、「verify_peerをfalseにしてしまおう」とある人は考えました。今はPHP7の時代。PHP5.6以降から発生してる問題なら、当然ほとんどのフレームワークは対策してるだろう。もちろんcodeigniterもね。そう考えました。

しかし、その考えは間違いでした。codeigniterはほとんどアップデートされず、mailライブラリは旧石器時代から進歩などしていなかったのです。cakeやLaravelが時代に合わせて変化していく中、codeignieterは昔のままでした。

やむなくその人は、PHPMailerを使うことにしました。

PHPMailerをcomposerでインストール

composerの使い方がわからない人は、ここに置いて行きます。

composer.jsonに
“phpmailer/phpmailer”: “~6.0”
を追記して、composer install。大変簡単なお仕事です。

codeigniterの場合は、config.phpの
$config[‘composer_autoload’]
をtrueにしておくと楽です。

PHPMailerでSMTP送信

やっとやりたかったことに辿り着きました。

ポイントはSMTPOptionsです。PHPMailerでは、verify_peerをfalseにすることが可能なので、こいつを設定してやることで証明書なしでSMTP送信が可能になります。

verify_peer_nameは「ピア名の検証を要求するかどうか」ですが、ピア証明書が無い以上ピア名も無いので、falseにする必要があります。

allow_self_signedは「自己証明の証明書を許可するかどうか」です。コメントアウトにしている理由は、この記事を書く際にちょっと調べたところ、多くのサイトでallow_self_signedにtrueをセットする必要があると書かれていたためです。しかし、理屈から考えるとallow_self_signedの設定は必要ないように思えます。

verify_peerをfalseにしている以上、証明書の検証自体要求されないはずなので、自己証明の証明書を許可する必要はないでしょう。オレオレ証明書使いたいならtrueにしたらいいと思いますが、その際はverify_peerはtrueにする必要があります。verify_peerをfalseにするのであれば、allow_self_signedはtrueでもfalseでも同じ結果になるので、好きにしたら良いと思います。