【初心者向け】PHPでメールフォームを作る方法を解説!
PHPの学習を進めている方で、メールフォームを作成してみたい、という方もいるのはないでしょうか?
今回の記事では、PHPでメールフォームを作る方法を紹介していきます。
はじめに
HTMLには、「mailto:」というのがあります。
のような形で記述することで、メーラーが自動的に立ち上がり、メールを送る事ができますが
htmlファイルに送信先アドレスが丸見えなので、これがスパムの標的になります。
そのため、メールでの問い合わせは、formと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()
プロバイダから回避方法が告知されていることもありますが、環境によって設定方法が異なるため、ここでは触れません。
メールが送信できなければ、手元の環境ではなく、レンタルサーバにアップロードしたりして動作確認をするなどしてください。
(不正アクセスを防ぐため、動作確認が終わったらアップロードしたファイルを削除してください。)
今回の解説では、メールの送信ができる環境であることを前提としています。
メール送信に関する注意点(文字コード)
文字コードとは、コンピュータで文字を利用するために各文字に割り当てられたコード番号のことです。
例えば A は文字コード 41、B は文字コード 42、のように決められています。
現在インターネットでは、UTF-8・JIS・Shift-JIS・EUC-JP といった文字コードがよく利用されていますが
文字コードによって日本語に割り当てられているコード番号が異なります。
例えば「あ」の文字コードは
・UTF-8 では E38182
・Shift-JIS では 82A0
・EUC-JP では A4A2
と、異なる文字コードが割り当てられています。ですので何も考えずに文字コードを混在させると、文字コード
を判別できずに文字化けすることがあります。
現在は色々な文字コードが利用されていますが、UTF-8 が使われる割合が増えています。
UTF-8 は Unicode という文字コードの一つです。
Unicode は、世界中で使われているすべての文字を、共通の文字コードで利用できるようにするための規格です。
特にこだわりが無ければ、文字コードは UTF-8 にしておきます。
今回のメール送信でも文字コード UTF-8 で作業します。
なお、Shift-JIS でPHPプログラムを作成するのは
・文字コード 5C を含む文字を正しく表示できない
・正規表現が正しくマッチしないことがある
・一部のライブラリが正しく動作しないことがある
・データベースに Shift-JIS の利用を宣言すると、セキュリティホールが発生することがある
という問題があるのでお勧めできません。
mail関数
PHPでのメールの送信は 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 の条件にすることにより、「メールの送信が実行できたかどうか?」を判断しています。
文字化け対応(mb_send_mail関数)
mail 関数でメールを送信すると、日本語が文字化けしてしまう可能性があります。
ですので、通常は、日本語に対応した mb_send_mail 関数を使用します。具体的には以下のようになります。
<?php
if (mb_s end_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)で言語設定や文字コード設定が適切に行われていれば不要です。
ですがレンタルサーバなどでは設定がされていなかったり、他の言語や文字コードが設定されていて変更できないことがあります。
そのような場合、メール送信前にこの命令を書いておけば、文字化けを防ぐことができます。
“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
フォームからのメール送信
フォームからデータを入力すると、PHPでメールが送信できるプログラムを作成してみます。今回は、以下の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.html にブラウザからインターネットアクセスし、送信ボタンを押すと「example@example.com」にメールが送信されます。
if (!mb_send_mail(~)) { ~ } は「メールが送信できなければ」という条件です。
mb_send_mail 関数は処理の結果として、メールの送信に成功すれば TRUE を、メールの送信に失敗すれば FALSE を返すため
条件の先頭に ! を付けることにより、メールの送信に失敗したときにエラーメッセージを表示させることができます。
exit() はプログラムを終了するための命令です。
カッコの中に文字列を指定すると、その文字列を出力してからプログラムを終了します。
これにより、メールが送信できなかった場合は メールが送信されました。 の文字列が表示されなくなります。
さいごに
PHPでのメールフォーム作成、いかがだったでしょうか。
実際のページでは、入力チェックやエラーロジックなどまだ実装すべきコードがありますので段階的に覚えていってください。
このようにPHPにはもともと便利な関数が多数あります。
PHPマニュアルを眺めるだけでも有益な情報が得られたりするので、是非興味がある方はご覧になってください。
DMM WEBCAMPについて
DMM WEBCAMPは、最短1ヶ月でプログラミング・Webデザインを習得できる「ビジネス教養コース」を展開しています。オンラインで講師が付くため、自宅から質問し放題です。
DMM WEBCAMPを運営する株式会社インフラトップ では、「学びと仕事を通して人生を最高の物語にする」という理念で会社を経営しています。
キャリアアップを目指す方は、この機会に私達と一緒にプログラミングを学んでみませんか?
【インタビュー】コツコツ独学×スクールで実践。未経験からエンジニアに転職!
プログラミング未経験から、書籍での独学期間で基礎を固め、スクールを効率的に活用し、見事エンジニア転職を成功させたWebCamp受講生にお話を伺いました。
「低予算でも効率的にエンジニア転職のスキルをつける方法は?」
「未経験でも本当にエンジニアになれるの?」
といった疑問を持っている方は、是非この記事を読んでみてくださいね!
https://web-camp.io/magazine/archives/12654