セキュアな対策を行っているメールサーバを利用している方に、メールが届かない
というケースが生じてきた。
SPF(Sender Policy Framework) という技術だそうで、
FORMのIPアドレスがDNSの逆引きで実在するかをチェックするという動きのようだ。
わざわざレンタルサーバ上でメールを作成して送信も手間なので、
今までは、特段気にしていなかったが、基幹システム化しつつあるため、そうも言ってられなくなった。
要は、実在するSMTPサーバを経由してメールを送ればいいので、少し調べた所
いくつか方法があった。
1.
postfixのmain.cf にリレーさせる
2.Qdsmtpというhal456さんが作成したライブラリを利用させて頂き、smtpサーバ経由にする。
3.PHPMailerという老舗のライブラリを利用させて頂きsmtpサーバを経由にする。
1.は設定変更等が生じた際に面倒な気がしてならないので、保留。
2.は魅力的だが、php7.0以降でサポートしていないようなので、後ろ髪惹かれつ第2候補に
というわけで、PHPMailerをインストールしてみる。
依存関係を考慮しつつライブラリを使えるようにしてくれる
composerという PHPのパッケージ管理システムを使って
PHPMailerを導入してみる。
# mkdir comp 適当な作業ディレクトリを作成。
# cd comp
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php composer-setup.php
All settings correct for using Composer
Downloading...
Composer (version 1.7.2) successfully installed to: /root/composer.phar
Use it: php composer.phar
# rm -f composer-setup.php もう要らないので、消す
# mv composer.phar /usr/local/bin/composer システム全般で使えるように移動
セキュリティホールになるからルートで使うなと言われるらしいので、 一般ユーザで確認
$ composer
でロゴとか出れば、OK
続けて、ライブラリ
phpmailer
を入れる。
任意のユーザの任意のディレクトリで行うこと
$ composer require phpmailer/phpmailer
Using version ^5.2 for phpmailer/phpmailer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing phpmailer/phpmailer (v5.2.26): Downloading (100%)
phpmailer/phpmailer suggests installing league/oauth2-google (Needed for Google XOAUTH2 authentication)
Writing lock file
Generating autoload files
何処に置いたか忘れたら、これで探すようかな?
$ find -name vendor -type d
smtp送信テストPHP<?
require_once("/置いた所/vendor/autoload.php" ); //これを忘れると動かない!! require_once("/置いた所/vendor/phpmailer/phpmailer/class.phpmailer.php"); //これを忘れると動かない!!
mb_language("japanese");
mb_internal_encoding("UTF-8");
$to = "XXXX@gmail.com"; $subject = "SMTP587テスト"; $body = "smtpサーバ経由のメールテスト";
$from = "hoge@hogehoge.com"; $fromname = "送信テスト君"; $mail = new PHPMailer();//インスタンス生成 $mail->CharSet = "iso-2022-jp"; $mail->Encoding = "7bit"; $mail->IsSMTP(); //smtp利用宣言 $mail->SMTPAuth = TRUE;//smtp認証宣言 $mail->Host = 'mail.xxxx.jp:587'; // ホストアドレス:ポート25or587 $mail->Username = 'hoge'; //smtp認証ユーザ $mail->Password = 'hogehoge'; //smtp認証パス $mail->AddAddress($to);
$mail->From = $from; $mail->FromName = mb_encode_mimeheader(mb_convert_encoding($fromname,"JIS","UTF-8"));
$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8")); $mail->Body = mb_convert_encoding($body,"JIS","UTF-8"); //メールを送信 if (!$mail->Send()){ echo("Failed to send mail. Error:".$mail->ErrorInfo); }else{ echo("Send mail OK."); }
?>
テスト送信が届いたら、
念のため、SMTPサーバの/var/log/maillog も確認し、上手くいってるようだ。
稼働中のプログラムの置き換えをして完了。
明日できれば置き換えよう
うん、がんばろう・・・。