在开发环境中使用 Rails 3 发送邮件
Posted
技术标签:
【中文标题】在开发环境中使用 Rails 3 发送邮件【英文标题】:Sending mail with Rails 3 in development environment 【发布时间】:2011-05-17 19:46:51 【问题描述】:我确信这已经被问过一百万次了,但我找不到任何适合我的东西,所以我再问一次!
我只需要一种在 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 => "xxx@gmail.com",
:password => "yyy",
:authentication => "plain",
:enable_starttls_auto => true
我已经在我的 config/environment.rb、config/environments/development.rb 中尝试了上面的代码(当然还有有效的 gmail 详细信息),并且目前在它自己的初始化程序 config/initialisers/setup_mail.rb 中有它
我还尝试了一些不同的 smtp 服务器,包括 Gmail 和 Sendgrid,相应地调整了 smtp 设置,但仍然没有。我可以在终端中看到邮件和开发日志,仅此而已。
有没有人知道我可能遗漏的任何其他问题需要设置才能使 ActionMailer 工作?如果做不到这一点,是否有办法获取有关邮件未发送原因的更多信息?我有
config.action_mailer.raise_delivery_errors = true
在我的 config/development.rb 中设置,但开发日志仍然显示与我在终端中看到的相同。
无论如何,我正在一台 Ubuntu 10.04 笔记本电脑上进行开发,以防万一需要任何特定设置。
非常感谢
【问题讨论】:
您可以尝试从设置中删除 :domain 或将其更改为其他域。 【参考方案1】:好吧,我已经解决了这个问题,但我不知道为什么这个方法有效而其他方法无效。
解决方案是在 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
然后我添加了包含开发和生产电子邮件帐户详细信息的 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
就像我说的,不知道为什么,但这似乎起到了作用。谢谢大家的指点
【讨论】:
这行得通,没有别的。很困惑为什么它有效,但谢谢。数小时的谷歌搜索已经结束。我本来应该来这里的。 我四处寻找一个好的解决方案,这正是我应该做的。谢谢!【参考方案2】:我在config/environments/development.rb
中有以下内容
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
实际的邮件配置,config.actionmailer.*
我已经放在config\application.rb
。
希望这会有所帮助:)
【讨论】:
谢谢大家,不幸的是他们都已经在那里了。谢谢你的建议 在这种情况下,您应该会收到错误,为什么它不起作用。对吗? 嗨 nathanvda,对不起,我才看到你的评论。部分问题是我没有收到任何错误。我已经在下面发布了我是如何解决这个问题的,但老实说,我看不出有任何理由说明为什么下面的方法应该有效,而其他方法都没有。perform_deliveries
做到了——你还需要重启服务器。【参考方案3】:
尝试使用“sendmail”而不是“smtp”。
ActionMailer::Base.delivery_method = :sendmail
ActionMailer::Base.sendmail_settings =
:address => "smtp.gmail.com",
:port => "587",
:domain => "gmail.com",
:user_name => "xxx@gmail.com",
:password => "yyy",
:authentication => "plain",
:enable_starttls_auto => true
【讨论】:
感谢您的建议。不幸的是,我刚刚尝试过,我得到了与 sendmail 完全相同的行为【参考方案4】:三件事。
首先,端口是一个整数,不需要引号,就像您的第一个示例一样。 (但我认为字符串应该仍然有效。)
其次,每次修改此(或任何)初始化程序文件时不要忘记重新启动服务器。这可以解释为什么您在添加后没有看到错误:
config.action_mailer.raise_delivery_errors = true
如果没有该错误消息,就很难确定为什么邮件没有发送,但现在却发送了。一种可能是您在密码周围使用双引号。如果您使用的是强密码并且您的密码中有一个未转义的令牌,则它可能会被重新解释。 (即"P@ssw\0rd"
将变为P@s-s-rd
)。正是因为这个原因,我总是在我的代码中使用单引号,除非我特别需要语法糖。
最后,enable_starttls_auto: true
是默认值,是不必要的。
【讨论】:
【参考方案5】:ActionMailer::Base.delivery_method = :sendmail
和config.action_mailer.perform_deliveries = true
是让我解决这个问题的两个必要步骤
【讨论】:
【参考方案6】:只需将所有配置放入: config/environments/development.rb
我是说
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings =
:address => "smtp.gmail.com",
:port => "587",
:domain => "gmail.com",
:user_name => "xxx@gmail.com",
:password => "yyy",
:authentication => "plain",
:enable_starttls_auto => true
和
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
它对我有用。
【讨论】:
【参考方案7】:此外,您的 gmail 用户名没有别名。
参考:https://support.google.com/mail/answer/12096?hl=en
【讨论】:
【参考方案8】:我的两便士值:
我在使用 Rails 5.1 时遇到了完全相同的症状:什么也没发生,我的 development.rb
文件中的设置被完全忽略了...
然后我记得重启机器!(神奇地解决了问题)
之前的几位 cmets 已经指出了这一点。
但是,这个问题很棘手,因为您不希望出现这种行为。在我看来,development.rb
中的默认 cmets 在这方面具有误导性:
# 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*.
【讨论】:
以上是关于在开发环境中使用 Rails 3 发送邮件的主要内容,如果未能解决你的问题,请参考以下文章
从 Rails 应用程序发送电子邮件时的 Net::SMTPAuthenticationError(在暂存环境中)
Rails 4.2 - Sidekiq 在开发中不发送电子邮件
通过电子邮件发送ActionMailer中的当前用户 - Rails 5
我们可以在 rails 3.0 中使用 mailchimp 发送用户通知电子邮件吗