PHPのmail関数で送信できないときに確認したいPostfixの設定
- 2020年7月17日
- by SendGrid
- Category: 技術ネタ
この記事は Why Isn’t the PHP Mail Function Sending Mail? の抄訳です。
PHPのmail関数を使うと簡単にメールを送信できます。必要なものは「宛先」「件名」「メッセージ」の3つのみで、たった1行のコードで相手にメールを届けることができます。
しかし、mail関数も万能ではないため、うまく動かなかったときは原因を見つけるのに苦労することがあります。原因には様々なものがあって、たとえば、必要なパラメータを忘れてしまったり、宛先のメールアドレスにスペルミスがあったり、SMTPリレーの設定が必要だったりします。
そして、メールが送れない原因のうち、一番多いのはPostfixの設定誤りです。そこで今回のブログでは、Postfixを正しく設定する方法とそのテスト方法について紹介します。
Postfixとは
Postfixは誰でも自由に使えるオープンソースのMTA(Mail Transfer Agent)で、メールを中継して宛先まで届けるものです。SMTPのプロトコルを備えていて、MacOSを含むUnixライクなOS上で動きます。
Postfixは幅広く使用されていて、Windowsを除くほとんどのコンピューターにプリインストールされています。Postfixが入っていると便利な一方で、正しく設定されていないとメールを送れない原因になってしまうことがあります。
Postfixの設定方法
Postfixの設定が正しいかどうかを確認する前に、まずは環境にインストールされていることを確認しましょう。ターミナルを立ち上げて、次のコマンドを実行してください。
$ postfix
Postfixがインストールされていない場合は、ドキュメントを参照するか、サーバの管理者にインストール方法を確認してください。何らかのエラーが表示された場合は、メールが送れない原因のヒントになるかもしれません。
特にエラーはなく、インストール済みの場合はこの先に進みましょう。
Postfixできちんとメールを送れるようにするためには、いくつか必要なことがあります。
まずはPostfixのローカル設定を修正することです。以下のコマンドを実行して、ターミナルから直接エディタを呼び出してください。
$ sudo vi /etc/postfix/main.cf
設定ファイルを開いたら、次の4つの変数が定義されていることを確認しましょう。
mail_owner=_postfix setgid_group=_postdrop myhostname=localhost.localdomain compatibility_level = 2
ファイルを編集した場合は、保存後に以下のコマンドでPostfixを再起動します。
$ sudo postfix reload
一番大事な変数は “myhostname”です。この定義がないと、メールの送信元となるデフォルトのホスト名を割り当てることができません。“myhostname”には実際に持っているドメイン、または上記例の”localhost.localdomain”のような任意の値を使用してください。
PHPのmail関数を使ったテスト
Postfixが問題なく動くことを確認するために、PHPのmail関数を使用して、以下の簡単なスクリプトを実行します。お好みのテキストエディタやIDEを使って、mail.phpファイルを作成したら以下のコードを書いてください。
<?php $to = "YOUR EMAIL"; $subject = "Test Mail"; $message = "This is a test email"; echo mail($to, $subject, $message);
$toの値は実際に自分が持っているメールアドレスに置き換えます。ターミナルで以下のコマンドを実行したら、メールが届いているか確認しましょう。
$ php mail.php
おわりに
PHPのmail関数でメールを送るのはとても簡単ですが、その分、うまく動かなかったときはとてもストレスが溜まります。送信の際にエラーが出たら、Postfixの設定を思い出してください。
そして、次の3つを確認しましょう。
- Postfixは正しくインストールされているかどうか?
- 4つの変数(特に”myhostname”)が定義されているか?
- テストに使った宛先メールアドレスを間違えていないか?(スペルミスなど)
今回の内容を確認しても送信できない場合は、トラブルシューティングの参考情報として、こちらのStackOverflowの内容も確認してください。