0

我有一个运行良好的 rails 3.2.3 应用程序,并提供设计创建的邮件消息,注册确认和密码忘记邮件消息以设置新密码。

但是,我有不同的地方要发送邮件通知。

这是我的Notifier模型。

# encoding: utf-8
class Notifier < ActionMailer::Base
  default from: "no-reply@domain.com"
  default to: "admin@domain.com"

  def new_post_submitted(post)
    @post = post
    mail(subject: "Anúncio enviado: #{@post.title}")
  end

  def new_message(message)
    @message = message
    mail(subject: "Mensagem de contato: #{@message.subject}")
  end

end

控制器调用:

def create
  @message = Message.new(params[:message])

  if @message.valid?
    Notifier.new_message(@message).deliver
    redirect_to(root_path, :notice => "Obrigado. Sua Mensagem enviada com sucesso")
  else
    flash.now.alert = "Por favor preencha todos os campos."
    render :new
  end
end

日志输出说它已交付:

Started POST "/contato" for 187.57.102.168 at 2012-08-31 11:28:51 +0900
Processing by ContactController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"TVdmDYCA4x3JVi+9pMcpY7OSU/P1lE9enLiFJlK9W1M=", "message"=>{"name"=>"kleber", "email"=>"test@gmail.com", "subject"=>"teste", "body"=>"hello there"}, "commit"=>"Enviar"}
  Rendered notifier/new_message.html.erb (0.1ms)

Sent mail to admin@domain.com (152ms)
Redirected to http://www.domain.com/
Completed 302 Found in 158ms (ActiveRecord: 0.0ms)

以及我的config/production.rb文件中的以下配置。

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  :address => "localhost",
  :port => 25,
  :domain => "domain.com",
  :authentication => :login,
  :user_name  => "admin@domain.com",
  :password  => "mypassword",
  :enable_starttls_auto => false
}

关于这里发生了什么的任何线索?

4

2 回答 2

1

以下是我的 production.rb 文件中的设置。

ActionMailer::Base.smtp_settings = {
   :address => 'mail.domain.com',
   :port => 587,
   :domain => 'domain.com',
   :authentication => :login,
   :user_name => 'postmaster@domain.com',
   :password => 'password'
  }

不确定是否必须指定 delivery_method?

ActionMailer::Base.delivery_method = :smtp

我的配置中没有它,一切正常。

在 rails API http://api.rubyonrails.org/ ActionMailer 部分有一个选项可以设置传递错误。

raise_delivery_errors - Whether or not errors should be raised if the email fails to be delivered.

您可以尝试进一步解决问题。

于 2012-09-07T14:20:55.570 回答
0

首先,确保您没有在环境文件的其他地方关闭交付:

# the default is true anyway, so if you don't see it anywhere in
# the file, you should be okay
config.action_mailer.perform_deliveries = true

接下来我会尝试将交付方式更改为:sendmail:file。如果您的系统(至少是开发系统)上安装并配置了 sendmail,那么您应该会收到您发送的电子邮件。有一次我惊讶地发现 sendmail 在 OS X 上开箱即用。我不确定你是否会在 CentOS 上找到相同的东西。

如果您没有 sendmail 或不想配置它,请使用:file传递方法将电子邮件转储到文件系统上的文件中。

此时,如果电子邮件没有通过 sendmail 或文件传递,您就知道堆栈中存在问题。如果他们确实交付了,那么问题出在您的 SMTP 配置上。尝试使用已知有效的 SMTP 服务器(例如您的 Gmail 帐户)。如果可行,那么您知道这是在 localhost 上运行的 SMTP 服务器的问题,而不是 ActionMailer 的问题。

于 2012-09-08T13:53:52.260 回答