PHP Manual

PHPでメール送信(mail()、SMTP関数)する。

26. 11. 2019

PHPでは、基本的にメールを送信する方法は2つあります。

  • ネイティブの mail() 関数ですが、これにはかなりの制限があります。
  • またはSMTPサーバーを経由する。

mail()`関数は、SMTPサーバを経由してメールを送信する必要があります。

使い方は簡単で、関数を呼び出すだけです。

mail('jan@barasek.com', '課題', 'メッセージの文面...');

そして、送信はPHPが勝手にやってくれる。

内部的には、送信は php.ini から設定を読み込んで、メールを配信するためのデフォルトのSMTPサーバを探すことで動作します。そのため、事前にWebサーバーの設定が必要です。

mail()`関数の主な落とし穴は、プログラマがすべてのロジックを自分で考えなければならないことです。例えば、暗号化に関するヘッダを捨てたり、証明書をメッセージの暗号化にリンクさせたりといったことです。

送信に失敗した場合は false 値が返されるので,それをキャッチして自分自身で処理しなければならない.具体的なエラーは error_get_last() を呼び出すことで限定的に知ることができるので、例えば。

if (@mail($to, $subject, $message) === false) {
throw new \Exception(
'メール送信できない。'
. (@error_get_last()['メッセージ'] ?? '')
);
}

TIP: メールの送信元アドレスと使用するエンコードを指定していないことに注意してください。

これらの設定はすべてヘッダを介して渡される必要があります。

それでもなお mail() 関数を使用する必要がある場合 (例えばホスティングのため) は、 nette/mail パッケージと SendmailMailer サービスを使用することをお勧めします。このサービスはメールの送信をうまく処理することができます。

SMTPサーバー

SMTPは「Simple Mail Transfer Protocol」の略で、(すぐにわかると思いますが)これはとても正しいです。

SMTP は mail() とは異なり、PHP 側からだけでなく、メールサーバー側でも直接設定が可能な、より高度なプロトコルです。

2018年はホストのSMTPサポートが充実しています。

SMTP は基本的に、PHP が最初に SMTP サーバーへの接続を確立し (PHP の php_openssl.dll 拡張モジュールが必要です。おそらく既にアクティブになっているでしょう)、 接続中に認証 (ログイン認証が正しいかどうかを確認します) を行い、 データベースと同様の方法でサーバーと通信します。つまり、個別のリクエストを送るのではなく、 常に単一の接続を維持します。SMTPの大きな利点は、(TLSとして知られる)暗号化を直接サポートすることである。

localhostからメールを送信する - シンプルな解決策

新しく書いたアプリケーションをテストするときに、localhostからメールを送信する必要があることがよくあります。

ヒント:**について

Macの場合、MAMPサーバーが現在ログインしているApple Mailアカウントを何らかの方法で「魔法のように」見つけ、メッセージは常に現在のアカウントから送信されるので、状況は簡単です。

しかし、常にこの動作に依存することはできないので、独自のソリューションを設定するのが良いでしょう。インターネット接続とGoogleアカウントがあれば、PHPから直接接続できるGmailアカウントを利用して、メールを送信することができるので、非常に簡単です。

nette/mail` パッケージを使用する場合は、設定は簡単です。

mail:
smtp: true
host: smtp.gmail.com
username: janbarasek@gmail.com
password: *********
secure: ssl

パスワードは、アカウントのログインパスワードではありません(それでは安全ではなく、例えば 二要素認証 を使用することができません)。

「アプリケーションパスワード」と呼ばれるものを使用する必要があります。実装的には、アプリケーションを直接Googleアカウントに登録し、PHPに入力する何らかのランダム生成パスワードが割り当てられ、それを介して送信できるようになるということです。

詳しい操作方法は、Googleのサイトをご覧ください。

Wedosでのメール設定

Wedosホスティングでは1日500通しかメールが送れないので、しばらくはSMTP接続に苦労しました。

nette/mail` パッケージを通して、次のように行われます (実行可能な解決策)。

mail:
smtp: true
host: smtp-*******.wedos.net
username: jan@barasek.com
password: ******
secure: tls
port: 587

host`パラメータはホスティングごとに異なり、ホスティングを登録した際にWedosから送信されるメールに記載されています。

ユーザー名はメールの送信元となるメールボックスを表します。メールボックスが存在する必要があります。PHPでメールを送信する場合、送信先も同じアドレスに設定する必要があります(Netteでは ->setFrom()` メソッドで設定します)。

設定を正確に正しく記入しないと、様々なエラーメッセージが投げられ、メールを送信することができません。

送信メッセージ数が制限を超えた場合は、例外が発生し、制限を超えたことを通知します。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
2.
Status:
All systems normal.
2024