メールを送る

これは単なる例です。実際にはメールは送られません。個人情報も収集していません。

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

メッセージ:

ソース

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

<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'])) {
    $fp = popen("/usr/bin/nkf | /usr/sbin/sendmail -oi だれだれ@どこどこ", "w");
    fwrite($fp, "From: {$_POST['email']}\n");
    fwrite($fp, "Mime-Version: 1.0\n");
    fwrite($fp, "Content-Type: text/plain; charset=ISO-2022-JP\n");
    fwrite($fp, "Content-Transfer-Encoding: 7bit\n\n");
    fwrite($fp, $_POST['message']);
    pclose($fp);
  }
?>

/usr/bin/nkf は漢字コードをデフォルトでJIS(正確には iso-2022-jp)に変換します。 /usr/sbin/sendmail -oi がメールを送るためのコマンドです。 -oi オプション(現在は -i だけでも可)はピリオドだけの行をメールの終端と解釈しないオプションです(これを付けないと . だけの行があるとそこでメールが終わってしまいます)。

課題

上のプログラムではメールアドレスの正当性をチェックしていません。どうすればいいでしょうか。

ごく簡単には次のようにすればいいでしょう。

    if (ereg("^.+@[A-Za-z0-9.-]+\.[A-Za-z]+$", $_POST['email'])) {
      // 正しい
    }

厳密には,メールアドレスのルールはWikipediaの E-mail address の項目に詳しく書いてあります。 このルールに則ってメールアドレスの正当性をチェックするプログラムの例を挙げておきます。 これは Email Address Validation - PHP - ILoveJackDaniels.com に載っているものです。

function check_email_address($email) {
  // First, we check that there's one @ symbol, and that the lengths are right
  if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
    // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
    return false;
  }
  // Split it into sections to make life easier
  $email_array = explode("@", $email);
  $local_array = explode(".", $email_array[0]);
  for ($i = 0; $i < sizeof($local_array); $i++) {
     if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) {
      return false;
    }
  }
  if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
    $domain_array = explode(".", $email_array[1]);
    if (sizeof($domain_array) < 2) {
        return false; // Not enough parts to domain
    }
    for ($i = 0; $i < sizeof($domain_array); $i++) {
      if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) {
        return false;
      }
    }
  }
  return true;
}

しかし日本の携帯キャリアの中には,@ 直前のピリオドなど,ルール違反のメールアドレスを許すものがあります。


奥村晴彦

Last modified: 2008-04-13 15:35:53