XAMPP ローカル環境からGmailを送信する

## はじめに
前回予約フォームを作成しました。
今回はこのフォームに登録したあアドレスには予約完了、管理者のアドレスには受付完了のメールが届くようにします。

## Gmail側でアプリパスワードを取得する
使用するGmail側でアプリパスワードを発行します。
まずはGoogleアカウントの2段階認証を有効に設定されているか確認します。

[Googleのアカウントページ](https://myaccount.google.com/security)の「セキュリティ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/dfb2d7fa-a89c-4e8e-e981-79a02ff4214d.png)
「2段階認証プロセス」がオンになっていればパスワードの発行が可能です。
オンになっていない場合は[2段階認証の許可](https://support.google.com/accounts/answer/185839?hl=ja&co=GENIE.Platform%3DAndroid)を参照し、設定します。
パスワード発行のため、「アプリ　パスワード」をクリックします。
（※一度生成済みなので、過去のものが表示されていることはご了承ください。。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/1bb15e6f-ae55-ef9b-4279-991a34bf98dd.png)
「アプリを選択」では「メール」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/b80c39db-90cc-0742-cd2f-a226364a3a42.png)
「デバイスを選択」では「その他（名前を入力）」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/9a19d0b8-7b25-e070-b745-744fdf846d67.png)
「sendmail」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/1aa1dca2-b35c-3286-e40f-52ce2355f550.png)
生成されたパスワードが表示されたらメモしておきます。

## Xampp側を更新する
C:\xampp\sendmail配下に配置されている「sendmail.ini」をエディタで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/cfa078f0-3e8d-5968-c95d-c28402aa58c1.png)
以下の通り更新します。
```sendmail.ini
smtp_server=smtp.gmail.com
smtp_port=587
smtp_ssl=auto
auth_username=パスワードを発行したメールアドレスを記載（送信元メールアドレス）
auth_password=発行したパスワードを記載
```

C:\xampp\php配下に配置されている「php.ini」をエディタで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/f5a6bd02-e169-f875-c36b-cc15d7a959f7.png)

以下の通り更新します。
 SMTP  と smtp_port  が有効の場合はコメントアウトし、 sendmail_path  にsendmail.exeのあるファイルパスを指定します。
```php.ini
[mail function]
; For Win32 only.
; https://php.net/smtp
;SMTP=localhost
; https://php.net/smtp-port
;smtp_port=25

; For Win32 only.
; https://php.net/sendmail-from
;sendmail_from = test@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; https://php.net/sendmail-path
sendmail_path ="\"C:\xampp\sendmail\sendmail.exe\" -t"
```

## Apacheの再起動
ApacheをStopし、再度Startします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/2193c29e-b062-f12c-d239-83a6fd3dd0e4.png)

## 動作確認
C:\xampp\htdocs直下に以下のテスト用ソースコードを「testmail.php」の名前で保存します。
```test.php
<?php

$to      = '送信先のメールアドレスを記載';
$subject = 'sample'; 
$message = 'success!!'; 
$headers = 'From: testmail@gmail.com' . "\r\n"; 

if(mail($to, $subject, $message, $headers)){
    echo "メール送信は成功しました!!!";
}else{
    echo "メールは送信できませんでした。。。";
}
?>
```
[localhost\testmail.php](localhost\testmail.php)をブラウザで開きます。

ブラウザに「メール送信は成功しました!!!」の表示と、指定したアドレスにGmailが届いて大成功！

## 予約フォームに組み込む
予約フォームで登録した情報も用いて予約者、管理者にメールを送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/312b24d2-8858-e501-8170-6cf82eb23d3f.png)

### 予約者に対する予約完了メール
```calendar.php
<?php
    //エンドユーザーへの予約完了連絡
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");

    $to = $mail;
    $subject = "予約完了のお知らせ";
    $headers = "From: from@example.com";
    $message ='ご予約内容の確認です。' . "\r\n" .
              'お名前:' . "{$name}\r\n" .
              '電話番号:' . "{$number}\r\n" .
              'メールアドレス:' . "{$mail}\r\n" .
              'ご予約期日:' . "{$date}\r\n" .
              'ご予約人数:' . "{$member}" . '人' . "\r\n" .
              'ご参加お待ちしております。';

    mb_send_mail($to, $subject, $message, $headers);
?>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/fd3829e2-6921-6b53-9025-153f5ef43472.png)


### 管理者に対する予約受付メール
```calendar.php
<?php
    //管理者への予約受付連絡
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");

   $toAdmin = '管理者のメールアドレスを記載';
   $subjectAdmin = "予約受付のお知らせ";
   $headersAdmin = "From: from@example.com";
   $messageAdmin ='受付内容の確認です。' . "\r\n" .
                'お名前:' . "{$name}" . '様' . "\r\n" .
                '電話番号:' . "{$number}\r\n" .
                'メールアドレス:' . "{$mail}\r\n" .
                'ご予約期日:' . "{$date}\r\n" .
                'ご予約人数:' . "{$member}" . '人' . "\r\n";

    mb_send_mail($toAdmin, $subjectAdmin, $messageAdmin, $headersAdmin);
?>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829365/fe256204-1926-cd65-49d7-6eb3a85cc5d1.png)

## さいごに
sendmail.ini側しか更新できていなかったため、テストメールが送信できませんでした。
送信できない時の解決策、設定を確認し、php.iniを更新することでメールの受信を確認することができました。
次はカレンダーに表示させる情報を増やしたいです。