mb_send_mail関数でメール送信システムを作成
PHPのメールフォームで管理者に届くメールとは別に送信者にも自動返信メールを送りたかったので調べると
mb_send_mail関数というそれ専用に近い関数が用意されているんですね。さすがPHP。
今回はこの
mb_send_mail関数を使用してメール送信と送信者側にも、入力した内容を自動返信するメールフォームシステムを作成します。
HTMLサイドのメールフォームの作成
まずフォームを入力するためのHTMLで雛型フォームを作成します。
ページ名を『
entry.html』とします。
『entry.html』HTMLの記述
<div id="contentes">
<!-- 応募フォーム start -->
<form name="yanyo_form" id="yanyo_form" method="post" action="return_mail.php">
<label>お名前</label><br>
<input type="text" name="entry_name" value="お名前" /><br>
<label>年齢</label><br>
<input type="text" name="entry_age" value="年齢" /><br>
<label>メールアドレス</label><br>
<input type="text" name="entry_email" value="メールアドレス" /><br>
<label>現在最も興味のある言語</label><br>
<input type="radio" name="entry_lang" value="HTML/CSS" />HTML/CSS
<input type="radio" name="entry_lang" value="JavaScript" />JavaScript
<input type="radio" name="entry_lang" value="jQuery" />jQuery
<input type="radio" name="entry_lang" value="PHP" />PHP
<br>
<label>メッセージ</label><br>
<textarea name="entry_message" rows="30" cols="3"value="メッセージ"></textarea><br>
<input type="submit" value="送信"><br>
</form>
<!-- 応募フォーム end -->
</div>
『entry.html』CSSの記述
*{
margin:0;
padding:0;
}
#contentes {
width:80%;
margin:30px auto;
background:#CCCCCC;
padding:5%;
border-radius:20px;
}
#yanyo_form {
width:90%;
margin:20px auto;
}
label {
font-weight:bold;
color:cadetblue;
text-shadow:#fff 1px 2px 2px;
}
input, textarea {
width:100%;
margin:10px auto 20px;
box-shadow:#999 3px 4px 8px;
resize: none;
border:none;
padding:5px 15px;
}
input[type="radio"] {
width:5%;
box-shadow:none;
}
input[type="submit"] {
width:30%;
padding:2% 5%;
margin:0 auto;
display:block;
border-radius:10px;
font-weight:bold;
}
フォーム送信完了ページの作成
入力ページの作成できたら本来のシステムを想定したしたメールフォームならば入力内容の確認ページを作成しなければなりませんが、今回は省略します。
しっかりとしたメールフォームの情報は他所様のサイトでいくらでも勉強できますので・・・
送信完了のページのファイル名を『
finish.html』とします。
『finish.html』のHTML記述
<div id="contentes">
<p>送信完了しました。</p>
<p>入力されたメールアドレスに自動返信メールが送信されました。<br>ご確認下さい。</p>
<p><a href="#" target="_blank">戻る</a></p>
</div>
※戻るのページリンクURLは任意で変更して下さい。
『finish.html』のCSS記述
*{
margin:0;
padding:0;
}
#contentes {
width:80%;
margin:30px auto;
background:#CCCCCC;
padding:5%;
border-radius:20px;
}
#contentes h1{
font-size:150%;
color: cadetblue;
text-shadow:#fff 1px 2px 2px;
margin-bottom:20px;
}
#contentes p{
line-height:30px;
}
これで送信が成功した場合の送信完了ページが完成しました。
管理者へのメール送信設定の作成
雛型となるフォームが完成したら、次はサーバーサイドの設定です。
PHPシステムソース側のファイル名は『
return_mail.php』とします。
※変更する場合は『entry.html』で設定しているphpファイル名も変更してください。
『return_mail.php』のPHP記述その①
// 【1】文字コードを設定
header("Content-Type: text/html;charset=utf-8");
mb_language('ja');
mb_internal_encoding( "utf-8" );
//【2】HTMLエンティティ変換
$name2 = htmlspecialchars($_POST[entry_name], ENT_QUOTES);
$age = htmlspecialchars($_POST[entry_age], ENT_QUOTES);
$email = htmlspecialchars($_POST[entry_email], ENT_QUOTES);
$lang = htmlspecialchars($_POST[entry_lang], ENT_QUOTES);
$message2 = htmlspecialchars($_POST[entry_message], ENT_QUOTES);
$name = mb_convert_kana($name2,"sKV"); //「名前」半角カナ→全角カナ
$message = mb_convert_kana($message2,"sKV"); //「メッセージ」半角カナ→全角カナ
【1】文字コード解説
- ①文字コードはheader関数で文字コードUTF-8を指定
- ②mb_language関数で文字言語を日本語に設定
- ③mb_internal_encoding関数で内部文字エンコーディングをUTF-8に設定
【2】HTMLエンティティ変換
『entry.html』のフォームから
ユーザが入力したPOSTデータ(文字列)をそのまま利用するのはとても危険です。
悪意のあるスクリプトソースを入力され、そのままフォームの送信ボタンを押した瞬間スクリプトが実行される行為からなる危険性を
クロスサイトスクリプティング(xss)というそうです。怖いッスね。
htmlspecalchars関数の役割
そこで
htmlspecalchars関数でhtmlの特殊文字が含まれたPOSTデータをhtmlエンティティに変換する事で、表示できるhtml形式にしてタグを無効化してくれるんですって!!『無効化』って響きがまたなんとも厨ニっぽくて素敵です。
『
&』 → 『
&amp;』に 『
<』 → 『
&lt;』に 『
>』 → 『
&gt;』に 『
"』 → 『
&quot;』に それぞれ変換される
さらに第2引数に
ENT_QUOTESを追加する事で『
’』 → 『
&acute;』に変換されます。
mb_convert_kana関数の役割
”年齢”や”メールアドレス”のように正規の文字制限をかけている場合は問題ないとして、今回の様にセキュリティ面はザルのようなソースでは”氏名”と”メッセージ”の場合、半角カナで入力された場合はメールを受信すると"?"や無記入の状態で送られてきます。
mb_convert_kana関数を使用し「名前」と「メッセージ」半角カナ→全角カナに変換したものを改めてエンティティに変換しています。
mb_convert_kana関数の変換オプション一覧
オプション |
意味 |
r |
「全角」英字を「半角」に変換 |
R |
「半角」英字を「全角」に変換 |
n |
「全角」数字を「半角」に変換 |
N |
「半角」数字を「全角」に変換 |
a |
「全角」英数字を「半角」に変換 |
A |
「半角」英数字を「全角」に変換 |
s |
「全角」スペースを「半角」に変換
(U+3000 -> U+0020) |
S |
「半角」スペースを「全角」に変換
(U+0020 -> U+3000) |
k |
「全角カタカナ」を「半角カタカナ」に変換 |
K |
「半角カタカナ」を「全角カタカナ」に変換 |
h |
「全角ひらがな」を「半角カタカナ」に変換 |
H |
「半角カタカナ」を「全角ひらがな」に変換 |
c |
「全角カタカナ」を「全角ひらがな」に変換 |
C |
「全角ひらがな」を「全角カタカナ」に変換 |
V |
濁点付きの文字を一文字に変換
("K", "H" と共に使用) |
管理者へのメール送信設定の作成
受け取ったPOSTデータの調理が済んだらデータを管理者側へのメールを作成する処理を作ります。
『return_mail.php』のPHP記述その②
//管理者受信用メール送信処理
function funcManagerAddress($name,$age,$email,$lang,$message){
$mailto = $email; //送信先メールアドレス
$subject = "ときどきWEB|テスト受信メール"; //メール件名
//本文
$content="『ときどきweb|PHPでmb_send_mail関数使って送信者に自動返信機能付きメールフォーム作ってやんよ!!!』のテストフォームからの送信メールです\n"."【お名前】: ".$name."\n"."【年齢】: ".$age."才\n"."【メールアドレス】: ".$email."\n"."【現在最も興味のある言語】: ".$lang."\n"."【メッセージ】: ".$message."\n\n";
$mailfrom="From:" .mb_encode_mimeheader($name) ."<".$email.">";
if(mb_send_mail($mailto,$subject,$content,$mailfrom) == true){
$managerFlag = "○";
}else{
$managerFlag = "×";
}
return $managerFlag;
};
『管理者受信用メール送信処理』解説
- ①管理者側メール送信処理をユーザー定義関数funcManagerAddressにて作成し、引数に$name(名前),$age(年齢),$email(メールアドレス),$lang(現在最も興味のある言語),$message(メッセージ)を代入します
- ②$mailto変数に入力された送信先メールアドレス$emailを代入します
- ③$content変数に本文の内容を代入します。こちらで入力内容を出力しない場合は$email以外の引数は不要ですので、自由にどうぞ。
- ④$mailfrom変数に$emailで送信者のアドレスと、任意ですがmb_encode_mimeheader関数でMIMEヘッダの文字列をエンコードし、送信者の$nameを追記する事でメーラーの差出人の項目に送信者の名前が記載されるので誰から送られてきたのかわかりやすくなります。
- ⑤これで今回メインとなるmb_send_mail関数と引数に$mailto、$subject、$content、$mailfromを代入します。
- ⑥ここまでの処理が問題なく行われたか?(true)で判定し、問題なかった場合は新規変数の$managerFlagに成功の"○"と失敗の"×"(わかりやすければ文字列は何でも良いです。)を値に持ちその判定を戻り値として返します。
送信者への自動返信メール設定の作成
管理者同様にPOSTデータを調理し送信者側へ送るメールの内容を作成します。
『return_mail.php』のPHP記述その③
//送信者用自動返信メール送信処理
function funcContactAddress($name,$age,$email,$lang,$message){
//ヘッダー用変数
$mailto = $email; //送信先メールアドレス
$subject = "ときどきWEB|自動返信メール"; //メール件名
//本文
$content="『ときどきweb|PHPでmb_send_mail関数使って送信者に自動返信機能付きメールフォーム作ってやんよ!!!』のテストフォームから以下の内容で受け付けました。\n"."【お名前】: ".$name."\n"."【年齢】: ".$age."才\n"."【メールアドレス】: ".$email."\n"."【現在最も興味のある言語】: ".$lang."\n"."【メッセージ】: ".$message."\n\nご入力ありがとうございました。\n";
$mailfrom="From:" .mb_encode_mimeheader("ときどきweb") ."<"管理者のメールアドレス">";
if(mb_send_mail($mailto,$subject,$content,$mailfrom) == true){
$contactFlag = "○";
}else{
$contactFlag = "×";
}
return $contactFlag;
};
こちらも前項の設定とほぼ同じです。
$mailfromに自分のメールアドレスを記載しておくと受信者側も管理しやすいと思うので是非。
各処理の分岐と送信エラー処理
管理者側と送信者側の処理を作成したらそれぞれのと処理への振り分けとそれぞれのフラグが成立しているかの判定をし、いずれかが不成立の場合はエラー処理を行います。
『return_mail.php』のPHP記述その④
//送信者用自動返信メール送信
$contactAddress = funcContactAddress($name,$age,$email,$lang,$message);
//管理者受信用メール送信
$managerAddress = funcManagerAddress($name,$age,$email,$lang,$message);
if($contactAddress === "○" && $managerAddress === "○" ){
//送信メール送信・自動返信が成功したら完了ページへリダイレクト
header("Location: http://●●●/finish.html");
}else{
//送信メール送信・自動返信のいずれかが失敗したらエラー出力
echo '送信に失敗しました。\nお手数ですが、再度ご入力をお願いします。\n<a href="http://●●●/entry.html">入力ページへ戻る\n';
print_r($contactAddress);
print_r($managerAddress);
}
『各処理の分岐と送信エラー処理』解説
- ①送信者側の処理を変数$contactAddressに代入、送信者側の処理を変数$managerAddressに代入します。
- ②変数$contactAddress、変数$managerAddressそれぞれの戻り値が成功("○")の場合作成していた『finish.html』へheader関数を使用してリダイレクト遷移させます。
- ③もしどちらかでも失敗("×")の場合はエラー処理の表記が出力されます。ここでどちらが失敗したのかわかりやすいようにそれぞれの変数をprint_r出力またはさらに条件を追記しエラー詳細テキストを準備しておくと良いでしょう。
※送信完了のリダイレクトURLと戻るページのURLは任意で変更して下さい。
追記
ハッキリ言って私もサーバーサイドは苦手なので最低限の設計しかできていませんのでこちらのソースを実装なさる場合のセキュリティ面での不備は自己責任にてお願いします。
gmailでは送った相手が使用しているサーバーまでつきとめられてる様なので変な事には使えませんでしょうけど。