Dockerで動かすGhostに Mailgunを使って mailの設定をする

Ghost では mail の設定が必須です。後回しにしていてとても後悔したので、手順を書いておきます。
Ghost での mail 設定について、公式では Maiilgunの使用が推奨されています。
[Configuration - Adapt your publication to suit your needs](https://ghost.org/docs/config/?_ga=2.169064999.781363015.1611792464-191153013.1611618297#mail)
（以下「公式」という）
Mailgunを使用して、Ghostにmailを設定・運用するには、下記のモノが必要です。

* 取得したドメイン（以下「sample.com」とする）
* クレジットカード
* SMSメッセージ確認用の電話番号


### Ghostの設定
Ghostの設定は最終的にconfig.production.jsonに反映されている必要があります。
自分の場合は、docker のimage `ghost:latest` を利用しているので、docker-compose.yml に設定を書いていきます.
docker-compose.yml は下記です。

```docker-compose.yml
version: '3.1'
services:
  ghost:
    image: ghost:latest
    container_name: sample-ghost
    tty: true
    restart: always
    volumes:
      - ./ghost:/var/lib/ghost/content
      # - ./ghost-setting/config.production.json:/var/lib/ghost/config.production.json
    environment:
      url: https://sample.com
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: password
      database__connection__database: ghost
      server__host: '0.0.0.0'
      server__port: '2368'
      mail__transport: 'SMTP'
      mail__options__service: 'Mailgun'
      # mail__options__host: smtp.mailgun.org
      # mail__options__port: 465
      # mail__options__secureConnection: 'true'
      mail__options__auth__user: 'postmaster@mg.sample.com'
      mail__options__auth__pass: '799XXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXX-XXXXXX'
      forceAdminSSL: 'true'
    networks:
      - sample_net
 
  db:
    image: mysql:5.7
    container_name: sample-ghost-db
    tty: true
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      BIND-ADDRESS: 0.0.0.0
    volumes:
      - ./mysql:/var/lib/mysql
    networks:
      - sample_net

networks:
  sample_net:
    external: true
```

上記 yml の中で、`mail__` と書いている項目部分が config.production.json へ渡すmail の設定です。

＊今回は書きませんが、
config.production.json を volume と紐付けて（volumes の コメントアウトしている、`- ./ghost-setting/config.production.json:/var/lib/ghost/` 部分です）containerの中のファイルにして設定するコトも出来ます。

## Mailgun の登録
下記記事では画像付きでご説明いただいているのでとても参考になります。感謝🙏。下記の通り進めましょう。
[いますぐ使う Mailgun - Qiita](https://qiita.com/sasasin/items/4797c681393b663f2960)
（以下「Mailgun設定記事」という）

一部追記していきます。

### Mailgun設定記事で、 [Sandboxから送信] の部分です。

Mailgun設定記事 では `画面下側? 右側? の Try Now` とあった部分です。
自分は下記の手順でたどり着きました。
左側サイドバーの Sending 欄、 Domains 項目を開き、Domainsのリストの中にある、”sandboxXXXXXXXXXXXXXXXXXXXX…”を選択します。
すると、”sandboxXXXXXXXXXXXXXXXXXXXX…”のOverview が開くので、API の Select ボタンをクリックし、cURL の項目を選択すると、Mailgun設定記事のお試し用 コマンドが表示されます。

そのコマンドを terminal に貼り付けて実行してみて下さい。
自分が実際に使用したコマンドは下記です。（Mailgun サンプルから変えています）
＊API key 、API base URL は個別のものなので書き換えて下さい（cURL ボタンの下に表示されています）
＊あと、`-F to=` の部分も、送信したい mail アドレス（確認できるモノ）に書き換えてください。

```
curl -s --user 'api:6d8XXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXX' \
	https://api.mailgun.net/v3/sandbox0d7XXXXXXXXXXXXXXXXXXXXX.mailgun.org/messages \
	-F from='Mailgun Sandbox  <postmaster@sandbox0d7XXXXXXXXXXXXXXXXXXXXX.mailgun.org>' \
	-F to='sample@sample.com' \
	-F subject='Hello' \
	-F text='Testing some Mailgun awesomeness!'
```

お試し、届きましたかね？
自分の場合は、`/messages`が抜けていたりして、入力するコマンドを何回も確認・修正したら送信・確認できました。
（迷惑メールフォルダに入っていたりするので、そちらも確認してみてください）

### Mailgun設定記事で、[DNSレコード作成] の部分です。

Mailgun設定記事では、Route53を使用されていますが、自分は Google Domains で設定しています。
なので、GoogleDomainsでの設定方法を書いておきます。

カスタムリソースレコードに ４つの 項目を追加します。
名前（@）：タイプ（A）：TTL（1H）：データ（IPv4 アドレス）の順に列挙します

* mg：TXT：未入力（空欄で良いです）：v=spf1 include:mailgun.org ~all
* smtp._domainkey.mg.sample.com：TXT：未入力（空欄で良いです）：k=rsa; p=MIGXXXX（個別の環境で変化します）
* mg：MX：未入力（空欄で良いです）：mxa.mailgun.org （この項目ではデータ入力時にプラスで追加して下さい → [mxb.mailgun.org] を 追加します）
* email.mg：CNAME：未入力（空欄で良いです）：mailgun.org

Mailgun設定記事にも、ある通り DNS が紐づくまで放置しつつ、たまに [Verify DNS Settings] で確認しましょう。

＊自分の場合は、次の部分で間違っていました。
名前（@）の部分に、mg のサブドメイン ＋ sample.com のドメイン まで入力していた。正しくは、mg のサブドメインのみでOK。
下記の記事に助けていただきました。感謝🙏。
[value-domainでmaingunのDNS設定をする](https://qwx.jp/mailgun-value-domain-dns-settings/)

どうでしょう。いけましたかね？
Mailgun設定記事を参照して、今回設定する Mailgun の設定は以上です。
Ghost のmail 設定時、Mailgun の画面で参照するのは、次の画面`SMTP credentials`です。

以下、表示方法です。
左側サイドバーの Sending欄、Domain settings項目の、右画面のタブ SMTP credentials 項目です。
公式のリンク先で [create a Mailgun account] の項目で表示されているものです。

## SMTPの設定をする Mailgun から Ghostへ
SMTP credentials 画面を参照しながら、設定を [docker-compose.yml] へコピーしていきます。
下記の部分です。

```docker-compose.yml
mail__options__auth__user: 'postmaster@mg.sample.com'
mail__options__auth__pass: '799XXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXX-XXXXXX'
```

自分は `mail__options__auth__pass` って何？ となりましたが、ちゃんと公式では説明されています。
SMTP credentials 画面の [Reset Password] をクリックして下さい。
すると、現在のPassword をコピーできます。
コピーした Password を [docker-compose.yml] に ペーストしてください。

以上で、Mailgun と Ghost の紐付けは終了です。
確認方法ですが、自分の場合は Ghost のLabs でbeta のmember 機能で確認しました。（memberを登録する際に使用するmagic link の mail 部分でerror が出ていたので）
どうでしょう。動いていますかね？

公式にもある通り（ [Secure connection]の項目です）、セキュアの設定も出来ます。
[docker-compose.yml] でコメントアウトしていた下記の部分です。

```
# mail__options__host: smtp.mailgun.org
# mail__options__port: 465
# mail__options__secureConnection: 'true'
```
コメントアウトを外しましょう。

公式では、`”port”: 587` とあるのですが、自分の場合 error になったので、 `465 ` に変更したら 動きました。
下記のやりとりに感謝です🙏。
[Signup/login fails in Dawn theme with Portal (Beta) - Members (beta) - Ghost Forum](https://forum.ghost.org/t/signup-login-fails-in-dawn-theme-with-portal-beta/18188)

設定は以上で終了です。お疲れ様でした。


---
## 参考
[Configuration - Adapt your publication to suit your needs](https://ghost.org/docs/config/?_ga=2.169064999.781363015.1611792464-191153013.1611618297#mail)
[いますぐ使う Mailgun - Qiita](https://qiita.com/sasasin/items/4797c681393b663f2960)
[value-domainでmaingunのDNS設定をする](https://qwx.jp/mailgun-value-domain-dns-settings/)
[Signup/login fails in Dawn theme with Portal (Beta) - Members (beta) - Ghost Forum](https://forum.ghost.org/t/signup-login-fails-in-dawn-theme-with-portal-beta/18188)
[Local Ghost 3.0 - subscribing does not work - #26 by mindtrades - Members (beta) - Ghost Forum](https://forum.ghost.org/t/local-ghost-3-0-subscribing-does-not-work/9658/26)