[Ruby on Rails]グループ作成機能⑤ グループメンバーへメール送信　Action Mailer

<h2>初めに</h2>
プログラミング学習開始して1ヶ月と少しです。誤り、理解不足はご指摘いただけますと幸いです。

<h2>今回やること</h2>
①②③④に引き続き、グループ機能を作成します。



今回は、グループのオーナー（管理者？）から、グループメンバーにRuby on rails上？からメールを送れるようにします。
今回はこのように、グループ作成者が[Mail」ボタンを押すと、タイトルと本文を入力できる画面に遷移し、
その内容をグループメンバーに送信します。
メール送信後は、送信完了画面も出します。

<h2>完成イメージ</h2>

![スクリーンショット 2021-07-10 9.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/7d2791ba-7387-0920-24f8-d90638c592e5.png)

![スクリーンショット 2021-07-10 9.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/60183d66-4b63-1011-eefe-2fdc1655cb2f.png)

![スクリーンショット 2021-07-10 11.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/86d9dd88-0421-3511-6127-d43156209d77.png)


こちらの記事を参考にさせていただきました。私の場合、Gmailにアクセス拒否され、なかなか実装できませんでしたので、その点も記載したいと思います。

https://qiita.com/annaaida/items/81d8a3f1b7ae3b52dc2b

<h2>メイラーを作成</h2>
Ruby on railsにはAction Mailerの機能が備わってるようです。
なかなかメールが送れず、Gemfileで何か入れるの？と思ってましたが、違いました。

```
rails generate mailer ContactMailer
```
ContactMailerは任意の名前。
こんな感じでmailerが作成されてるでしょうか。
![スクリーンショット 2021-07-10 9.32.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/4665a21c-0f2a-d3b2-0661-6781b2375f50.png)

<h2>メールサーバーの設定</h2>

<h6>ここがとても大事だと思います...!</h6>

Gmailを使ってメールを送信します。

```perl:config/enviroments/development.rb
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    port:                 587,
    address:              'smtp.gmail.com',
    domain:               'gmail.com',
    user_name:            'メルアド',#Gmailのアドレス
    password:             'アプリパスワード',#後述！大苦戦しました！
    authentication:       'login',
    enable_starttls_auto: true
  }
end
```
development.rbファイルの最後尾？にこの記述を入れた方が安全？確実？のように思います。
これがエラーの原因かどうかは分からないのですが（多分違うのですが..）development.rbの途中に似たような記述があったので、そこに入れてたところ何だかうまくいきませんでした。
![スクリーンショット 2021-07-10 9.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/54acd55e-db3d-1bcb-034d-2e675f5f43e5.png)
途中で、config.action_mailer.raise_delivery_errors = falseという似たような記述がありますが、そこはそのままで、development.rbの最後尾？に上記のコードを入れていただければ、うまくいくかと思います。

それぞれがどういう意味の記述なのかは、以下の記事で理解できます！

https://qiita.com/annaaida/items/81d8a3f1b7ae3b52dc2b


<h2>Gmailの設定を変更してください！</h2>
<h4>ここで大苦戦しました:joy:！</h4>
<h3>Net::SMTPAuthenticationErrorにならないために</h3>

以下のやり方でやっていただければ上手くいくと思います。
簡単にいうと、
①Googleアカウト→セキュリティのGoogleでのログインで２段階プロセスをONにします。
②その後、アプリパスワードというものを設定できるようになるので、そこでアプリパスワードを設定します。
最初、アプリパスワード設定の画面が見つからず、違うやり方を試みたのですが、できませんでした。
２段階プロセスをONした後に、Googleアカウト→セキュリティのGoogleでのログインを見れば、アプリパスワードの設定ができるかと思います。

![スクリーンショット 2021-07-10 9.50.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/6a3ecfea-d359-7bc0-8909-158cddea60f4.png)

最初は、以下で「楽なやり方」として紹介されてる「安全性の低いアプリのアクセス」 → 「許可」　というやり方を試みたのですが、アクセス拒否されました。（不正なログインからアクセスがあったので拒否しましたメールが入ってました)
アプリパスワードのやり方は、以下の記事で「おすすめ」のやり方として紹介されてるので、やはりそっちがいいですね。

https://karur4n.hatenablog.com/entry/2015/03/07/234600

:bangbang:ちなみに、メールアドレスとパスワードをgithubにプッシュしないように気をつけてください。

<h2>メーラー編集 application_mailer.rb</h2>
application_mailer.rbには、どのメーラーにも共通することを記述。（今回は、contact_mailerしか作成してないのですが）

```perl:app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: '管理人だよ<from@gmail.com>'
  layout 'mailer'
end
```

contact_mailer.rbは後から書きます。
groupsコントローラーから値を渡して、さらにcontact_mailer.rbから、textファイルに値を渡すからです！

<h2>コントローラー記述</h2>

今回Groupの詳細ページのmailボタン→メール作成画面→メール送信完了画面となります..

```　perl:groups_controller.rb
#該当部分のみ

def new_mail
    @group = Group.find(params[:group_id])
  end

  def send_mail
    @group = Group.find(params[:group_id])
    group_users = @group.users
    @mail_title = params[:mail_title]
    @mail_content = params[:mail_content]
    ContactMailer.send_mail(@mail_title, @mail_content,group_users).deliver
  end
```

def send_mailでは```vies/groups/new_mail.html```のform_withで入力された値を受け取っています。
    ```@mail_title = params[:mail_title]
    @mail_content = params[:mail_content]```
そして、その値をContactMailerのsend_mailアクションへ渡しています。

<h2>Viewページ</h2>

```perl:groups/new_mail.html.erb
<div class='container'>
  <div class='row'>
    <div class="col-sm-12 col-md-8 col-lg-5 px-5 px-sm-0 mx-auto">
    <h2><%=@group.name %>メンバーへのメール</h2>
    <%= form_with url: group_send_mail_path(@group),method: :get, local: true do |f| %>
    <div class="form-group">
        <%= f.label :title %>
        <%= f.text_field :mail_title,class:'form-control'%>
        </div>
    <div class="form-group">
        <%=f.label:content %>
        <%= f.text_area :mail_content,class:'form-control' %>
    </div>
    <div>
    <%= f.submit'送信' %>
    </div>
    <% end %>
    </div>
    </div>
    </div>
```

```perl:groups/send_mail.html.erb
<div class="container">
  <h3 class="margin_top text-center">送信が完了しました</h3>
  <div class="main_width">
  <div class="margin_top">内容は以下の通りです。</div>
    <div class="small_margin_top">
      [タイトル]<p class="font-weight-bold"> <%= @mail_title %></p>
    </div>
    <div>
      [本文]<p class="font-weight-bold"> <%= safe_join(@mail_content.split("\n"),tag(:br)) %></p>
    </div>
  </div>
</div>
```
<details><summary>safe_joinって何!?</summary><div>
safe join無しで、 ```[本文]<p class="font-weight-bold"><%=@mail_content %></p>```とすると、
以下のように打っていたものが（記述内容が異なってるのは気にしないでください)....
![スクリーンショット 2021-07-10 11.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/985e3230-2a62-56c0-fde0-4c11b77615cc.png)

送信完了画面では、こうなります。↓↓改行がなくなってしまうんですね。
```safe join```の記述を入れるときちんと改行表示されます。

![スクリーンショット 2021-07-10 11.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/d208069e-0f03-5e89-4dbf-743c0d122855.png)


</div></details>


```perl:groups/show.html.erb
#該当部分のみ
<%= link_to 'Mail',group_new_mail_path(@group), class: "fas fa-paper-plane" %>
```

<h2>ルーティングの記述</h2>

```
#該当部分のみ
  resources :groups do
    get "join" =>"groups#join"
    get "new/mail" => "groups#new_mail"
    get "send/mail" => "groups#send_mail"
  end
```

<h2>メイラー編集　contact_mailer.rb</h2>

```perl:app/mailers/contact_mailer.rb
class ContactMailer < ApplicationMailer
    
    def send_mail(mail_title,mail_content,group_users) #メソッドに対して引数を設定
    @mail_title = mail_title
    @mail_content = mail_content
    mail bcc: group_users.pluck(:email), subject: mail_title
    end
end
```
Groupsコントローラーからよび出され、さらに値を受け取ります。

<h2>メールのview記述</h2>

今回はテキスト形式のメールですが、
htmlフォーマットもできます。

```perl:views/contact_mailer/send_mail.text.erb
 ===============================
  <%= @mail_title %> 
  ===============================
  皆様

  グループオーナーからイベントの通知です。

  <%= @mail_content %>

  今後とも よろしくお願いいたします。

```

<h2>終わり</h2>

メールの送信ができました！！
これ見ながら再度、実装して上手くできたので、多分大丈夫だと思います！！
development.rbにはメールアドレスと、アプリパスワードが載ってる状態ですので、githubにそのままプッシュしないように気をつけてください。

<h2>環境変数化</h2>
⑥で環境変数化を行います。
現状、メールあドレス、パスワードを直打ちしているというセキュリティ上の問題を解決できます。
そんなに大変な作業ではないです！

https://qiita.com/ki_87/items/82b28f89a8552506a169