Xampp(Apache+PHP)にてLocalネットワークからGmailが送信できるまで

#背景
　完全に備忘録です。私のバイト先で、「ローカルのみで動いているサイトからGmailを送信したい」とお願いされたので、いろいろ調べたことをメモしておきます。

注意）
　私はサーバーとかセキュリティ初心者です。もしかしたらとても危険な操作をしているかもしれません。もしこの記事を参考にされる方いらっしゃいましたら、自己責任でお願いいたします。

#環境
　動作環境は以下の通りです。この記事ではxamppのインストールから書いていこうと思います。また、Gmailアカウントについては携帯電話番号登録がされている場合（二重認証）の場合と、携帯番号無しでGmailアカウントを作った2通りの説明を残します。
（Gmailアカウントは持っている前提で話を進めます）

* Windows10
* Xampp(Apache + PHP + ~~Mercury Mail Server~~ + Fake Sendmail)
* Gmail

※Windows8の方は、すべての手順が終了してから、以下のサイトを参考にされると良いかと思います。
・[Windows8上でPHPのメールが送信できない（Connection Closed Gracefully）](https://qiita.com/mimuro_syunya/items/e53210bf28b2b15e0f63)
※Mercury Mail Serverについてはインストールする必要は無いですが、あっても問題ないです。以下のサイトを参考にしてください。
・[Fake Sendmailってなに？？](https://qiita.com/mimuro_syunya/items/df87a14c52c334c460a8)
#xamppインストール編
　まず、以下のURLからxamppインストーラをダウンロードしてください。

* https://www.apachefriends.org/jp/index.html

そして、インストーラをダウンロード出来たら、以下の画像に従って設定してください。
やってることとしては、ApacheとPHPとMercury Mail Server、PHP、Fake Sendmailをインストールする感じです。

![q1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/1a247f42-814e-cca9-7888-6419dffe0bd1.png)
![q2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/ead9e7e7-8a8e-51cd-d3d7-4363d0316bb2.png)
![q3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/ffac806f-b13e-21f8-bc85-39eedb423fe1.png)
![q4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/53672213-e526-31ec-7620-a3aba23d01af.png)
![q5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/bafda810-15d2-ab8b-69e4-ddf4791b6df1.png)
![q6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/ad6e85a3-8de8-5ce5-d922-5474e8b1fa58.png)
![q7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/7b8969f2-8431-95e0-e64a-d509c9799169.png)
![q8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/684fe2e6-4fba-4721-4573-64578b526b93.png)
![q9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/9f85082c-c158-8dd2-97d6-8ab36fb70f01.png)

そして、インストールが終わったらこんな画面（↓）が出てきます。これは閉じちゃってください。

![q10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/015882df-ca4f-d4f6-0677-cb03d9622196.png)

#php.iniの変更
まず、エクスプローラから「C:\xampp\」直下の「xampp-control.exe」を管理者として実行してください。そして、ApacheとMercuryの「Start」ボタンを押して正常に動作する事を確認してください。もし動かないようであれば、ポート80が競合してしまっている可能性があるので以下の記事を参考にしてみてください。

* [Xamppでポート競合を防ぐ方法](https://qiita.com/neneta0921/items/3c2f9ac8ea9b5bcfc6e6)

![q11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/f09b424a-4c5d-6ef5-eef8-64904dbaebe8.png)

そして、Xamppコントローラの右側にある「Explorer」をクリックして、phpフォルダ内の「php.ini」をメモ帳から開きます。

![q12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/bb67be8c-c61f-70b3-bab0-3c2c9c67d7b5.png)
![q13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/060b39fb-3894-3640-d315-56492c537d88.png)

開いたら、[mail function]のあたりまで移動します（F5とかで検索するとすぐ見つけられます）。そして、赤線の部分を以下の様に書き換えて、上書き保存してください。

```
・・・
[mail function]
・・・
sendmail_path="\"C:\xampp\sendmail\sendmail.exe\" -t"
・・・
```
![q26.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/3334e517-0e7c-ce2b-50e2-7c67a1b59757.png)


#Gmailアカウントの設定
　原理的なお話をしますが、だいぶ憶測が含まれています。雰囲気としてみてください。正しい保証はできません。原理的な話は飛ばして結構です。自分用に書きます。
##原理的なお話
　ここで、いったん原理的な説明をしましょう。ローカルPCのサーバーからGmailのメールを使うには、「Gmailのアカウント」と「外部からのアプリケーションの受け入れの設定」が必要です。
　Gmailのアカウントが必要な理由は、ローカルサーバーから誰かにメールを送信するとき、自身（送信元）のメールアカウントが必要なわけですが、ローカルPCだけではそれを持っていないので、事前にサーバーに紐づけられるGmailのアカウントを別に作っておく必要があるのです。
（図はあくまでイメージ図なので、厳密に正しくありません）

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/226fe083-624f-d535-f629-7a9c053c6a4a.png)

　また、Googleメールでは、デフォルトで、見知らぬサーバーからの操作を受け付けない設定になっています。（これは、Gmailのメールアカウントとパスワードを知られていたとしても受け付けません）これを回避する為に、いくつかアカウント側で設定が必要です。

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/f7d5b092-7b8b-97e1-66ba-6cc2ec3b8939.png)


　また、この設定は、Gmailの登録の段階でスマホなどの携帯電話番号を登録して二重認証（ログイン時とかにSMSなどに番号が送られてくる認証システム）している場合と、電話番号なしで作成した場合でアカウントの設定が異なってきます。

##携帯電話番号を登録している場合（二重認証しているアカウント）
　おそらく、こちらの場合の方が多いと思います。まず、以下のURLからGoogleアカウントの設定をします。
（今回使用するメールアドレスのGoogleアカウントでログインしてください）

* https://myaccount.google.com/?utm_source=OGB&tab=rk&utm_medium=act

そして、「セキュリティ」タブの「アプリパスワード」をクリックします。（その後パスワードを求められますので入力してください）

![q15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/1774d262-2992-5b40-6bfb-fceb392e021f.png)

アプリは「メール」を選択して、

![q16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/e6ae3fb3-2e63-c6ed-8041-bf2e76d94acc.png)

デバイスは「その他」から「sendmail」を入力して、生成ボタンを押します。すると、「お使いのデバイスのアプリパスワード」が表示されるので、これをメモしておきます。「sendmail.iniの変更」で使うので覚えておいてください。

![q17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/d7184258-f8cc-21a7-1d51-2cebc8e092e8.png)
![q18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/5b627fe1-d13b-b7bd-4ea8-194b1d89388d.png)

##携帯電話番号を登録していない場合
　私はこの場合に当てはまるのですが、あまり多くないケースかもしれません。まず、以下のURLからGoogleアカウントの設定をします。
（今回使用するメールアドレスのGoogleアカウントでログインしてください）

* https://myaccount.google.com/?utm_source=OGB&tab=rk&utm_medium=act

そして、「セキュリティ」タブの「安全性の低いアプリのアクセス」の「アクセスを有効にする」をクリックしてください。

![q20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/db2a130d-93a9-0cfe-774c-2a7dfa60c93b.png)

ボタンを右にスライドさせて有効にさせたら設定終了です。

![q21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/149103b4-5e8b-73f2-d405-04f74b87e885.png)

#sendmail.iniの変更
　Xamppコントロールパネルの「explorer」から、「sendmail」フォルダ内にある「sendmail.ini」をメモ帳から開きます。
![q22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/c9eb2196-7c80-ca2b-4c6b-f0b609672417.png)

そして、以下の二か所を変更して、上書き保存してください。

```
・・・
[sendmail]
・・・
smtp_server=smtp.gmail.com
・・・
smtp_port=587
・・・
```

![q23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/4d7fbd29-2218-4bd1-b24c-ef41e4c28ab2.png)

最後に、以下の「auth_username」と「auth_password」を設定するのですが、ここでも携帯電話番号を登録しているアカウントとしていないアカウントで変わってきます。携帯電話番号を登録しているアカウントは、

auth_username=username@gmail.com
auth_password=app_pass

としてください。username@gmail.comは使用するGメールアカウントで、app_passはGoogleアカウントの設定で取得した「お使いのデバイスのアプリパスワード」の事です。（""とかはいらないです。そのまま書き込んでください。

　また、携帯電話番号を登録していないアカウントは、

auth_username=username@gmail.com
auth_password=password

としてください。username@gmail.comは使用するGメールアカウントで、passwordはログイン時に使う、アカウントのパスワードです。

![q24.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/0b519730-fcc2-5eab-d41c-b47393e5a865.png)

以上で、設定の方は終わりです。

#テスト
　それでは、メール送信ができるかどうかテストします。最初に、XamppコントロールパネルからApacheを再起動します。「Stop」ボタンを押して「Start」ボタンを押せば再起動できます。
![q25.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/a7e6d154-b2d4-d034-baa2-8e19c58bfb0c.png)

　そして、「C:\xampp\htdocs」直下に以下のソースコードを「mail.php」の名前で保存してください。username@gmail.comは設定の際に使用したGmailアカウントです。
　最後に、「localhost\mail.php」とChromeとかで検索してみてください。

* [localhost\mail.php](http:\\localhost\mail.php)

```
<?php

$to      = 'username@gmail.com';
$subject = 'sample';
$message = 'success!!';
$headers = 'From: username@gmail.com' . "\r\n";

if(mail($to, $subject, $message, $headers)){
    echo "メール送信は成功しました!!!";
}else{
    echo "残念ながらメールは送信できませんでした。。。";
}
?>
```

以下の様に表示されれば送信が成功していますので、Gmailアカウントまで行って、メールが送信されているのを確認してください。

![q27.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/a0e5cc68-3612-f451-4fb3-683c4f72a45a.png)

#最後に
　今回は、Localで動いているウェブサイトからGmailを送信するための手順をまとめてみました。どうやらWindowsではSMTPメールサーバが元から入っていないため、Apache単品＋PHP単品ではメール送信ができないみたいです。色々調べましたが、結局Xamppに任せた方が簡単だと思います。
　最後に、しつこいですが、この記事を参考にされる場合は自己責任でお願いしますm(_ _)m
また、何かアドバイス・修正などがあれば、コメントか編集リクエストを頂けたら大変ありがたいです！

それでは！