LoginSignup
3
2

More than 3 years have passed since last update.

自動メール送信機能の実装

Posted at

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_usernameauth_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'][]にはカートに入っている商品の個数が格納されています。

参考にしたサイト

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2