#21 PHPでお問い合わせフォームを作る【ぴよぴよコーダーの開発日記】

何度も失敗してるけど、会社が休みになったので再度挑戦。まずはindex.htmlに下記のコードを記載

<form action="confirm.php" method="post">
   ■お問い合わせ内容を入力してください
   <p><textarea name="message" rows="5" style="width: 90%;"></textarea></p>
   <br>
   <p><input type="submit" value="お問い合わせ内容の確認"></p>
</form>

confirm.phpにて、入力メッセージを表示

<?php
//サニタイジング
$message = htmlspecialchars($_POST['message'], ENT_QUOTES);
?>
<form action="send.php" method="post">
<input type="hidden" name="message" value="<?php echo $message; ?>">
■お問い合わせ内容を確認してください。
<br>
お問い合わせ詳細:<br>
<?php
//改行部分にbrを埋め込む。nl2br関数
echo nl2br($message);
?>
<br><br>
<p><input type="submit" value="お問い合わせ内容の送信"></p>
</form>

send.phpに送信処理書く

<?php
//サニタイジング
$message = htmlspecialchars($_POST['message'], ENT_QUOTES);
//日本語の設定
mb_language('ja');
mb_internal_encoding("UTF-8");
//送信元アドレス設定
$name = '自動送信';
$email = '送信元のメールアドレスを書くよ';
$header = 'FROM:'. mb_encode_mimeheader($name) . '<' . $email . '>';
//メール送信
$result = mb_send_mail('自分のメールアドレスを書く', $message, $header);
//メール送信の確認
if($result){
 //メール送信の成功
 echo 'お問い合わせ内容を送信しました';
} else {
 echo '送信に失敗しました';
}
?>

実際に動かしてみると、こんなエラーメッセージが出る

Warning: mb_send_mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini(mb_send_mail関数:ローカルホストのポート25のメールサーバへ接続が失敗した。php.iniでSMTPとsmtpポートの設定を確認してください。)

なるほど。php.iniにSMTPサーバ名とsmtp_portにポート番号を指定しないといけないらしい。そういえば、そもそもWindowsにはメールサーバ入っていないんだっけ?と思って下記のサイトを参考にfake sendmailというメールサーバをダウンロードしてみる。

WindowsのPHPでsendmailを使えるようにする 

ダウンロードページに行くと「Unfortunately I no longer have the time or resources to provide any support or updates to fake sendmail for windows.(残念だったね、Windows用のfake sendmailに対するサポートや更新を提供する時間やリソースなんか、もはや無いんだよ)うわっっ。上からな感じ。とはいえ、ローカルの勉強用だしひとまずダウンロードしてみる。落としたsendmail.iniに、下記のように、SMTPサーバーのアドレスとログイン情報を設定をする。

smtp_server=smtp.gmail.com
smtp_port=25
auth_username=テスト用メールアドレス
auth_password=テスト用メールアドレスのパスワード

そして、php.iniには下記のように、sendmailのパスを設定する(自分はc直下にダウンロードしたので)。

sendmail_path = c:/sendmail/sendmail.exe -t -i

-t をつけると、CC:やBCC:が使えるオプション。-iはドットをメール終了の合図としないオプションだそうです。

よし!設定が終わったので、apache再起動して改めて問い合わせフォームを動かしてみる。

「送信が失敗しました」とだけ出る。。ふひー。C:\sendmailのerror.logを見る。「Connect timed out.」うわー。エラーログもヒントなしかぁ。。詰んだ。まぁ。fake sendmail自体、Windowsのサポートする暇ないっつってるし仕方ないのかな。2018年1月から更新情報止まってるし。

お問い合わせフォームとの闘いはまだ続く予定。

参考:WindowsのPHPでsendmailを使えるようにする

参考:PHP mb_send_mail()のローカル環境でのメール送信について。

参考:php.iniの設定

参考:PHP メールを送信するサンプル(mb_send_mail)

参考:XAMPPのFake Sendmail を使用したPHPのSendmail 送信テストの方法

参考:xamppのfake sendmailを使ってローカル開発環境からメールを送信する

参考:fake sendmail for windows ってなんで無名なんだ???

追記:smtp_portを25から587に変更したら別のエラーメッセージが出ました!また調べたら書きます。

追記2:smtp_portを通常の25から、迷惑メール対策で「Outbound Port25 Blocking」が実施されている場合などに対応した587に変更してapacheを再起動したところ、C:\sendmailのerror.logに「Username and Password not accepted」(ユーザー名とパスワードが受け入れられない)とエラーがでました。その後、いくつか調べてみたのですが、gmailの安全性の低いアプリのアクセスの許可などの設定をいじる必要があるみたいで、gmailが万が一使えなくなったら困るので、いったんローカルのテストはここまでにします。。

参考:Gmail(SMTP)経由でメール送信する

参考:smtp.gmail.comを使ってメール送信するための設定方法

参考:php_sendmail

参考:安全性の低いアプリのアクセス

参考:他のメール プラットフォームで Gmail のメールをチェックする

この記事が気に入ったらサポートをしてみませんか?