XAMPP環境でPHPを使ってメールを送れるようにするSMTPサーバーの設定方法

## こういうエラーに対処できる
**`Failed to connect to mailserver at "localhost" port 25`**

## 1.sendmail.exeを手に入れる
まずは各自の`xampp`ディレクトリに`sendmail`ディレクトリがあるか確かめる。
なかった場合、`xampp`ディレクトリ直下に`sendmail`ディレクトリを作成。
[fake sendmail for windows](https://www.glob.com.au/sendmail/)から`sendmail.zip`をダウンロードし、解凍して`sendmail.exe`などの`zip`ファイル内のすべてのファイルを`~\xampp\sendmail`ディレクトリに移す。

## 2.php.iniを編集する
作成した`~\xampp\sendmail`ディレクトリの内容を`XAMPP`や`PHP`に読み込ませるために、`~\xampp\php\php.ini`を編集する。

```php.ini
[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 = "\"～\xampp\sendmail\sendmail.exe\" -t"
; ↑コメントアウトを外して、sendmail.exeのパスと-tを追加する。
```

## 3.sendmail.iniを編集する(Gメール版)
今度は`~\xampp\sendmail\sendmail.ini`に実際に送信するメールの設定などを追加していく。
今回はGメールのメールアドレスを使用する際の設定。

```sendmail.ini
smtp_server=smtp.gmail.com
; ↑smtp.gmail.comを設定

; smtp port (normally 25)

smtp_port=587
; ↑ここは587を設定

; SMTPS (SSL) support
;   auto = use SSL for port 465, otherwise try to use TLS
;   ssl  = alway use SSL
;   tls  = always use TLS
;   none = never try to use SSL

smtp_ssl=auto
; ↑autoになっていなかったらautoにする

; /*中略*/

;debug_logfile=debug.log

; if your smtp server requires authentication, modify the following two lines

auth_username=sample@gmail.com
; ↑Googleアカウントのメールアドレス
auth_password=password
; ↑Googleアカウントのパスワードでない、別に発行されたパスワードであるアプリパスワードを記入
; 4.アプリパスワードの発行で解説

; if your smtp server uses pop3 before smtp authentication, modify the 
; following three lines.  do not enable unless it is required.

pop3_server=
pop3_username=
pop3_password=

; force the sender to always be the following email address
; this will only affect the "MAIL FROM" command, it won't modify 
; the "From: " header of the message content

force_sender=sample@gmail.com
; ↑Googleアカウントのメールアドレス
```

## 4.アプリパスワードの発行
Gメールを使ってメールを送信する際、アプリパスワードが必要になる。
このパスワードは二段階認証の代わりとして使用され、このパスワードが外部に漏れてもアカウントが特定されないようにするためのもの。
ここでは、そのアプリパスワードの発行方法を説明する。

1. Googleアカウントの[セキュリティ](https://myaccount.google.com/security)から`アプリパスワード`を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/fed4da03-d291-14b6-e2a8-883763890040.png)
2. パスワードを入力し、本人確認を終えたら、`アプリの選択`をクリックし`その他(名前の入力)`を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/c04801e4-441b-1969-01d8-62dea5d1dee6.png)
3. `SMTP`などの名前を付けて、`生成`をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/39f9a09a-69f6-6b7f-4f7b-a1fbd4a51951.png)
4. `お使いのデバイスのアプリ パスワード`の下にある黄色い枠に囲まれた16文字がアプリパスワード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/a0e9840f-b3f8-7ca3-5867-0383a57b4234.png)
5. そのアプリパスワードをコピーして、`sendmail.ini`に貼り付ける。

```sendmail.ece
auth_username=sample@gmail.com
auth_password=【アプリパスワード】
```

## 5.テスト
以上でメール送信に必要な設定は完了したため、ここではテストを行う。
`PHP`には`mb_sendmail()`関数があるため、それだけのPHPファイルを作成し、コマンドプロントなどから実行して、実際にメールが送られるか確かめる。

```mail_test.php
<?php 
mb_send_mail('送信先メールアドレス', '件名', '本文', 'From:sample@gmail.com');
// $ php　mail_test.php
// ↑コマンドプロントでの操作
 ?>
```

## 参考資料
- [XAMMP環境でPHPからメール送信しても届かない問題の解決策 | PisukeCode - Web開発まとめ](https://pisuke-code.com/xammp-php-how-to-send-email/)
- [fake sendmail for windows](https://www.glob.com.au/sendmail/)
- [Gmailの二重認証を利用するとsendmailが送れなくなる場合の対処法 | OXY NOTES](https://oxynotes.com/?p=5970)
- [PHP: mb_send_mail - Manual](https://www.php.net/manual/ja/function.mb-send-mail.php)
- [PHPによるメールの送信 | PHP プログラミング解説](https://so-zou.jp/web-app/tech/programming/php/network/mail/)