PHPからのメール送信

WebサーバーのPHPプログラムから、ユーザーからの問い合わせ等をメール送信しているが、迷惑メールとなって届かないことが多い。最近、GMailのスパム判定がさらに厳しくなっているかんじがする。

1.従来の方法

PHP標準の以下のメール関数を使って実装。

(mail)https://www.php.net/manual/ja/function.mail.php

(mb-send-mail)https://www.php.net/manual/ja/function.mb-send-mail.php

SMTPサーバーの指定はできず、サーバーのメール転送エージェント(MTA:sendmailあるいはPostfix)から送信される。Webサーバーは、サービスのドメインのMXレコードに指定されているメールサーバー (以下「正式メールサーバー」) ではないので、SPFレコードにWebサーバーのアドレスを追加しても、最近は迷惑メールの判断されることが増えてきた。

2.改善策

サービス提供しているドメインの正式メールサーバー経由でメール送信するように修正した。方法として、1)メールリレーの指定をやってみたが、上手くいかない部分もあったので、2)STMPサーバーからの送信とした。

2.1 メールリレーの指定

PHPプログラムは変更せずに、サーバーのMTAから、正式メールサーバーを経由(メールリレー)して送る方法を試してみた。

CentOSでsendmailから、SMTP認証を利用して正式メールサーバー経由で送る場合の設定は、以下が参考になる。

https://access.redhat.com/ja/solutions/2733021

メールサーバーとしてXServerのメールサーバーを利用している場合、SPF_SOFTFAILとなる問題がある。

https://darekoi.blogspot.com/2018/05/xserver-spf.html

ウィルスチェックサーバーをSPFに追加すれば、改善するかもしれないが、保証はない。↓

(2021/08/14)

ウィルスチェックサーバーをSPFに追加してみたころ、以下となりGmailでは迷惑メールのまま送信できなかったが、他のメールには届いた。

tests=SPF_HELO_NONE,SPF_PASS

2.2 正式メールサーバーからの送信

PHPプログラムから、サーバーのMTAを経由せず、SMTP認証を利用して 正式メールサーバーから送るように変更した。

SMTP認証でのメール送信としては、PHPMailerが広く使われているよう。

https://github.com/PHPMailer/PHPMailer

検索すると、使い方について説明している日本語ページはあるが、古いものも多いので、正式なGitHubのサンプル見る方が良いと思う。英語が苦手でも、サンプルプログラム見れば使い方は簡単にわかる。

https://github.com/PHPMailer/PHPMailer#a-simple-example

ただし、サンプルは多言語に対応していないので、以下の追加は必要。

  $mail->CharSet = "utf-8";
  $mail->Encoding = "base64";

あと、正式版にする時には、以下を変更。

 //$mail->SMTPDebug = SMTP::DEBUG_SERVER; //デバッグ
 //$mail->SMTPDebug = SMTP::DEBUG_CONNECTION; //接続に失敗する場合のデバッグ
  $mail->SMTPDebug = SMTP::DEBUG_OFF;

3.結論

迷惑メールにならないサーバーPHPプログラムからのメール送信には、やはり正式にSMTP認証してメールサーバーから送るのが一番かと。DNSにSPF設定してとか、色々やったけど、さっさとプログラム直せばよかった。

PHPのバージョンアップ作業中

PHPのバージョンアップのために、別サーバーを立ち上げて従来システムの動作確認をしている。

1.バージョン、パス等の確認

まずは、phpが正しいバージョンを参照しているかの確認。

php -v

ライブラリ等のパスは、以下で確認。

php -i | grep path

2.PEAR

何でcomposerじゃないのかというと、元プログラムの関係で、pearを使っている。

インストールされているパッケージの確認。

pear list

PEAR設定の確認は以下。

pear config-show

パッケージのファイルの確認は以下。HTTP_Request2の場合。

pear list-files HTTP_Request2

Apache2.4とPHP7.4の連携

動作中のシステムを、そろそろ各種バージョンアップした新サーバーに移す作業に入ったが、新サーバーで、ApacheからPHPが動作しなかった。

新サーバーのバージョン

CentOS8.2
Apache2.4.37
PHP7.4.10

原因

以前のApacheのデフォルトが 、MPM prefork だったのが、今回は MPM event になっていた。

(確認)

/etc/httpd/conf.modules.d/00-mpm.confの中を見ると、ロードするモジュールがMPM eventのモジュールに変わってる。

対応

以前のpreforkにするということも考えられるが、MPM eventで突き進むことにした。

連携するために追加でやったことは、以下。

1.php-fpmの有効化

php-fpmをサービス起動するように設定

systemctl enable php74-php-fpm
systemctl start php74-php-fpm

2.mod_proxy_fcgiを有効化

今までは、/etc/httpd/conf.modules.d/00-proxy.confは、すべてコメントアウトしていたが、以下を有効にする。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so