rails でお問合せフォームを作り、自分のメールアドレスに送信させる方法

#railsで簡単にお問合せフォームを作り自分のメールアドレスに送信させる

##railsに標準搭載のaction mailerを使用して簡単にお問合せフォームを実装させる。


###まずはじめに、お問合せ内容を保存するためのInquiryモデルを作ります。

Inquiryモデルは、nameカラムと、messageカラムを持ちます。



```console
$ rails g model inquiry name:string message:string
$ rails db:migrate
```



###次に、action mailer を作成していきます


```console
$ rails g mailer inquiry
```
このinquiryの名前に特に意味はないので、好きな名前でやってもらって大丈夫です。

実行されると、このようにいくつかのファイルが作成されます

```
Running via Spring preloader in process 32746
      create  app/mailers/inquiry_mailer.rb
      invoke  erb
      create    app/views/inquiry_mailer
      invoke  test_unit
      create    test/mailers/inquiry_mailer_test.rb
      create    test/mailers/previews/inquiry_mailer_preview.rb
```


###次に、メールの送信機能を実装するため、app/mailers/inquiry_mailer.rbに追記をしていきます。

```inquiry_mailer.rb
class InquiryMailer < ApplicationMailer
# -----追記------
  def send_mail(inquiry)
    @inquiry = inquiry
    mail(
      from: 'system@example.com',
      to:   'manager@example.com',
      subject: 'お問い合わせ通知'
    )
  end
# -----追記ここまで----
end
```
こちらで使用できるメソッドはこちらになります。

| オプション      |       できること |
|:-----------------|------------------:|
| from            |              送信元メールアドレス |
| subject           |           メールの件名|
| to             |             メールの送信先アドレス|
| cc               |                ccのメールアドレス|
| bcc             |             bccのメールアドレス |


###メール本文のレイアウトを作成する

メール本文のレイアウトを作成するためには、命名規則に従ってファイルを作成します。

.app/views/メイラー名_mailer/メイラークラスのメソッド名.text.erb

今回の場合は
app/views/inquiry_mailer/send_mail.text.erb
を作成しましょう。

そして中に

```erb:send_mail.text.erb
<%= @inquiry.name %> 様 から問い合わせがありました。
・お問い合わせ内容
<%= @inquiry.message %>
```
を追記しましょう。

###メールをプレビューで確認する機能

次に、実際にお問合せフォームを送る前に自分のお問合せ内容を確認するプレビュー機能を作成していきます。
action mailerに元から搭載されている機能なので簡単にできます。

まず

```test/mailers/previews/inquiry_mailer_preview.rb

# Preview all emails at http://localhost:3000/rails/mailers/inquiry_mailer
class InquiryMailerPreview < ActionMailer::Preview
# ----追記-----
  def inquiry
     inquiry = Inquiry.new(name: "侍 太郎", message: "問い合わせメッセージ")
    
     InquiryMailer.send_mail(inquiry)
   end
#----追記ここまで----
end

```

そしてここでターミナルで

```console
$rails s
```

をし、サーバーを起動させます。
そして
http://ホスト名:3000/rails/mailers/inquiry_mailer
にアクセスしてみてください。

大体の方は
http://localhost:3000/rails/mailers/inquiry_mailer
ですね。
すると


------------------
Inquiry Mailer
     ・inquiry


と表示されますので
inquiryをクリックしましょう。

すると
[![Screenshot from Gyazo](https://gyazo.com/53f17749d226441dfc0fd46b368f54d7/raw)](https://gyazo.com/53f17749d226441dfc0fd46b368f54d7)



と言う画面が出てきます。
今回はformatをHTMLに変えているので皆様の画面より少し文字が大きめに書かれていますが問題ないです。

###Gmailでメールを実際に送信してみましょう

まずメールサーバーを設定します。

```config/environments/development.rb


config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
 address:              'smtp.gmail.com',
 port:                  587,
 domain:               'gmail.com',
 user_name:            '<gmailのメールアドレス>',
 password:             '<gmailのパスワード>',
 authentication:       'plain',
 enable_starttls_auto:  true
}
```

をファイル内のどこでもいいので追記してください。(※一番上のclass名~一番下のendの間でお願いします)

メールを送信するために、自分のメールアドレスとパスワードを書き加えます。

```config/environments/development.rb


config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
 address:              'smtp.gmail.com',
 port:                  587,
 domain:               'gmail.com',
#-----変更点---------------------------
 user_name:            'aaaaa@gmail.com',
 password:             'aaaaaaaaaa',
#----変更点ここまで-----------------------
 authentication:       'plain',
 enable_starttls_auto:  true
}
```


そしてこちらのファイルにも自分のメールアドレスを書き加えます

```inquiry_mailer.rb
class InquiryMailer < ApplicationMailer
  def send_mail(inquiry)
    @inquiry = inquiry
    mail(
      from: 'system@example.com',
#----------変更点--------------
      to:   'aaaaa@gmail.com',
#----------変更点ここまで---------
      subject: 'お問い合わせ通知'
    )
  end
end
```

ここまできたら、あとは確認のため、rails コンソールからメール送信を実行します。

```console
$ ご自身のファイルディレクトリにいく
$ rails c
irb(main):001:0> inquiry = Inquiry.new(name: "侍 太郎", message: "問い合わせメッセージ")
irb(main):002:0> InquiryMailer.send_mail(inquiry).deliver_now
```

すると、自分のメールアドレスにメールが送信されたかと思います。

ですが、セキュリティの関係上警告メールが出る場合が多くあります。

これは憶測ですが、コードにそのままアドレスやパスワードを貼っているのが原因なので、この部分を環境変数に変えて、隠す方法を試してみてください。

そちらに関連する記事はこちらです
https://qiita.com/yuichir43705457/items/7cfcae6546876086b849




以上で終了です。

皆様できましたでしょうか？






参考にした記事
https://www.sejuku.net/blog/48739