ECサイトの作成において、商品の購入が確定したときに確認メールを自動で送信する機能を実装したので、その方法についてメモを残しておきます。
作りたいもの
- 購入確定画面
- 確定と同時に購入者のメールアドレスにメールを自動送信
- メールには購入者氏名、配送先住所、購入した商品の種類と個数、合計金額を記載
メールを送信する関数
メールを送信するにはmb_send_mail()
関数を使用します。引数は4つで
mb_send_mail(受信者のメールアドレス,件名,本文,送信者のメールアドレス)
のような形で使用します。
XAMPPでメールを送信する設定
上記の関数をXAMPP環境で使用してもmb_send_mail(): Failed to connect to mailserver at "localhost" port 25
というエラーが出ると思います。
XAMPPでメールを送信するには設定が必要なのでそちらも説明します。
まず、xampp/phpにあるphp.ini
を編集します。
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
と記載されている箇所を
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
;sendmail_path="C:\xampp\mailtodisk\mailtodisk.exe"
と変更します。php.ini
の設定はこれでOKです。
次は、xampp/sendmailに入っているsendmail.ini
を編集します。
まずsmtp_serverの設定をします。
smtp_server=smtp.mail.yahoo.co.jp
こうすることで、yahooメールで設定できます。
次に、以下のようにポート番号の設定をします。
smtp_port=587
auth_username
とauth_password
をyahooメールのユーザ名とパスワードに設定します。
auth_username=yourusername
auth_password=yourpassword
最後にforce_sender
にメールアドレスを入れて完了です。
force_sender=youraccount@yahoo.co.jp
以上の設定をすることで、メールが送れるようになります。
購入確定画面サンプル
<?php
session_start();
$name=$_POST['name'];
$adress=$_POST['adress'];
$total=$_POST['total'];
$creditNum=$_POST['creditNum'];
$status=1;
$count=count($_SESSION['cart']);
if(isset($name) && isset($adress) && isset($total) && isset($creditNum) ){
$hostname = "localhost"; //ホスト名
$userid = "iimori"; //データベースユーザ名
$passwd = "A8h3avau"; //接続パスワード
$dbname = "ecdatabase"; //データベース名
$con=mysqli_connect($hostname,$userid,$passwd,$dbname); //db接続に必要な情報を変数に入れる
// 接続状況をチェックします
if (mysqli_connect_errno()) {
die("データベースに接続できません:" . mysqli_connect_error() . "\n");
} else {
echo "データベースの接続に成功しました。\n";
}
$con->set_charset('utf8');
/* プリペアドステートメントを作成します */
if ($stmt = mysqli_prepare($con, "INSERT INTO orders (name, adress, totalprice, creditNum, status) VALUES (?,?,?,?,?)")) {
/* マーカにパラメータをバインドします */
mysqli_stmt_bind_param($stmt, "ssssi", $name,$adress,$total,$creditNum,$status);
/* クエリを実行します */
mysqli_stmt_execute($stmt);
/* 値を取得します */
mysqli_stmt_fetch($stmt);
/* ステートメントを閉じます */
mysqli_stmt_close($stmt);
}
$query = 'SELECT id FROM orders WHERE id=(SELECT MAX(id) FROM orders)';
$result = $con->query($query);
// クエリを実行します。
if (!$result) {
echo $con->error;
exit();
}
$row=$result->fetch_array(MYSQLI_ASSOC);
for($i=0; $i<$count; $i++){
/* プリペアドステートメントを作成します */
if ($stmt = mysqli_prepare($con, "INSERT INTO order_detail (order_id, productName, boughtQuantity) VALUES (?,?,?)")) {
/* マーカにパラメータをバインドします */
mysqli_stmt_bind_param($stmt, "sss", $row['id'],$_POST['productName'][$i],$_SESSION['quantity'][$i]);
/* クエリを実行します */
mysqli_stmt_execute($stmt);
/* 値を取得します */
mysqli_stmt_fetch($stmt);
/* ステートメントを閉じます */
mysqli_stmt_close($stmt);
}
}
// 接続を閉じます
mysqli_close($con);
}
//送信元の設定
$header="From: me@example.com";
// 変数とタイムゾーンを初期化
$auto_reply_subject = null;
$auto_reply_text = null;
date_default_timezone_set('Asia/Tokyo');
// 件名を設定
$auto_reply_subject = '注文が確定しました';
// 本文を設定
$auto_reply_text = "以下の注文で確定しました。\n\n";
$auto_reply_text .= "氏名:".$name. "\n";
$auto_reply_text .= "配送先:".$adress."\n";
$auto_reply_text .= "お買い上げ商品:";
for($j=0; $j<$count; $j++){
$auto_reply_text .= $_POST['productName'][$j]." × ".$_SESSION['quantity'][$j]."個"."\n";
}
$auto_reply_text .= "お買い上げ合計金額:".$total;
// メール送信
mb_send_mail( $_POST['email'], $auto_reply_subject, $auto_reply_text, $header);
unset($_SESSION['cart']);
unset($_SESSION['quantity']);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>注文完了</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>
<body>
<h1>注文完了</h1>
<div class="center">
注文が確定しました。<br>
お買い上げありがとうございます!<br>
<form action="product_list.php" method="post">
<input type="submit" name="back" value="商品一覧に戻る">
</form>
</div>
</body>
</html>
以上が購入確定画面のソースコードになります。
$_SESSION['cart'][]
にはカートに入っている商品の番号、$_SESSION['quantity'][]
にはカートに入っている商品の個数が格納されています。