質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Ruby on Rails

    9026questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Railsのメール送信設定についてわからないので教えてください。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,203

koume

score 134

Rails5.1.3でWebアプリケーション制作の勉強をしています。
メールの送信機能を試していますが、うまくいかないので質問させていただきます。
まだドメインを取得していない状態です。

新規に会員登録した場合のお礼メールを送信したいのです。

development.rbに以下のようにSMTPサーバー経由で送信する設定をしました。

development.rb

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.smtp_settings = {
    address: 'smtp.gmail.com',
    port: 587,
    user_name: 'sato.ichiro@gmail.com',
    password: '16桁のgoogleアプリパスワードを記述',
    domain: 'gmail.com'
    }


user_nameに制作中のサイトのメールアドレスを記述しました。(現在使用中のアドレスです。)
passwordに16桁のgoogleアプリパスワードを記述しました。
domeinはまだ取得していないので'exmple.com'と記述しています。

Action Mailerのプレビュー機能での表示確認はできています。
ためしに新規登録者にお礼のメールを送信するようにしましたが以下のエラーが出てしまいます。

Net::SMTPFatalError in Visitor::CustomersController#create
555 5.5.2 Syntax error. k3sm25357608pff.41 - gsmtp
Extracted source (around line #32):

30      redirect_to :visitor_root
31      user = @customer_form.customer
32      ThanksMailer.thank_you(user).deliver_now---------Action Mailerのプレビュー機能での表示確認はできています。
33    else
34      flash.now.alert = '入力に誤りがあります。'
35      render action: 'new'


他の設定は以下のようにしています。

application_mailer.rb

class ApplicationMailer < ActionMailer::Base
  default from: '運営局<sato.ichiro@gmail.com>'
  layout 'mailer'
end
thanks_mailer.rb

class ThanksMailer < ApplicationMailer
  default from: '運営局<sato.ichiro@gmail.com>'

  def thank_you(user)
    @user = user
    mail to: user.email,
      subject: "会員登録ありがとうございました。"
  end
end


ドメインを取得していないのが原因なのでしょうか?記述や設定がおかいしのでしょうか?
どなたか教えていただけないでしょうか?宜しくお願いします。

追記
回答いただいた件でコンソールで試してみました。

 config.action_mailer.delivery_method = :smtp
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.smtp_settings = {
    address: 'smtp.gmail.com',
    port: 587,
    user_name: 'sato.ichiro@gmail.com',
    password: '****************',
    domain: 'smtp.gmail.com'
    #authentication: 'plain',-----------$ rails sでエラーになるのでコメントアウト
    #enable_starttls_auto: true---------$ rails sでエラーになるのでコメントアウト
    }


SyntaxErrorが出るのですが間違いがわかりませんでした。

エラーの内容
syntax error, unexpected tIDENTIFIER, expecting '}' (SyntaxError)
    authentication: 'plain',

syntax error, unexpected tIDENTIFIER, expecting '}' (SyntaxError)
    enable_starttls_auto: true


コンソールで以下を実行

user = Customer.find(5)
ThanksMailer.thank_you(user).deliver_now

コンソールで実行すると送信可能でした。

追記2

送信可能
default from:には日本語のみ記述

class ApplicationMailer < ActionMailer::Base
  default from: '運営局'
  layout 'mailer'
end
送信可能
default from:に送信元のメールアドレスのみ記述

class ApplicationMailer < ActionMailer::Base
  default from: 'sato.ichiro@gmail.com'
  layout 'mailer'
end
送信不可 エラー発生
Net::SMTPFatalError: 555 5.5.2 Syntax error. r13sm29313822pgq.25 - gsmtp
default from:にアルファベットを使用するとエラーが発生。

class ApplicationMailer < ActionMailer::Base
  default from: 'abc事務局'-----------アルファベットを使用するとNG
  layout 'mailer'
end


変な感じですがことごとくアルファベットを受け付けませんでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • scivola

    2018/02/13 22:31

    `user.email` の値は妥当ですか

    キャンセル

  • koume

    2018/02/13 22:42 編集

    早速の回答ありがとうございます。コントローラーのuser = @customer_form.customerでformに入力された値を取り出しているつもりです。登録されたemailの値をみても間違いはなさそうです。もしかしてこの変数userは
    thanks_mailer.rbのdef thank_you(user)のuserとは別物なのでしょうか?

    キャンセル

  • scivola

    2018/02/14 00:44

    ThanksMailer の thank_you メソッドの中に byebug を仕込み,user.email の値を確認してみてください。

    キャンセル

  • koume

    2018/02/14 01:48

    byebugで確認してみました。user.emailの値はちゃんと取得できているようでした。development.rbの設定がおかしいのでしょうか?

    キャンセル

回答 1

checkベストアンサー

+1

お手上げですが,解決につながるかもしれないヒントを。

①from をメールアドレスだけにしてみる。つまり 運営局<sato.ichiro@gmail.com> ではなく sato.ichiro@gmail.com にしてみる。

②smtp_settings の domain を exmple.com でなく gmail.com にしてみる。

③smtp_settings に

  authentication: 'plain',
  enable_starttls_auto: true,

を追加してみる。

④Rails とは無関係に,ActionMailer を使ったメール送信だけの Ruby スクリプトを書いてみる。

⑤Rails とは無関係に,net/smtp ライブラリーでメールを送信してみる。

⑥Gmail 以外の SMTP サーバーを使ってみる。

追記

⑤ですが,手持ちの Gmail アカウントで試してみました。
こんな感じのコードでメール送信ができました。

require "action_mailer"

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = {
  address: "smtp.gmail.com",
  port: 587,
  user_name: "XXXX@gmail.com",
  password: "YYYY",
  domain: "gmail.com",
  authentication: "plain",
  enable_starttls_auto: true,
}

class TestMailer < ActionMailer::Base
  def hoge
    mail to: "somebody@example.com",
      from: "XXXX@gmail.com",
      subject: "Test mail",
      body: "Hello, World!"
  end
end

TestMailer.hoge.deliver_now

XXXX のところは実際の Gmail アドレスを使います。YYYY は二段階認証のアプリパスワードとかいうやつ。メールの宛先も実在するものにしてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/14 09:50

    いつもご丁寧な回答ありがとうございます。教えていただいたことを順にやってみます。今後ともよろしくお願いします。

    キャンセル

  • 2018/02/14 12:37

    ⑤の具体的なコードを追記したのでお試しください。

    キャンセル

  • 2018/02/14 15:22

    本当にいtもありがとうございます。質問に追記しましたが、コンソールでuserに直接レコードを検索して
    動かしたらメール送信できました。再度、実際に新規登録してメールが送信されるか試してみます。
    これで送信されなかったら、user = @customer_form.customerで新規にformに入力され保存に成功したレコードを取り出せていないということになりますね。
    ただ、2つのsyntax errorの原因が不気味なので教えていただければと思います。

    キャンセル

  • 2018/02/14 15:44

    おかげさまで、新規に登録した場合にお礼メールを送信することができました。
    本当の原因なのかわかりませんが、記述の内容でハッキリとエラーが出てしまいました。
    送信できなかった原因がわかりましたので質問内容に追記いたします。
    今後ともよろしくお願いいたします。

    キャンセル

  • 2018/02/14 17:52

    Syntax Error が出るのは

    domain: 'smtp.gmail.com'

    のあとにカンマを入れず

    authentication: 'plain'

    等を追加しようとしているからです。

    エラーメッセージが言っていることを超訳すると,

    「domain: 'smtp.gmail.com' のあとにカンマがねえよな。だったらここでハッシュリテラルが終わるはずだから, } が来るのを期待してたんだよな。ところが authentication なんつー識別子(tIDENTIFIER)が来て意表を突かれちまったぜ。構文エラーだっつの」

    となります。

    キャンセル

  • 2018/02/14 21:44

    なるほど、楽しい回答ありがとうございます。コメントを外してトライしてみます。
    今後とも宜しくお願いします。

    キャンセル

  • 2018/02/16 18:36

    自分のためにコメントを残しておきたくて書き込みしました。
    default from:の指定はスペースが入っていてもエラーが出ます。

    キャンセル

  • 2018/02/16 21:18

    ほう。

    キャンセル

同じタグがついた質問を見る

  • Ruby on Rails

    9026questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。