こんにちは朱夏です。
今回は、フォームからのメール送信テストが出来る環境を作っていきます。
ここまでMAMPを使って来たので、MAMPで何とかできないか試行錯誤しましたが、私のレベルでは解決できませんでした。
そこで、XAMPPを使用する事にしました。
先ずは以下のサイトを参考にXAMPPをインストールします。
次に、送信テストに使用するフォームを設置します。
前回作った問い合わせフォームを簡略化して使います。
作成したPHPファイルを以下に配置します。
画面表示の確認は以下のURLで確認できます。
これで、問い合わせフォーム側の準備は出来ました。
次に行きます。
続きはこちらのサイトを参考に作業しました。
編集が必要なファイルは以下の2つの様です。
念のため、それぞれコピーからバックアップを取っておきます。
※インストール先は<c:\>として説明していきます。
C:\xampp\sendmail\sendmail.ini > sendmail_bk.ini
php.iniの編集
参考サイトに記載のあった行がそもそも存在していない様です。
私の環境では[mail function]はこのような内容になっていました。
[mail function] ; For Win32 only. ; http://php.net/smtp SMTP=localhost ; http://php.net/smtp-port smtp_port=25 ; For Win32 only. ; http://php.net/sendmail-from ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path ;sendmail_path = ; Force the addition of the specified parameters to be passed as extra parameters ; to the sendmail binary. These parameters will always replace the value of ; the 5th parameter to mail(). ;mail.force_extra_parameters = ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename mail.add_x_header=Off ; The path to a log file that will log all mail() calls. Log entries include ; the full path of the script, line number, To address and headers. ;mail.log = ; Log mail to syslog (Event Log on Windows). ;mail.log = syslog
存在していないものはどうしようもないので、以下をsmtp_port=25と書かれた行の下に追記しました。
; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder) sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
これでphp.iniの編集は終了です。
sendmail.iniの編集
こちらも編集していきます。
編集後の状態がこちらになります。
gmailのIDとパスワードは伏せています。
[sendmail] smtp_server=smtp.gmail.com smtp_port=587 smtp_ssl=auto error_logfile=error.log auth_username=*****@gmail.com auth_password=password pop3_server= pop3_username= pop3_password= force_sender= force_recipient= hostname=
gmailの場合は送信側(smtp)の設定だけで問題ない様です。
使用するメールサービスによって送信側(pop)の設定も必要になるみたいですね。
ここで、XAMPPの再起動を実施します。
送信テストを実施してみたところ、うまく送られていない様子。
送信成功か失敗かをページに表示する様にコードを書き換えました。
また、原因調査のため、エラーログを確認することにしました。
- C:\xampp\sendmail\error.log
エラー内容は以下のようなものでした。
送信者アドレスが正常に取得出来ていない様です。
これに関しては回避方法が2つありました。
- sendmail.iniの”force_sender”に送信者アドレスを指定する
- index.phpの$header情報を修正する
今後の事を考えると2の方で対応可能にしておかないと不便な気がするので、どの様に書けば認識してくれるのかを調べました。
検証1
- Fromのみ指定した場合 > 成功
この場合はエラーメッセージを回避する事が出来ました。
しかし、新たなエラーとぶつかることになるのですが・・・
一先ずは今回のエラーを回避する方法を探していきます。
検証2
- \r\nを使う(¥はバックスラッシュ) > 失敗
この方法では、From以外を指定した場合はエラーが出ました。
因みに、初期の状態では、前回のままだったので\nが付いていました。
検証3
- arrayで指定してみる > 成功
この検証で成功しました。
MIME-Version、From、Reply-Toの3つともヘッダー要素として取り込めた様です。
CRLF(\r\nを使う方法)だと、使用するメールサービスなどによって\nのみにする必要があるなど、安定して使えないので、arrayで指定するのが良い様ですね。
1つ問題が解決しましたが、次のエラーが出ています。
受信者のアドレスがRFC-5321に違反しているといった内容のメッセージの様です。
また懐かしいエラーですね・・・
しかし、受信者のアドレスとされている</bb/bbr /@>というもの、これが何を指しているのか、文字化けなのか、メールアドレスの取得に失敗しているのかといったところが謎です。
まだ問題解決していませんが、今回はここまでにします。
最後に現在のコードを置いておきます。
<?php
// 入力確認部分をコメントアウト
// var_dump($_POST);
// 変数の初期化
$page_flag = 0;
// 日本語設定
mb_language('ja');
mb_internal_encoding('UTF-8');
if( !empty($_POST['btn_confirm']) ) {
$page_flag = 1;
} elseif( !empty($_POST['btn_submit']) ) {
$page_flag = 2;
// メール送信
// データ初期化
$header = null;
$auto_reply_subject = null;
$auto_reply_text = null;
$admin_reply_subject = null;
$admin_reply_text = null;
date_default_timezone_set('Asia/Tokyo');
// ヘッダー情報初期化
$auto_header = [
"MIME-Version" => "1.0",
"From" => "xxxxx@gmail.com",
"Reply-To" => "xxxxx@gmail.com"
];
// 件名
$auto_reply_subject = 'お問い合わせありがとうございます。';
// 本文
$auto_reply_text = "お問い合わせいただき、ありがとうございます。下記の内容でお問い合わせを受け付けいたしました。(このメールは自動返信で送信しております。回答までしばらくお待ちください。)\n\n";
$auto_reply_text .= "受付日時:" . date("Y-m-d H:i") . "\n";
$auto_reply_text .= "メールアドレス:" . $_POST['mailaddress'] . "\n\n";
$auto_reply_text .= "お問い合わせ内容:" . $_POST['inquiry'] . "\n\n";
$auto_reply_text .= "○○事務局";
// 送信
if(mb_send_mail( $_POST['mailaddress'], $auto_reply_subject, $auto_reply_text, $auto_header)) {
echo "送信成功";
}else{
echo "送信失敗";
};
// 自分で受け取るメール
// 件名
$admin_reply_subject = "お問い合わせを受け付けました";
// 本文
$admin_reply_text = "お問い合わせを受信しました。\n\n";
$admin_reply_text .= "受付日時:" . date("Y-m-d H:i") . "\n";
$admin_reply_text .= "メールアドレス:" . $_POST['mailaddress'] . "\n";
$admin_reply_text .= "お問い合わせ内容:" . $_POST['inquiry'] . "\n\n";
$admin_reply_text .= "○○事務局";
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>問い合わせフォーム</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<link rel="stylesheet" href="css/style.css">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://kit.fontawesome.com/da0fa6be04.js" crossorigin="anonymous"></script>
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
<![endif]-->
<script src="js/sample.js"></script>
</head>
<body>
<!-- 問い合わせフォーム -->
<div class="container">
<h3>問い合わせフォーム</h3>
<?php if( $page_flag === 1 ): ?>
<!-- page_flagが1の時確認ページ -->
<form method="post" action="">
<!-- メールアドレス -->
<label class="mt-2 mb-0">メールアドレス</label>
<div class="form-row align-items-center">
<div class="col-auto">
<p><?php echo $_POST['mailaddress']; ?></p>
</div>
</div>
<!-- メールアドレスここまで -->
<!-- 問い合わせ内容 -->
<label class="mt-2 mb-0">お問い合わせ内容</label>
<div class="form-row align-items-center">
<div class="col-auto">
<p><?php echo $_POST['inquiry']; ?></p>
</div>
</div>
<!-- 問い合わせ内容ここまで -->
<!-- ボタン -->
<div class="form-row mt-2">
<div class="col-auto">
<button type="submit" name="btn_back" class="btn btn-secondary" value="戻る">戻る</button>
<button type="submit" name="btn_submit" class="btn btn-primary" value="送信">送信</button>
</div>
</div>
<!-- ボタンここまで -->
<!-- 隠し情報 -->
<input type="hidden" name="mailaddress" value="<?php echo $_post['mailaddress'];?>">
<input type="hidden" name="inquiry" value="<?php echo $_post['inquiry'];?>">
<!-- 隠し情報ここまで -->
</form>
<!-- page_flagが1の時確認ページここまで -->
<!-- page_flagが2の完了ページ -->
<?php elseif( $page_flag === 2): ?>
<p class="text-center">送信が完了しました。</p>
<form action="">
<div class="form-row mt-2">
<div class="col-auto">
<button type="submit" name="btn_back" class="btn btn-secondary" value="戻る">戻る</button>
</div>
</div>
</form>
<!-- page_flagが2の完了ページここまで -->
<?php else: ?>
<!-- page_flagが0の入力ページ -->
<form method="post" action="">
<!-- メールアドレス -->
<label class="mt-2 mb-0">メールアドレス</label>
<div class="form-row align-items-center">
<div class="col-auto">
<input type="email" name="mailaddress" class="form-control" id="exampleInputEmail1" placeholder="sample@email.co.jp">
</div>
</div>
<!-- メールアドレスここまで -->
<!-- 問い合わせ内容 -->
<label class="mt-2 mb-0">お問い合わせ内容</label>
<div class="form-row align-items-center">
<div class="col-auto">
<textarea class="form-control" name="inquiry" id="exampleFormControlTextarea1" cols="100" rows="10" placeholder="問い合わせ内容を入力してください"></textarea>
</div>
</div>
<!-- 問い合わせ内容ここまで -->
<!-- 確認ボタン -->
<div class="mt-2">
<button type="submit" name="btn_confirm" class="btn btn-primary" value="内容確認へ">確認</button>
</div>
<!-- 確認ボタンここまで -->
</form>
<!-- page_flagが0の入力ページここまで -->
</div>
<!-- 問い合わせフォームここまで -->
<?php endif; ?>
</body>
</html>
今回は以上です。
