メールを送る(1)

「当社へのご連絡・お問合せは次のフォームをご利用ください」などとして,書き込まれた内容を担当者にメールするためのものです。実際にはメールは送られませんし,情報も収集していません。

あなたのメールアドレス:

メッセージ:

ソース

次の例は だれだれ@どこどこ さんにメールを送るためのものです。必ず送り先を自分の正しいメールアドレスに変えてください(全角文字に注意してください)。

<form method="post" action="mail.php">
<p>あなたのメールアドレス:<br>
<input name="email" size="60">
</p>
<p>メッセージ:<br>
<textarea name="message" rows="8" cols="60"></textarea><br>
<input type="submit" value="送る">
<input type="reset" value="消去">
</p>
</form>

<?php
  if (isset($_POST['email'], $_POST['message']) && $_POST['email'] != "" && $_POST['message'] != "") {
    mb_send_mail(
      "だれだれ@どこどこ",       // 宛先
      "フォームからのメール",     // 件名
      $_POST['message'],          // 本文
      "From: {$_POST['email']}",  // 追加ヘッダ
      "-f だれだれ@どこどこ");   // エラー宛先(Return-Path)
    echo "<p>メールを送りました。</p>";
  }
?>

ご注意:

改良点

input タグに type="email" という指定をすれば,ブラウザ側で最低限のメールアドレスのチェックをします:

<input name="email" type="email" size="60">

「送信」ボタンと「消去」ボタンを設けるのが昔からの習慣でしたが,「消去」ボタンは,間違えて押してせっかく書いたものが消えるという事故を防ぐために,なくしてもいいでしょう。また,ボタンは最近では button タグを使うことが増えています:

<form method="post">
<p><label>あなたのメールアドレス:<br>
<input name="email" type="email" size="60"></label>
</p>
<p><label>メッセージ:<br>
<textarea name="message" rows="8" cols="60"></textarea></label>
</p>
<button>送る</button>
</form>

文字化け対策

デフォルトでは ISO-2022-JP でメールが送られますので,この範囲外の文字は化けます。UTF-8 にするには次のようにするといいでしょう:

    $headers = "Content-Transfer-Encoding: base64\n";
    $headers .= "Content-Type: text/plain; charset=UTF-8\n";
    $headers .= "From: {$_POST['email']}";
    mb_send_mail(
      "だれだれ@どこどこ",       // 宛先
      "フォームからのメール",     // 件名
      $_POST['message'],          // 本文
      $headers,  // 追加ヘッダ
      "-f だれだれ@どこどこ");   // エラー宛先(Return-Path)

例えば「森鷗外と内田百閒が髙島屋でPokémonをした」のようなメッセージでお試しください。

メールアドレスのチェック

サーバ側でメールアドレスの正当性の厳密なチェックをするのはけっこうたいへんです。

メールアドレスのルールはWikipediaの E-mail address の項目に詳しく書いてあります。

しかし日本の携帯キャリアの中には,ピリオドで始まるアドレス,「@」直前のピリオド,連続したピリオドなど,ルール違反のメールアドレスを許すものがあります。さらに,RFC 6531 の時代になれば,Unicode(UTF-8)の文字が使えるようになります。

たとえ厳密にチェックしたとしても,綴りの間違い(例えば docomo を dokomo と綴るなど)はとてもチェックできません。しかし,まったくチェックしないと,例えばアドレス中に改行文字を埋め込むことができれば,意図しないヘッダを捏造することが可能になります。

下の例では,制御文字とスペース(0x00〜0x20)を含まないことと,「@」が一つだけ含まれることをチェックしています。簡単ですが,メールアドレス中に改行文字などの制御文字や空白を埋め込まれることは避けられます。

if (preg_match('/\A[^@\x00-\x20]+@[^@\x00-\x20]+\z/', $_POST['email'])) {
  // メールを送る
} else {
  echo "エラーです";
}

preg_match() は正規表現に文字列がマッチするか調べる関数です。古い ereg() という関数は現在は使用しないように勧められています。