PHPでメールフォームを作成する時によく使うのがmb_send_mail関数。メールフォームをお手製で作成する際、入力項目はサイトごとに増減するものの、基本的なプログラムは使いまわして使用することが多いかと思います。そのため目立ったエラーは生じにくいのですが、「メールが送信/受信できない」というトラブルが発生する事があります。
このトラブル、いくつか考えられる原因があるのですが、判明すればその原因はとても簡単。ただ簡単なトラブルほどハマって抜け出せなくなってしまうもの。今回はmb_send_mail関数でメールが送信できない時に確認すべきことを掲載します。
サンプルコード
まずはPHPの記述例です。
<?php mb_language("ja"); mb_internal_encoding("utf-8"); $to="xxxxx@materialpot.com"; $subject="お問い合わせ"; $msg="メッセージが入ります。"; $from = $_POST['fromMail']; $header="From: {$from}\nReply-To: {$from}\nContent-Type: text/plain;"; if(mb_send_mail($to,$subject,$msg,$header)){ echo "メールが送信されました。"; } else { echo "メールが送信できませんでした。"; } ?>
メールが送信されない原因1:Fromのメールアドレスがメールアドレスの形式でない
$_POST[‘fromMail’] には入力した人のメールアドレスが入る想定です。このように「Fromに入力されたメールアドレスを指定する」ことはよくある事ですが、この時、形式チェックを入れないで例えばメールアドレス欄に「あああ」いったメールアドレスの形式でない文字列を入れたとします。するとメールが送信されない場合があるのです。
実装後の送信テストとして全項目に「111」や「テスト」等の文字列を入れてとりあえず送信できるか確認してみた。そんな時に発生しやすいのがこのトラブルです。メールアドレス形式で入力していればちゃんと送信されるのに、この「あああ」が原因だと気付かないと、他のコードを追って泥沼にハマることになってしまいます。
そのため、送信確認の際は下記のようにメールアドレス形式でFromを指定してあげる必要があります。
<?php mb_language("ja"); mb_internal_encoding("utf-8"); $to="xxxxx@materialpot.com"; $subject="お問い合わせ"; $msg="メッセージが入ります。"; $from = "zzzzz@materialpot.com"; $header="From: {$from}\nReply-To: {$from}\nContent-Type: text/plain;"; if(mb_send_mail($to,$subject,$msg,$header)){ echo "メールが送信されました。"; } else { echo "メールが送信できませんでした。"; } ?>
メールが送信されない原因2:FromとToのメールアドレスが同じ
これも知らないと気付きにくい罠ですが、FromとToのメールアドレスが同じ場合、メールが送信されない場合があります。mb_send_mailでメールが送信されない場合、以下のようにFromとToが同じメールアドレスになってしまっていないか、確認してみましょう。
<?php mb_language("ja"); mb_internal_encoding("utf-8"); $to="same@materialpot.com"; $subject="お問い合わせ"; $msg="メッセージが入ります。"; $from = "same@materialpot.com"; $header="From: {$from}\nReply-To: {$from}\nContent-Type: text/plain;"; if(mb_send_mail($to,$subject,$msg,$header)){ echo "メールが送信されました。"; } else { echo "メールが送信できませんでした。"; } ?>
メールが送信されない原因3:迷惑メールフォルダに入ってしまっている
これは少し例外ですが、実はメールは送信されていて、受信も出来ているのに、迷惑メールフォルダに入ってしまっていることで気付いていないというケースです。実装側の確認ではなく依頼主であるクライアントに確認してもらう時に起こりがちなことで、「(エンジニア側)こちらは受信できているんですけど。。。」「(クライアント側)こちらは受信できていないんですけど。。。」という不毛なやり取りになってしまいます。
以上、ハマると抜け出しにくい、mb_send_mailでメールが送信/受信できない時に確認すべきことでした。