メールを送る(2)

もうちょっと複雑な住所登録フォームメールの例です。

実際にはメールは送られませんので,安心してお試しください。

メール(必須):

住所 (必須):

氏名 (必須):

備考(オプション):

ソース

このファイル mail2.html は単なるHTML(XHTML)ファイルです。 上の「例」のところには次のように書き込んであります。

<form method="post" action="send.php">
<p>メール(必須):<input name="email" size="40" /></p>
<p>住所 (必須):<input name="address" size="40" /></p>
<p>氏名 (必須):<input name="name" size="40" /></p>
<p>備考(オプション):<br />
<textarea name="memo" rows="4" cols="60"></textarea></p>
<p>
<input type="submit" value="送る" />
<input type="reset" value="クリア" />
</p>
</form>

一方,form の action で指定している send.php は(だいたい)次のようになっています。

<?php
  echo "<p>メール: ", htmlspecialchars($_POST['email']), "</p>\n";
  echo "<p>住所: ", htmlspecialchars($_POST['address']), "</p>\n";
  echo "<p>氏名: ", htmlspecialchars($_POST['name']), "</p>\n";
  echo "<p>備考:</p>\n<pre>\n", htmlspecialchars($_POST['memo']), "\n</pre>\n";

  $machigai = 0;
  if ($_POST['email'] == '') {
    echo "<p>メールアドレスがありません。</p>\n";
    $machigai++;
  }
  if ($_POST['address'] == '') {
    echo "<p>住所がありません。</p>\n";
    $machigai++;
  }
  if ($_POST['name'] == '') {
    echo "<p>氏名がありません。</p>\n";
    $machigai++;
  }

  if ($machigai == 0) {
    $fp = popen("/usr/bin/nkf -m0 | /usr/sbin/sendmail -oi -t", "w");
    fwrite($fp, "From: {$_POST['email']}\r\n");
    fwrite($fp, "To: だれだれ@どこどこ\r\n");
    fwrite($fp, "Subject: " . mb_encode_mimeheader('住所登録', 'ISO-2022-JP') . "\r\n");
    fwrite($fp, "Mime-Version: 1.0\r\n");
    fwrite($fp, "Content-Type: text/plain; charset=ISO-2022-JP\r\n");
    fwrite($fp, "Content-Transfer-Encoding: 7bit\r\n\r\n");
    fwrite($fp, "メール: {$_POST['email']}\r\n\r\n");
    fwrite($fp, "住所: {$_POST['address']}\r\n\r\n");
    fwrite($fp, "氏名: {$_POST['name']}\r\n\r\n");
    fwrite($fp, "備考:\r\n{$_POST['memo']}\r\n");
    pclose($fp);
    echo "<p>受け付けました。</p>\r\n";
  } else {
    echo "<p>$machigai 個のエラーがあります。</p>\n";
    echo "<p>ブラウザの[戻る]ボタンを押して戻り,やりなおしてください。</p>\n";
  }
?>

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

メールがエラーの場合に「だれだれ@どこどこ」に行くようにするには,sendmail の引数に -f だれだれ@どこどこ を加えるか,あるいはヘッダに

Errors-To: だれだれ@どこどこ

を加えてください。

改良点

上の例では

  echo "<p>備考:</p>\n<pre>\n", htmlspecialchars($_POST['memo']), "\n</pre>\n";

としていますが,改行を入れないで長い備考を書き込まれると横スクロールが発生してしまいます。これを避けるには

  echo "<p>備考:<br />\n",
    str_replace(array("\r\n", "\n", "\r"), '<br />',
                htmlspecialchars($_POST['memo'])),
    "</p>\n";

のように改行を <br /> で置き換えるだけにするほうがよさそうです。


奥村晴彦

Last modified: 2009-08-05 21:55:59