web-dev-qa-db-ja.com

開発環境でRails 3を使用してメールを送信する

これは以前に何百万回も質問されていたと思いますが、自分に合ったものが見つからないので、もう一度質問します!

Rails 3.でActionMailerを使用して電子メールを送信する方法が必要です。新しいActionMailerのRailscastsチュートリアルを含む多数のチュートリアルを実行しましたが、生成されるメールを確認できますが、受信しませんそれら。

私はさまざまな方法を試しましたが、一般的に次の設定を構成することになります

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "[email protected]",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

私はconfig/environment.rb、config/environments/development.rbで上記のコードを(もちろん有効なgmailの詳細とともに)試してみましたが、現在は独自のイニシャライザーconfig/initialisers/setup_mail.rbにあります

また、GmailやSendgridを含むいくつかの異なるsmtpサーバーを試し、それに応じてsmtp設定を調整しましたが、それでも何もしませんでした。ターミナルと開発ログでメールを見ることができます。

ActionMailerが動作するためにセットアップする必要がある、私が見逃したかもしれない他の落とし穴を誰もが知っていますか?それに失敗すると、メールが送信されない理由に関する詳細情報を取得する方法がありますか?私が持っています

config.action_mailer.raise_delivery_errors = true

config/development.rbで設定しますが、開発ログには、端末で表示されるものと同じものが表示されます。

価値のあるものとして、Ubuntu 10.04ラップトップで開発を行っています。念のため、特別なセットアップが必要な場合があります。

どうもありがとう

54
Addsy

まあ私は問題を解決しましたが、なぜこれが機能し、他の方法が機能しなかったのか、わかりません。

解決策は、config/initialisers/setup_mail.rbに以下を含む初期化子を作成することでした

if Rails.env != 'test'
  email_settings = YAML::load(File.open("#{Rails.root.to_s}/config/email.yml"))
  ActionMailer::Base.smtp_settings = email_settings[Rails.env] unless email_settings[Rails.env].nil?
end

次に、devおよびproductionメールアカウントの詳細を含むconfig/email.ymlを追加しました

development:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true
production:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true

私が言ったように、理由はわかりませんが、これでうまくいくようです。ポインタをありがとう

55
Addsy

config/environments/development.rbには次のものがあります

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

実際のメール設定、config.actionmailer.* iはconfig\application.rbに配置されています。

お役に立てれば :)

27
nathanvda

三つの事。

最初に、ポートは整数であり、最初の例のように引用符を必要としません。 (しかし、文字列はまだ機能するはずです。)

次に、この(または任意の)初期化ファイルを変更するたびにサーバーを再起動することを忘れないでください。これにより、追加後にエラーが表示されなかった理由を説明できます。

config.action_mailer.raise_delivery_errors = true

そのエラーメッセージがなければ、メールが送信されなかった理由を特定することは困難ですが、今はそうです。 1つの可能性は、パスワードを二重引用符で囲むことです。強力なパスワードを使用しており、パスワードにエスケープされていないトークンが含まれていた場合、再解釈された可能性があります。 (つまり、"P@ssw\0rd"P@ssrdになります)。まさにこの理由で、構文上の砂糖が特に必要でない限り、コードでは常に単一引用符を使用します。

最後に、enable_starttls_auto: trueがデフォルトであり、不要です。

3
IAmNaN

ActionMailer::Base.delivery_method = :sendmail
および
config.action_mailer.perform_deliveries = true

この問題を解決するのに必要な2つのステップでした

1
Jerome

すべての構成をconfig/environments/development.rbに置くだけ

というのは

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "[email protected]",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

そして

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

それは私のために働いた。

1
Nickle

私の2ペニーの価値:

Rails 5.1:と同じ症状がありました。5.1:何も起こりませんでした。development.rbファイルの設定はまったく無視されました...

それから私はマシンを再起動することを思い出した!(問題を魔法のように解決した)

これは、以前のいくつかのコメントで指摘されていました。

ただし、この動作は想定されていないため、問題は複雑です。私の見解では、development.rbのデフォルトのコメントは、この点で誤解を招きます。

# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since *you don't have to restart the web server when you make code changes*.
0
Varus Septimus

さらに、Gmailユーザー名はエイリアスされません。

参照: https://support.google.com/mail/answer/12096?hl=en

0
seyyah