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送信
やっとやりたかったことに辿り着きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; class Sample extends CI_Controller { public function sample() { // PHPMailerオブジェクト生成 $mail = new PHPMailer(true); // 送信設定 $mail->SMTPDebug = 0; // 0:デバッグOFF 1:デバッグON $mail->SMTPAuth = true; // SMTP認証を利用するか $mail->Host = 'mail.sample.com'; $mail->Username = 'test@sample.com'; $mail->Password = 'xxxxxx'; $mail->SMTPSecure = 'tls'; // sslの場合はssl $mail->Port = 587; // sslの場合は465(普通は) // ここからがポイント $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, // 'allow_self_signed' => true ) ); // ここまで // 送信内容設定 $mail->CharSet = 'utf-8'; $mail->setFrom('from@sample.com', mb_encode_mimeheader('Sample User')); $mail->addAddress('to@sample.com'); $mail->Subject = '[Sample] これはサンプルメールです'; $mail->Body = 'サンプルメールサンプルメールサンプルメールサンプルメール'; // 送信 $mail->send(); } } |
ポイントは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でも同じ結果になるので、好きにしたら良いと思います。