【Ruby on Rails5】WorkMailを使って独自ドメインのメールアドレスを設定する。【WorkMail】

## 環境
Ruby 2.5.7
Rails 5.2.4

### gem
gem 'dotenv-rails'

### 前提
[Qiita - シンプルにお問い合わせ機能を実装する](https://qiita.com/s_rkamot/items/d6d0e9abb43383342fd6)
こちらの記事を参考に書き換えていく流れになります。
事前にGmailアカウントでの実装と動作確認をしてもらってから、今回ご紹介するやり方を実践いただければと思います。

独自ドメインは取得済みです。
AWSは登録済みです。

## 経緯
独自ドメインを取得したので、どうせならお問い合わせからの送信されたメッセージは独自ドメインで取得したメールで受信したいと思って今回の実装に至りました。
しかし、ネットを調べると、Gmailを例にした実装方法ばかりでしたので、今回はそれを応用していきたいと思います。

## 手順
1.独自ドメインを取得する
2.取得した独自ドメインを使って、AWS WorkMailでメールアドレスを取得する
3.WorkMailのSMTP設定を反映させていく（受信メールサーバーのIMAP/POPは今回触れません。）

サイト内のコンタクトフォームから送信されたお問い合わせの内容が、独自ドメインで取得したメールアドレス宛に送信されるのが目標です。

### 1.独自ドメインを取得する
[Google Domains](https://domains.google/intl/ja_jp/)を使って取得しました。
ご自身のサイトURLへの反映方法などは本題とは離れますので割愛します。

### 2.取得した独自ドメインを使って、AWS WorkMailでメールアドレスを取得する
AWSのWorkMailというサービスを使うと、独自ドメインの`hogehoge.com`が`example@hogehoge.com`というメールアドレスとして使えるようになります。
WorkMailの設定は下記サイトを参考にしました。
[MISO - Amazon WorkMailを使って独自ドメインのメールサービスを構築してみた](https://www.tdi.co.jp/miso/amazon-workmail-domain)

手順通りに行い、正常に送受信が確認できるようになればOKです。

### 3.WorkMailのSMTP設定を反映させていく(SMTP設定)
今回はRailsアプリケーションからWorkMailへの送信のみなので、受信サーバーであるIMAP、及びPOPの設定は行いません。

まずは[こちら](https://docs.aws.amazon.com/ja_jp/workmail/latest/userguide/using_IMAP.html)のWorkMailの設定情報を確認します。
リンク先のページにはIMAPとSMTPの二つの設定情報が記載されていますが、今回は下段のSMTPSの設定情報を参照していきます。
![SMTP](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/c1e86e77-f131-8c4e-d19e-2599f4d3bcfd.png
 "サイト下段 SMTPの設定")

次にコードです。
前提でご紹介したGmailアカウントの参考サイトを、WorkMail用に書き換えてご紹介していきます。

まずは送信先を変更していきます。

```ruby:app/mailers/contact_mailer.rb

class ContactMailer < ApplicationMailer

  ...

  def contact_mail(contact)
    @contact = contact
    mail to: "独自ドメインで取得したメールアドレス", subject: "メールのタイトル"
  end

  ...

end

```

`mail to:`の箇所をGmailアドレスから独自ドメインで取得したメールアドレスに変更しています。
Gmailでの参考サイトの方では環境変数化していますが、私自身はアドレスを公開しても問題ないと判断しましたのでベタ書きしています。
不安な方は引き続き.envファイルの方で変更してください。

次にメール設定です。

```ruby:config/initializers/mail_config.rb

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address: 'smtp.mail.us-west-2.awsapps.com',
  domain: '独自ドメイン名',
  port: 465,
  user_name: ENV['WORKMAIL_USERNAME'],
  password: ENV['WORKMAIL_PASSWORD'],
  ssl: true
}

```

WorkMailのプロトコルにはSMTPSと書かれてありますが、`delivery_method`は`:smtp`のままでOKです。
addressはご自身がWorkMailを構築したリージョンによって変わってきます。
私は米国西部(オレゴン)のリージョンを選びましたので、上記の通りになります。
なおWorkMailが構築できるリージョンは限られており、その中にアジアパシフィック(東京)は含まれておりません。
<details><summary>対応表</summary>
`米国東部(バージニア北部)` → smtp.mail.us-east-1.awsapps.com
`米国西部(オレゴン)` → smtp.mail.us-west-2.awsapps.com
`欧州(アイルランド)` → smtp.mail.eu-west-1.awsapps.com
</datails>

domainは取得した独自ドメイン名(example.com)をそのまま記載します。
port番号は465を指定します。
user_name, passwordはソースコードとして公開したくない情報ですので、.envファイルを使っていきます。(後述します。)
authenticationは認証する物がなく、特に明示しなくても動作しますので消しておきます。
WorkMailの`安全な接続`項目でSSL必須と書かれてありますので`ssl: true`を付けます。
さらに`(STARTTLSはサポートされていません)`と書かれてありますので、これを自動検出で有効にする必要も無いため、`enable_starttls_auto: true`を削除します。


次に先ほど述べた環境変数の.envファイルをみていきます。

```.env

  ...

  WORKMAIL_USERNAME = 独自ドメインで取得したメールアドレス
  WORKMAIL_PASSWORD = AWSにログインするためのパスワード

  ...

```

これらを環境変数にしておくことで、ログイン情報がサイト上やGitHub上に公開されなくなります。
またこちらはGitHubに上がらないファイルですので、本番環境の.envファイル上にも別途自分で同じように記述する必要があります。
本番環境内の.envに記述し忘れると、このメール設定内の環境変数が認識してくれないので、動作しなくなります。

## まとめ
実際に使っているソースコードは私のGitHub上に公開しています。
そのほかGmailアカウント運用時点からすでに参考サイトとは違う箇所があるかもしれませんので、そちらもご確認いただければと思いますm(_ _)m

質問や解釈の違い、記述方法に違和感ありましたら、コメント等でご指摘いただけると幸いです。

[私のTwitter](https://twitter.com/Masao_Sasaki_ae)でも毎日このようなテクニックや感想・考察を発信していますので、もしご興味があれば一度覗いてみてください(´ｰ｀)

最後まで読んでいただきありがとうございました。

## 参考サイト
より実用的な使い方については、私のGitHubに実際に使っているファイルを公開しているのでそちらも参考にしていただければと思います！
[GitHub - MasaoSasaki/matchi](https://github.com/MasaoSasaki/matchi)

その他
[Qiita - シンプルにお問い合わせ機能を実装する](https://qiita.com/s_rkamot/items/d6d0e9abb43383342fd6)
[MISO - Amazon WorkMailを使って独自ドメインのメールサービスを構築してみた](https://www.tdi.co.jp/miso/amazon-workmail-domain)
[AWS - Setting up IMAP for Amazon WorkMail](https://docs.aws.amazon.com/ja_jp/workmail/latest/userguide/using_IMAP.html)