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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

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

Q&A

解決済

1回答

1200閲覧

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

koume

総合スコア458

Ruby on Rails

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

0グッド

1クリップ

投稿2018/02/13 12:19

編集2018/02/14 06:58

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

scivola

2018/02/13 13:31

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

2018/02/13 13:47 編集

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

2018/02/13 15:44

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

2018/02/13 16:48

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

回答1

0

ベストアンサー

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

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

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

③smtp_settings に

rb

1 authentication: 'plain', 2 enable_starttls_auto: true,

を追加してみる。

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

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

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

追記

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

rb

1require "action_mailer" 2 3ActionMailer::Base.delivery_method = :smtp 4 5ActionMailer::Base.smtp_settings = { 6 address: "smtp.gmail.com", 7 port: 587, 8 user_name: "XXXX@gmail.com", 9 password: "YYYY", 10 domain: "gmail.com", 11 authentication: "plain", 12 enable_starttls_auto: true, 13} 14 15class TestMailer < ActionMailer::Base 16 def hoge 17 mail to: "somebody@example.com", 18 from: "XXXX@gmail.com", 19 subject: "Test mail", 20 body: "Hello, World!" 21 end 22end 23 24TestMailer.hoge.deliver_now

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

投稿2018/02/13 17:34

編集2018/02/14 03:36
scivola

総合スコア2108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koume

2018/02/14 00:50

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

2018/02/14 03:37

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

2018/02/14 06:22

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

2018/02/14 06:44

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

2018/02/14 08:52

Syntax Error が出るのは domain: 'smtp.gmail.com' のあとにカンマを入れず authentication: 'plain' 等を追加しようとしているからです。 エラーメッセージが言っていることを超訳すると, 「domain: 'smtp.gmail.com' のあとにカンマがねえよな。だったらここでハッシュリテラルが終わるはずだから, } が来るのを期待してたんだよな。ところが authentication なんつー識別子(tIDENTIFIER)が来て意表を突かれちまったぜ。構文エラーだっつの」 となります。
koume

2018/02/14 12:44

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

2018/02/16 09:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問