メールの送信

トップ > PHP入門 > メールの送信

目次

広告

メールの送信方法

PHPではメール送信用の関数が用意されているため、メール送信プログラムを簡単に作成することができます。

多くのプロバイダでは、迷惑メールが大量に送信されるのを防ぐための対策が行われています。その影響で、WindowsにインストールしたPHPからはメールが送信できないことがあります。このページのプログラムを実行した際に以下のようなメッセージが表示される場合、メールの送信に失敗しています。

Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()

プロバイダから回避方法が告知されていることもありますが、環境によって設定方法が異なるため、ここでは触れません。メールが送信できなければ、一時的にレンタルサーバーにアップロードして動作確認をするなどしてください。(不正アクセスを防ぐため、動作確認が終わったらアップロードしたファイルを削除してください。)以下の解説は、メールの送信ができる環境であることを前提としています。

メールの送信は mail 関数で行うことができます。

<?php

if (mail("example@example.com", "TEST MAIL", "This is a test message.", "From: from@example.com")) {
  echo "メールが送信されました。";
} else {
  echo "メールの送信に失敗しました。";
}

?>

これで、example@example.com に対して、TEST MAIL という件名で、This is a test message. という本文のメールが送信されます。送信元のアドレスは from@example.com になります。

mail 関数は処理の結果として、メールの送信に成功すれば TRUE を、メールの送信に失敗すれば FALSE を返します。つまり、メール送信処理を if の条件にすることにより、「メールの送信が実行できたかどうか?」を判断しています。

ただ、mail 関数でメールを送信すると、日本語が文字化けしてしまう可能性があります。なので通常は、日本語に対応した mb_send_mail 関数を使用します。具体的には以下のようになります。

<?php

if (mb_send_mail("example@example.com", "テストメール", "これはテストです。", "From: from@example.com")) {
  echo "メールが送信されました。";
} else {
  echo "メールの送信に失敗しました。";
}

?>

これで、example@example.com に対して、テストメール という件名で、これはテストです。 という本文のメールが送信されます。ちなみに、本文中で改行したければ \n と書きます。

それでも文字化けしている場合、mb_language 関数と mb_internal_encoding 関数で言語と文字コードを指定してみてください。

<?php

mb_language("Japanese");
mb_internal_encoding("UTF-8");

if (mb_send_mail("example@example.com", "テストメール", "これはテストです。", "From: from@example.com")) {
  echo "メールが送信されました。";
} else {
  echo "メールの送信に失敗しました。";
}

?>

これらはPHPの言語設定と文字コード設定を調整する命令で、今回は「言語は日本語」「文字コードはUTF-8」に設定しています。これらの命令は、PHPの設定ファイル(php.ini)で言語設定や文字コード設定が適切に行われていれば不要です。

ですがレンタルサーバーなどでは設定がされていなかったり、他の言語や文字コードが設定されていて変更できないことがあります。そのような場合、メール送信前にこの命令を書いておけば、文字化けを防ぐことができます。

フォームからのメール送信

フォームからデータを入力すると、PHPでメールが送信できるプログラムを作成してみます。今回は、以下のHTMLでフォームを作成します。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sample</title>
</head>
<body>
<form action="send.php" method="post">
  件名:<br />
  <input type="text" name="subject" size="30" value="" /><br />
  送信者名:<br />
  <input type="text" name="name" size="30" value="" /><br />
  メールアドレス:<br />
  <input type="text" name="mail" size="30" value="" /><br />
  本文:<br />
  <textarea name="message" cols="30" rows="5"></textarea><br />
  <br />
  <input type="submit" value="送信する" />
</form>
</body>
</html>

ファイル名は form.html としておきます。これをブラウザで表示すると、以下のように表示されます。

フォームサンプル

このフォームからメールを送信する場合、form.html と同じフォルダに send.php を作成し、以下の内容を書きます。

<?php

$message = "名前:" . $_POST["name"] . "\n本文:" . $_POST["message"];

if (!mb_send_mail("example@example.com", $_POST["subject"], $message, "From: " . $_POST["mail"])) {
  exit("error");
}

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sample</title>
</head>
<body>
<p>メールが送信されました。</p>
</body>
</html>

これで form.htmlhttp:// でアクセスし、送信ボタンを押すと example@example.com にメールが送信されます。

if (!mb_send_mail(~)) { ~ } は「メールが送信できなければ」という条件です。mb_send_mail 関数は処理の結果として、メールの送信に成功すれば TRUE を、メールの送信に失敗すれば FALSE を返すため、条件の先頭に ! を付けることにより、メールの送信に失敗したときにエラーメッセージを表示させることができます。(参考

exit() はプログラムを終了するための命令です。カッコの中に文字列を指定すると、その文字列を出力してからプログラムを終了します。これにより、メールが送信できなかった場合は メールが送信されました。 の文字列が表示されなくなります。