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

ECサイトの作成において、商品の購入が確定したときに確認メールを自動で送信する機能を実装したので、その方法についてメモを残しておきます。

## 作りたいもの
- 購入確定画面
- 確定と同時に購入者のメールアドレスにメールを自動送信
- メールには購入者氏名、配送先住所、購入した商品の種類と個数、合計金額を記載

## メールを送信する関数
メールを送信するには`mb_send_mail()`関数を使用します。引数は４つで
```
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
<?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'][]`にはカートに入っている商品の個数が格納されています。

## 参考にしたサイト
- [XAMPP(ローカル環境)からのメール送信を可能にする手順](https://techmemo.biz/web-cheat-sheet/xampp-local-sendmail/)