LoginSignup
6
12

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-07-11

初めに

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

今回やること

①②③④に引き続き、グループ機能を作成します。

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

完成イメージ

スクリーンショット 2021-07-10 9.21.40.png

スクリーンショット 2021-07-10 9.23.55.png

スクリーンショット 2021-07-10 11.32.49.png

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

メイラーを作成

Ruby on railsにはAction Mailerの機能が備わってるようです。
なかなかメールが送れず、Gemfileで何か入れるの?と思ってましたが、違いました。

rails generate mailer ContactMailer

ContactMailerは任意の名前。
こんな感じでmailerが作成されてるでしょうか。
スクリーンショット 2021-07-10 9.32.22.png

メールサーバーの設定

ここがとても大事だと思います...!

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

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
途中で、config.action_mailer.raise_delivery_errors = falseという似たような記述がありますが、そこはそのままで、development.rbの最後尾?に上記のコードを入れていただければ、うまくいくかと思います。

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

Gmailの設定を変更してください!

ここで大苦戦しました:joy:

Net::SMTPAuthenticationErrorにならないために

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

スクリーンショット 2021-07-10 9.50.02.png

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

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

メーラー編集 application_mailer.rb

application_mailer.rbには、どのメーラーにも共通することを記述。(今回は、contact_mailerしか作成してないのですが)

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ファイルに値を渡すからです!

コントローラー記述

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

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アクションへ渡しています。

Viewページ

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>
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>

safe_joinって何!?

safe join無しで、 [本文]<p class="font-weight-bold"><%=@mail_content %></p>とすると、
以下のように打っていたものが(記述内容が異なってるのは気にしないでください)....
スクリーンショット 2021-07-10 11.29.09.png

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

スクリーンショット 2021-07-10 11.32.49.png

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

ルーティングの記述

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

メイラー編集 contact_mailer.rb

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コントローラーからよび出され、さらに値を受け取ります。

メールのview記述

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

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

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

  <%= @mail_content %>

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

終わり

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

環境変数化

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

6
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
12