konchanxxx / menta

MENTAのタスク管理用リポジトリ
0 stars 0 forks source link

ユーザーの新規登録の際にThanksメールを送りたい #65

Closed sumura80 closed 5 years ago

sumura80 commented 5 years ago

概要

@rexitorg さん、こんにちは。 ユーザーの新規登録の際にThanksメールを送りたいのですが、教えていただけませんでしょうか?ユーザー登録には、Deviseを使用しております。 今回、メールを送るのは「ユーザー新規登録時」と「ユーザーのパスワードやメールアドレスを変更した時」を2点です。   ユーザーのパスワードやメールアドレスを変更した時の例↓ スクリーンショット 2019-04-06 19 21 29

実は、この機能は2月にdevelopment環境下で実装できておりました。 letter-opener-webというgemも利用し、画面上で確認していましたが、本日production環境に実装する前に試しにまたdevelopment環境でテストをしてみたところ、メールが送れなくなっていました。

下記のサイトなどを参考にしました。(他のサイトも使っています。) http://c5meru.hatenablog.jp/entry/2018/07/29/200011

解決するために行ったこと

以前実装した手順は下記の通りです。

  1. メールの送信設定 config/environment/development.rb
  2. メーラー作成 app/mailer以下に次の2つのメーラーが作成
  3. application_mailer.rb編集
  4. user_mailer.rb 編集(gmail 2段階認証もしております。こちらは、gem ‘figaro’というのを利用し、config/application.ymlにメールアドレスとパスワードを記述しております)
  5. メール本文のテンプレート作成 app/view/user_mailer/ html & text
  6. users_controller.rb Create作成 app/users/registration_controller.rb こちらは、新しくUserコントローラを作成しDeviseを継承しました。
  7. letter_openerのインストールと表示(こちらも以前は表示されておりました。)

エラーはなく、ユーザー登録はされます。

おかしい所があれば、ご指摘いただけませんでしょうか? よろしくお願いいたします。


  1. メールの送信設定

    #このサイトを参考  http://c5meru.hatenablog.jp/entry/2018/07/29/200011
    config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
    #ActionMailer::Base.delivery_method = :smtp
    #ActionMailer::Base.delivery_method = :letter_opener
    config.action_mailer.delivery_method = :letter_opener_web
    
    ActionMailer::Base.smtp_settings = {
    address: 'smtp.gmail.com',
    domain: 'gmail.com',
    port: 587,
    user_name: ENV['ACTION_MAILER_EMAIL_ADDRESS'],
    password: ENV['ACTION_MAILER_EMAIL_PASSWORD'],
    
    authentication: 'plain',
    enable_starttls_auto: true
    }
  2. メーラー作成

  3. application_mailer.rb編集

  4. user_mailer.rb 編集

application_mailer.rb

class ApplicationMailer < ActionMailer::Base
  # default from: 'from@example.com'
  default from: 'codetest1980@gmail.com'
  layout 'mailer'
end

user_mailer.rb

  def signup_confirmation(user)
    @user = user

    mail(
    from: 'codetest1980@gmail.com',
    to:   @user.email,
    subject: 'Sign Up Confirmation (Med+)'
  )
  end

  #=============================================
  #Message to send when current user changed email address
    def edit_privacy_confirmation(user)
    @user = user

    mail(
    from: 'codetest1980@gmail.com',
    to:   @user.email,
    subject: 'Privacy setting was changed (Med+)'
  )
  end
  1. users_controller.rb Create作成

    class Users::RegistrationsController < Devise::RegistrationsController
    # before_action :configure_sign_up_params, only: [:create]
    # before_action :configure_account_update_params, only: [:update]
    def create
    super
    UserMailer.signup_confirmation(@user).deliver
    end
    
    def update
    super
    UserMailer.edit_privacy_confirmation(@user).deliver
    end
  2. letter_openerのインストールと表示 Gemfile

    group :development do
    #送ったメールをブラウザで確認するためのgem
    #gem "letter_opener"
    gem 'letter_opener_web'
    end

config/routes.rb

mount LetterOpenerWeb::Engine, at: '/letter_opener' if Rails.env.development?

問題となっているアプリケーションのGitHub URL

git@github.com:sumura80/medplus-email.git

konchanxxx commented 5 years ago

@sumura80 binding.pryを使ってdebugするとどうなりますか?

https://qiita.com/silmisilon/items/8e08435204d8d08d09ff

sumura80 commented 5 years ago

@rexitorg app/controllers/users/registrations_controller.rb userコントローラで下記のようにサインアップ時にメールを送る設定をしてあります。

  def create
    super
    binding.pry
    UserMailer.signup_confirmation(user).deliver_now
  end

  def update
    super
    UserMailer.edit_privacy_confirmation(user).deliver_now
  end

   この状態で、binding.pryをするとuser登録は通常通りにできるのですが、メールが送信されない状態です。

Started POST "/users" for 127.0.0.1 at 2019-04-08 15:25:46 +0900
Processing by Users::RegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"uzI+edHjYa+ndNtByhns3M8Ucyr70RKBiueMBxIRbIHX9Y52pEjvlgxgnhiK2/ns/758NsK9IC7ngkLAbcXgEg==", "user"=>{"username"=>"Tomcat", "email"=>"pinetree321@hotmail.co.jp", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "button"=>""}
   (0.2ms)  begin transaction
  User Exists (0.3ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = ? AND "users"."deleted_at" IS NULL LIMIT ?  [["email", "pinetree321@hotmail.co.jp"], ["LIMIT", 1]]
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE "users"."username" = ? AND "users"."deleted_at" IS NULL LIMIT ?  [["username", "Tomcat"], ["LIMIT", 1]]
  CACHE User Exists (0.0ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = ? AND "users"."deleted_at" IS NULL LIMIT ?  [["email", "pinetree321@hotmail.co.jp"], ["LIMIT", 1]]
  SQL (0.6ms)  INSERT INTO "users" ("email", "encrypted_password", "created_at", "updated_at", "username") VALUES (?, ?, ?, ?, ?)  [["email", "pinetree321@hotmail.co.jp"], ["encrypted_password", "$2a$11$yzF0X4uAlvsnOD8t2RgJye3G1ZT3mDUjcICGRYzxdZqWc9TjqHdqy"], ["created_at", "2019-04-08 06:25:47.163374"], ["updated_at", "2019-04-08 06:25:47.163374"], ["username", "Tomcat"]]
   (1.0ms)  commit transaction
Redirected to http://localhost:3000/

From: /app/controllers/users/registrations_controller.rb @ line 9 Users::RegistrationsController#create:

     6: def create
     7:   super
     8:   binding.pry
 =>  9:   UserMailer.signup_confirmation(user).deliver_now
    10: end

[1] pry(#<Users::RegistrationsController>)> user
NameError: undefined local variable or method `user' for #<Users::RegistrationsController:0x00007fcab955dbc0>
Did you mean?  @user
from (pry):1:in `create'
[2] pry(#<Users::RegistrationsController>)> @user
=> #<User id: 12, email: "pinetree321@hotmail.co.jp", created_at: "2019-04-08 06:25:47", updated_at: "2019-04-08 06:25:47", username: "Tomcat", user_image: nil, admin: false, deleted_at: nil>
[3] pry(#<Users::RegistrationsController>)> 
sumura80 commented 5 years ago

@rexitorg 12時間格闘の末、開発環境でメール送信ができるようになりました。

現在、development環境からproduction.rbにActionMailerの設定を記述するところです。 下記がdevelopment環境です。

  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
  ActionMailer::Base.delivery_method = :smtp

  ActionMailer::Base.smtp_settings = {
  address: 'smtp.gmail.com',
  domain: 'gmail.com',
  port: 587,
  user_name: ENV['ACTION_MAILER_EMAIL_ADDRESS'],
  password: ENV['ACTION_MAILER_EMAIL_PASSWORD'],

  authentication: 'plain',
  enable_starttls_auto: true
}

production環境では、

config.action_mailer.default_url_options を自分のサイトのURLでよろしいのでしょうか? Railsガイドでは、下記のようになっておりました。 config.action_mailer.default_url_options = { host: 'example.com' }  

development環境では、下記のようにportも記述していたので、質問させていただきました。:man-bowing:

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

konchanxxx commented 5 years ago

あれ?

[1] pry(#<Users::RegistrationsController>)> user
NameError: undefined local variable or method `user' for #<Users::RegistrationsController:0x00007fcab955dbc0>

は問題ない感じです?変数が定義されていないと怒られていますが..

konchanxxx commented 5 years ago

mailerのhelperメソッドでpathをメールに記載するときとかに必要なoptionですよね https://qiita.com/minoriinoue/items/393d61b854a34358d102 自分のサイトのドメインで良いと思います:bow: ポートは本番で80番ポートでHTTPリクエストを受け付けるなら指定しなくて良いと思います:bow:

sumura80 commented 5 years ago

@rexitorg ご回答ありがとうございます。 基礎的な質問で大変恐縮なのですが、本番の環境というのは、Herokuとかのことでよろしいんですよね?(自分はHerokuを使用しております。) default_url_optionsproduction.rb に設定して、実際のサイトでメールを送るということを想定しております。 下記のように設定して見ました。development と違うのは、host:medplus.jp の部分だけです。これでpushすればいいのですか? 間違えて本番で問題が起こるのが怖いので再確認させていただきました。:sweat:


  #Actionmailerでメールを送る設定。development.rbと同じ
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default_url_options = { host: 'medplus.jp'}
  ActionMailer::Base.delivery_method = :smtp
  ActionMailer::Base.smtp_settings = {
  address: 'smtp.gmail.com',
  domain: 'gmail.com',
  port: 587,
  user_name: ENV['ACTION_MAILER_EMAIL_ADDRESS'],
  password: ENV['ACTION_MAILER_EMAIL_PASSWORD'],

  authentication: 'plain',
  enable_starttls_auto: true
}

```
sumura80 commented 5 years ago

@rexitorg こちら、本番環境でも無事、メールが送られるようになりました!

sumura80 commented 5 years ago

@rexitorg こちら解決しましたので、クローズさせていただきます。 ありがとうございました。:bow: