初めに
プログラミング学習開始して1ヶ月と少しです。誤り、理解不足はご指摘いただけますと幸いです。今回やること
①②③④に引き続き、グループ機能を作成します。今回は、グループのオーナー(管理者?)から、グループメンバーにRuby on rails上?からメールを送れるようにします。
今回はこのように、グループ作成者が[Mail」ボタンを押すと、タイトルと本文を入力できる画面に遷移し、
その内容をグループメンバーに送信します。
メール送信後は、送信完了画面も出します。
完成イメージ
こちらの記事を参考にさせていただきました。私の場合、Gmailにアクセス拒否され、なかなか実装できませんでしたので、その点も記載したいと思います。
メイラーを作成
Ruby on railsにはAction Mailerの機能が備わってるようです。 なかなかメールが送れず、Gemfileで何か入れるの?と思ってましたが、違いました。rails generate mailer ContactMailer
ContactMailerは任意の名前。
こんな感じでmailerが作成されてるでしょうか。
メールサーバーの設定
ここがとても大事だと思います...!
Gmailを使ってメールを送信します。
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の途中に似たような記述があったので、そこに入れてたところ何だかうまくいきませんでした。
途中で、config.action_mailer.raise_delivery_errors = falseという似たような記述がありますが、そこはそのままで、development.rbの最後尾?に上記のコードを入れていただければ、うまくいくかと思います。
それぞれがどういう意味の記述なのかは、以下の記事で理解できます!
Gmailの設定を変更してください!
ここで大苦戦しました
!
Net::SMTPAuthenticationErrorにならないために
以下のやり方でやっていただければ上手くいくと思います。
簡単にいうと、
①Googleアカウト→セキュリティのGoogleでのログインで2段階プロセスをONにします。
②その後、アプリパスワードというものを設定できるようになるので、そこでアプリパスワードを設定します。
最初、アプリパスワード設定の画面が見つからず、違うやり方を試みたのですが、できませんでした。
2段階プロセスをONした後に、Googleアカウト→セキュリティのGoogleでのログインを見れば、アプリパスワードの設定ができるかと思います。
最初は、以下で「楽なやり方」として紹介されてる「安全性の低いアプリのアクセス」 → 「許可」 というやり方を試みたのですが、アクセス拒否されました。(不正なログインからアクセスがあったので拒否しましたメールが入ってました)
アプリパスワードのやり方は、以下の記事で「おすすめ」のやり方として紹介されてるので、やはりそっちがいいですね。
ちなみに、メールアドレスとパスワードをgithubにプッシュしないように気をつけてください。
メーラー編集 application_mailer.rb
application_mailer.rbには、どのメーラーにも共通することを記述。(今回は、contact_mailerしか作成してないのですが)class ApplicationMailer < ActionMailer::Base
default from: '管理人だよ<from@gmail.com>'
layout 'mailer'
end
contact_mailer.rbは後から書きます。
groupsコントローラーから値を渡して、さらにcontact_mailer.rbから、textファイルに値を渡すからです!
コントローラー記述
今回Groupの詳細ページのmailボタン→メール作成画面→メール送信完了画面となります..
# 該当部分のみ
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ページ
<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>
<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って何!?
<%=@mail_content %>
```とすると、 以下のように打っていたものが(記述内容が異なってるのは気にしないでください).... 送信完了画面では、こうなります。↓↓改行がなくなってしまうんですね。
safe join
の記述を入れるときちんと改行表示されます。
# 該当部分のみ
<%= 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
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フォーマットもできます。
===============================
<%= @mail_title %>
===============================
皆様
グループオーナーからイベントの通知です。
<%= @mail_content %>
今後とも よろしくお願いいたします。
終わり
メールの送信ができました!!
これ見ながら再度、実装して上手くできたので、多分大丈夫だと思います!!
development.rbにはメールアドレスと、アプリパスワードが載ってる状態ですので、githubにそのままプッシュしないように気をつけてください。
環境変数化
⑥で環境変数化を行います。 現状、メールあドレス、パスワードを直打ちしているというセキュリティ上の問題を解決できます。 そんなに大変な作業ではないです!