PHP mail() 関数を使用して Gmail または Yahoo を使う方法
赤の意味とは何ですか
このチュートリアルでは、ユーザーが入力またはカスタマイズする必要がある行は赤で表示されます!
残りはほとんどコピー&ペースト可能であるべきです。
PHPのmail()について
PHPのmail()関数は、メールを送信するためにsendmail_path設定ディレクティブにあるプログラムを使用します。これはデフォルトでsendmailとして設定されています。
ほとんどのLinuxインストールにはsendmailが事前にインストールされていますが、SPF/PTRレコードの設定、DKIMキーの生成など、PHPスクリプトによって送信されるメールがスパムと見なされないようにするための面倒な手続きが常にあります。MSMTPと呼ばれるSMTPクライアントを使用すると、サードパーティのSMTPサーバーを利用してメールを送信することができ、これはsendmailの代わりにPHPのmail()でも使用できます。
インストール
Fedora LinuxにMSMTPをインストールするには、yumを使用します。
yum install msmtpCentOSのリポジトリにはMSMTP用のRPMパッケージがないため、ソースからインストールする必要があります:
yum install make gcc pkgconfig
wget http://sourceforge.net/projects/msmtp/files/msmtp/1.4.31/msmtp-1.4.31.tar.bz2/download
tar -xvf msmtp-1.4.31.tar.bz2
cd msmtp-1.4.31
./configure
make
make install この記事を書いている時点での最新バージョンは1.4.31ですが、将来的には変更される可能性があります。最新バージョンを取得するには、このSourceForgeのページにアクセスしてください。
Ubuntu/Debianディストリビューションではapt-getを使用します。
apt-get install msmtpArch Linuxのユーザー:
sudo pacman -S msmtpMSMTPの設定
MSMTP の設定ファイルは、各ユーザーのために ~/.msmtprc に保存されており、/etc/msmtprc はシステム全体の設定ファイルです。あなたのディレクトリ内の設定ファイルを開いてください。
vi ~/.msmtprcYahooアカウント用に以下の行を追加してください。
account yahoo
tls on
tls_starttls off
tls_certcheck off
auth on
host smtp.mail.yahoo.com
user user1
from user1@yahoo.com
password yourYahooPa5sw0rdGmailの設定には、以下の設定を使用してください:
account gmail
tls on
tls_certcheck off
auth on
host smtp.gmail.com
port 587
user user1@gmail.com
from user1@gmail.com
password yourgmailPassw0rdこのファイルには複数のアカウントを含めることもできますが、各セクションの "account" の値が一意であることを確認してください。ファイルを保存し、chmod を使用して、このファイルを所有者のみが読み取れるようにします。これはパスワードが含まれているため、必須のステップです。この権限が 600 よりも大きい場合、msmtp は実行されません。
chmod 600 ~/.msmtprcこれをPHPで実装する前に、コマンドラインから確認して正しく動作することを確認してください。そのためには、シンプルなメールを含むプレーンテキストファイルを作成します。
echo -e "From: alice@example.com \n\
To: bob@domain.com \n\
Subject: Hello World \n\
\n\
This email was sent using MSMTP via Gmail/Yahoo." >> sample_email.txt
今、このメールを送ってください:
cat sample_email.txt | msmtp --debug -a gmail bob@domain.com「gmail」という単語を「yahoo」または「アカウント」オプションに入力したもので置き換えてください。「--debug」パラメータのため、多くのメッセージが表示されます。これは、予期しない動作があった場合のトラブルシューティングを容易にするためです。bob@domain.comがこのメールを受信した場合、すべてが正しく設定されているので、このファイルを/etcディレクトリにコピーしてください。
cp -p ~/.msmtprc /etc/.msmtp_phpウェブサーバーが実行されているユーザー名に所有権を変更します。これは、あなたのVPSとインストールされたウェブサーバーのLinuxディストリビューションに応じて「apache」、「www-data」または「nobody」である可能性があります:
chown www-data:www-data /etc/.msmtp_phpPHPの設定
php.iniファイルを開いてください。その場所は、インストールされているOSとPHPのタイプ(PHP CGI、mod_php、PHP-FPMなど)によって異なります。
vi /etc/php5/php.ini次の行を見つけてください:
sendmail_path =msmtp コマンドへのパスを追加して修正します:
sendmail_path = "/usr/bin/msmtp -C /etc/.msmtp_php --logfile /var/log/msmtp.log -a gmail -t"手動でログファイルを作成し、Webサーバーが実行されているユーザー名にその所有権を変更してください:
touch /var/log/msmtp.log
chown www-data:www-data /var/log/msmtp.log変更を適用するには、Webサーバーを再起動してください:
service httpd restartArch Linuxでは、systemctlコマンドを使用してこれを行います:
systemctl restart httpd使用しているOSやウェブサーバーに応じて、「httpd」を適切な名前に置き換えます。PHPが別のプロセス(PHP-FPMのように)として実行されている場合は、それを再起動します。
service php5-fpm restart
このセットアップをテストするためのシンプルな mail() を使った PHP スクリプトを作成してください:
<?php
if(mail("receipient@domain.com","A Subject Here","Hi there,\nThis email was sent using PHP's mail function."))
print "Email successfully sent";
else
print "An error occured";
?> ウェブブラウザからこのファイルにアクセスしてください。
http://www.example.com/file.php このメールが送信されていない場合は、エラーのためにmsmtpログファイルを確認できます。
tail /var/log/msmtp.log一般的なエラー
PHPスクリプトを使用してメールが送信されなかった場合は、以下の手順でトラブルシューティングを行ってください。
- 正しい php.ini ファイルを編集したか確認してください。これは、phpinfo(); ファイルを作成し、"読み込まれた設定ファイル" セクションを確認することで確認できます。
- msmtpの設定ファイルへのパスが間違っているか、ウェブサーバーがこのファイルを読み取る権限を持っていない可能性があります。
コマンドラインPHPを使用してスクリプトを実行することで、メールが送信されたかどうかを確認します:
php /var/www/html/file.php
