AWSのCloud9環境でPHPの学習を進めています。
またレンタルサーバーを使って実際に作ったPHPが本番環境で動くかを確かめたり、といったことも行っています。
PHPのmb_send_mailというメール送信の関数の使い方の話です。
Cloud9環境では動くけどレンタルサーバーでは動かない事もあるので調べていました。
侍エンジニア塾というプログラミングスクールに入ってるんですけど、自分で調べて解決したので記事にしています。
ということで今日はPHPのmb_send_mail関数を使ったメール送信をやってみました。
phpでメール送信するための手順は2つ
①mb_send_mailを動かすphpファイルの作成
②php.iniファイルの設定
この2つの手順ですすめていきます。
mb_send_mail関数のリファレンスを確認
さてphpのコーディングをする前に関数のリファレンスを確認して引数やら使い方やらを見ていきましょう。
mb_send_mailという関数はメールを送信する関数です。
mail()関数でもメール送信はできるけどmb(マルチバイト)日本語を送る事を想定するとmb_send_mail関数を使った方が良いということで基本的にはmb_send_mailを使うようです。
引数などの書き方と返り値
mb_send_mail ( 宛先 , タイトル, 本文, ヘッダー )
となっています。
引数 | 型 | 説明 |
---|---|---|
宛先 | String | string型で送信先のメールアドレスを指定します。アドレスをカンマで区切れば複数の宛先を指定できます。 |
タイトル | String | string型でこのメールのタイトルを記述します |
本文 | String | string型でこのメールの本文を記述します。 |
ヘッダー | String Array |
メールヘッダの最後に挿入されるstringまたはarrayとなっています。ここで送信元アドレス(From)やCc, Bcc、返信先アドレスを指定したりできます。 |
これでmb_send_mail関数を呼び出して成功すればTRUEが、失敗すればFALSEが返ります。
mb_send_mailをするPHPファイルを用意
以下のPHPファイルを用意します。MAILTOやFromやReturn-Pathは適宜編集してください。
このphpファイルをレンタルサーバーにアップロードしてブラウザでアクセスするだけでメールが送信されます。
<?php const MAILTO = "info@pg-happy.jp"; //宛先メールアドレス const SUBJECT = "サンキューメール"; $content = "レンタルサーバーでのメール送信テストです。\n"; $content .= "このメールを受け取ったということはちゃんと送信されていますね。"; $headers = <<<HEAD From : from@pg-happy.jp //送信元メールアドレス Return-Path: from@pg-happy.jp //送信元メールアドレス Content-Type: text/plain;charset=ISO-2022-JP //おまじない(無くてもいいっぽい) HEAD; $is_success = mb_send_mail(MAILTO, SUBJECT, $content, $headers); if(!$is_success) { die('メール送信失敗'); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>メール送信完了画面</title> </head> <body> <p>メール送信が完了しました。</p> </body> </html>
もしこのソースで試すなら、MAILTOはご自身のメールアドレスを設定してください。
$headersにはヘッダー情報を入れていきますが、Fromだけでも大丈夫です。
その際には
$headers = 'From:from@pg-happy.jp';
とすればOKです。
ちなみにFromのメールアドレスは架空のでも問題ありませんでした。(本当は良くないと思うけど)
レンタルサーバーによってはそのサーバー内で作成したメールアドレスしか受け付けない場合もあるかもしれません。
またPHPのリファレンスによるとFromは必ず記述しなければ以下のWarningが出ると書かれています。
Warning: mail(): “sendmail_from” not set in php.ini or custom “From:” header missing
けど私がテストしたときはFromが無くてもメール送信できちゃいました。
その際の送信元はレンタルサーバーのデフォルトメールアドレスになっていました。
サーバーのphp.iniファイルの設定
mb_send_mail関数を使うにあたってサーバー内にあるphp.iniファイルを編集する必要がある場合があります。
私が使ってるレンタルサーバーのエックスサーバーでは特に編集の必要はありませんでしたけど。
以下のように記述があると思いますがこのままで問題なし。
SMTP = localhost smtp_port = 25 sendmail_path = /usr/sbin/sendmail -t -i
最初メール送信ができなくて色々調査してたんですけど、ネットのブログとかでは以下のように編集すべし、とか書かれているブログもありました。
SMTP = sv000.xserver.jp smtp_port = 587 sendmail_path = /usr/sbin/sendmail -t -i
STMPには自分が契約しているサーバーの番号を記述し、smtp_portには25ではなくて587を指定せよ、ということです。
念のためエックスサーバーのphp.iniの編集方法を書いておきます
サーバーパネルからログインし
画面下部php.ini設定をクリックし
該当のドメインを選択し
php.ini直接編集をクリック
これで編集画面が出てくるので編集できるようになります。
デフォルト送信元メールアドレスをphp.iniに記述しちゃう
以下の1文をphp.iniに追記してもOKです。
sendmail_from = from@pg-happy.jp
そうするとデフォルトの送信元メールアドレスがこれに設定されます。
phpファイルのほうで
$headers = 'From:from@pg-happy.jp';
というのを書かなくてもいいことになります。書かなければphp.iniの方が使われます。
一通り設定ができたらアップロードしたphpファイルにブラウザでアクセスしてみましょう。
また宛先メールアドレスにメールが届いていることを確認しましょう。
mb_send_mailと各社レンタルサーバー別の挙動
ここではmb_send_mailが各社レンタルサーバーで使えるかテストしてみたのでその結果を書いています。
エックスサーバーでmb_send_mail
前述のとおり問題なく動きました。
さくらレンタルサーバーでmb_send_mail
特に問題なくメール送信できた。php.iniの編集も必要なくデフォルトのままでOKでした。
php.iniの設定はデフォルトで以下のようになっています。
SMTP = localhost
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -t -i
送信元メールアドレスは自動的に「アカウント名@wwwサーバ番号.sakura.ne.jp」となっていました。
ロリポップレンタルサーバーでmb_send_mail
こちらも特に問題なくメール送信できました。php.iniの編集もしておらずデフォルトのままです。
ユーザーによるphp.iniの設定は制限がされていて、ロリポップの標準設定を使うようになってるみたいです。
ちなみにデフォルトの送信元は「アカウント名@phy.lolipop.jp」のようになっていました。適宜Fromを記述して設定しましょう。
バリューサーバーでmb_send_mail
こちらもmb_send_mailは正常に使えました。
php.iniは以下のようになっており特に編集はしませんでした。デフォルトの送信元アドレスは「root@契約したバリューサーバードメイン.jp」です。
SMTP = localhost
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -t -i
ということでお値段が安めの人気のレンタルサーバー4種に関してmb_send_mailが正常動作することを確認できました。
教材のmb_send_mailが動いたり動かなかったり
私がいまPHPの学習で取り組んでいる教材ではmb_send_mailの記述が以下のようになっていました。
headerに色々と記述してるみたいなんですよね。
const SUBJECT = 'サイト改善アンケート'; const TO = 'info@pg-happy.jp'; $headers = <<<HEAD From : {$_POST['from']} Return-Path: {$_POST['from']} Content-Type: text/plain;charset=ISO-2022-JP HEAD; $body = "●●".SUBJECT."●●\n"; mb_send_mail(TO, SUBJECT, $body, $headers);
よく見ると Fromのところが $_POST[‘from’]となっています。これは教材ではNULLが入っているっぽくてphp.iniのデフォルトを使用するようになってるみたいですけど。
Cloud9だとNULLでも問題なくメール送信できて、エックスサーバーだとメール送信できなかったんです。
これだけはいまだに謎です。取り急ぎFromには何も記述しないか、しっかり送信元を記述すれば動くことがわかりました。