PHPでメールを送信するには
PHPは、ウェブアプリを行う際に用いるスクリプト言語です。PHPの結果を動的にウェブに反映させることができます。この処理結果やステータスなどを通知する際に、メール機能を用いることができます。ここでは、PHPで提供するメール機能の構文や用法について、解説します。
【参考】:PHP 【参考】:PHP マニュアル 【参考】:PHP マニュアル: メール
PHPのメール関数を使うには
PHPは、メール関数がコールされるとsendmailのバイナリファイルに処理を引き渡します。そのためPHPのメール関数を使うには、sendmailバイナリの準備とアクセスが必要です。初期設定を行うphp.iniファイルを修正することで、Qmailなどにパスを差し換えることもできます。
【参考】:PHP マニュアル: メール 【参考】:PHP マニュアル: メール インストール/設定
PHPで日本語のメールを送信するには
PHPで日本語のメールを送信するには、マルチバイトに対応するメール関数mb_send_mailが提供されます。mb_language関数の指定に従って、メッセージがエンコード処理され、送信されます。使い方は、通常のメール関数を学んでから解説します。
【参考】:PHP マニュアル: mb_send_mail 【参考】:PHP マニュアル: mb_language
mail関数の構文と用法
mail関数の構文と用法は、次の通りです。
mail(送信宛先, メールタイトル, 送信メッセージ[, 追加ヘッダ[, 追加パラメータ]]):
引数は、string型です。追加ヘッダは、stringまたはstringの配列が利用できます。それぞれの引数は、次の意味を持ちます。
・送信宛先 メールの送信先を通常のメール送信宛先の書式RFC 2822に従って記述します。複数宛先がある場合は、カンマ(”,”)で区切ります。例えば、”user@hostname.com”や”user1@hostname.com, user2@hostname.com”などと指定します。
・メールタイトル メールタイトルは、メールの表題でRFC 2047に従います。改行コードを入れずに1行で記述します。
・送信メッセージ 送信メッセージを記述します。改行コードは、”\r\n”を追加してください。行の長さは70文字が上限です。
・追加ヘッダ From、Cc、Bccなどの追加に使用します。Fromヘッダは、必ず必要です。この追加ヘッダにFromを入れるか、php.iniにデフォルト設定の値を入れておきます。
・追加パラメータ 追加パラメータは、sendmailなどのメール送信プログラムに引数として渡されます。
mail関数の使い方
mail関数を使うには、先ほどの文字列を引数として用います。送信宛先を ”$to”、メールタイトルを ”$subject”、 メール本文である送信メッセージを ”$message”とします。
// 引数を設定する
$to = ‘user@hostname.com’;
$subject = ‘Title’;
$message = ‘Hello World’;
$headers = ‘From: myname@example.net’;
// mail関数をコールする
mail($to, $subject, $message, $headers);
送信メッセージの “$message”を複数行にする場合は、”Hello\r\nWorld”などのようにCRLFを追加すれば行の分割ができます。CRLFを用いる場合は、シングルクォーテーションではなくダブルクォーテーションで解釈させます。追加ヘッダの区切りも同様にCRLFを追加します。
mb_send_mail関数の構文と用法
mb_send_mail関数はmail関数のラッパのため、構文と用法はmail関数と同じです。違いはマルチバイトに対応する点で、日本語を扱う場合はmb_send_mail関数を用います。
mb_send_mail(送信宛先, メールタイトル, 送信メッセージ[, 追加ヘッダ[, 追加パラメータ]]):
言語の設定は、mb_language関数を用います。内部文字のエンコーディングを明示的に行う場合は、合わせてmb_internal_encoding関数を用います。上記を組み合わせて以下のように、表します。
mb_language(言語):
mb_internal_encoding(文字エンコーディング):
mb_send_mail(送信宛先, メールタイトル, 送信メッセージ[, 追加ヘッダ[, 追加パラメータ]]):
【参考】:PHP マニュアル: mb_send_mail 【参考】:PHP マニュアル: mb_language 【参考】:PHP マニュアル: mb_internal_encoding
mb_send_mail関数の使い方
mb_send_mail関数の使い方は、mail関数と同じです。日本語など多言語でメール送信するには、言語を指定するmb_language関数と文字エンコーディングを行うmb_internal_encoding関数をあらかじめコールし、マルチバイトの設定を行う必要があります。
// 言語設定の引数を設定する
$language= ‘Japanese’;
// 言語を設定する
mb_language($language);
// エンコーディングの引数を設定する
$encoding= ‘UTF-8’;
// エンコーディングを設定する
mb_internal_encoding($encoding);
// メールで必要な引数を設定する
$to = ‘user@hostname.com’;
$subject = ‘Title’;
$message = ‘Hello World’;
$headers = ‘From: myname@example.net’;
// mb_send_mail関数をコールする
mb_send_mail($to, $subject, $message, $headers);
【参考】:PHP マニュアル: mb_send_mail 【参考】:PHP マニュアル: mb_language 【参考】:PHP マニュアル: mb_internal_encoding
PHPメール関数の確認事項
PHPのメール関数を使ってメール送信を行う場合ですが、メール送信のテストを行うとGmailなどの受取先のドメイン認証でエラーとなる場合があります。Gmailはスパム対策などでセキュリティが厳しくなっており、このような症状が現れます。
まずは、送信元となる”From:”が実際の送信元のドメインと一致しているか確認すると良いでしょう。解決しない場合は、なりすまし対策のSPFレコードの追加により、Gmailでも認証をパスすることができます。詳細は以下のリンクを確認しましょう。
【参考】:インターネット協会 SPF(Sender Policy Framework)
PHPMailerを利用する
PHPのメール関数は手軽に利用できますが、認証でエラーとなり送信できない場合があります。Gmailの認証エラーなどが、認証エラーの例です。その場合には、SMTP認証を用いるライブラリPHPMailerを用いるのが良いでしょう。PHPMailerは、WordPressなどに用いられ、日本語に対応します。
使い方は、mb_internal_encodingに代えて、SMTPのリレーホスト名やSMTP認証パスワードなどをPHPMailerの引数に渡します。外部のSMTPサーバを指定することで、送信メールが迷惑メールやスパムと認識されなくなります。公式サイトには、Gmailのサンプルコードも公開されています。
【参考】:Github: PHPMailer 【参考】:Github: PHPMailer gmail.phps
PHPでメールを受信するには
PHPでメールを受信するには、IMAP関数のimap_fetch_overviewやimap_fetchbodyを使ったり、Mailparse関数でファイルのパ―スやメッセージのデコードなどで対応します。メール受信は送信よりも複雑な処理が必要ですので、メール送信がうまく実行できてから実装すると良いでしょう。
【参考】:PHP マニュアル: IMAP、POP3 および NNTP 【参考】:PHP マニュアル: Mailparse
PHPのメール機能は簡単だがセキュリティ面を考慮する必要もある
PHPのメール機能はシンプルな構造で、簡単にメール送信することができます。開発中のコード確認テストなどで利用する場合は問題ありませんが、商用リリースする場合は、メール送信先の認証エラーなどに注意を払う必要があります。
メール関数を使用する場合は、迷惑メールやスパムと認識されないように、設定を十分に行いましょう。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから