2011-01-05 67 views
6

在Rails应用程序我设置以下参数一个新的临时环境在其environments/文件的电子邮件发送:控制记录和在不同环境

config.action_mailer.perform_deliveries = true 
config.action_mailer.raise_delivery_errors = true 
config.action_mailer.delivery_method = :smtp 

然而,当系统生成的电子邮件时,打印到staging.log文件而不是被发送。我的SMTP设置在其他环境中正常工作。我错过了什么配置让电子邮件实际发送?

编辑:是的,临时文件夹设置有效的配置为它有权访问的SMTP服务器。这似乎是问题不在SMTP设置(如果是这样,我不会在日志中得到错误?),但与Rails配置。应用程序仍然将电子邮件重定向到日志文件(称为“发送邮件:...”),而不是实际通过SMTP。

编辑#2:它看起来像电子邮件实际上一直在正确发送,他们只是碰巧打印到日志。我正在尝试使用sanitize_email gem将邮件重定向到另一个地址,而且这似乎不起作用,这就是为什么我认为电子邮件没有出去。所以我认为这解决了我的问题,尽管我仍然很好奇ActionMailer的设置控制着电子邮件是发送,记录到日志文件还是两者。

编辑#3:sanitize_email的问题归结为我需要将新的临时环境添加到ActionMailer::Base.local_environments。我将继续讨论这个问题,看看是否有人可以回答我的最后一个问题(确定ActionMailer的电子邮件是发送出去,是否记录到日志文件,或两者兼而有之?)

+1

请问您的登台盒是否有可用的SMTP服务器? – jdl 2011-01-05 01:19:56

+0

您是否使用localhost,端口25和某个域来设置config.action_mailer.smtp_settings? – marko 2011-01-05 18:06:04

回答

10

关于第三次编辑,日志记录功能其中您为应用程序本身设置的日志级别,而不是ActionMailer中的任何特定设置。

在Rails 2.3中,ActionMailer::Base只需发送电子邮件到任何已配置的记录器(如果有的话)。收件人被发送到info日志,并且电子邮件的正文被发送到debug日志。 (评论是我的。剩下的就是直出的源代码。)

def deliver!(mail = @mail) 
    raise "no mail object available for delivery!" unless mail 

    # 
    # Logging happens first (or not) 
    # 
    unless logger.nil? 
    logger.info "Sent mail to #{Array(recipients).join(', ')}" 
    logger.debug "\n#{mail.encoded}" 
    end 

    # 
    # And then we decide if an email should really get sent 
    # 
    begin 
    __send__("perform_delivery_#{delivery_method}", mail) if perform_deliveries 
    rescue Exception => e # Net::SMTP errors or sendmail pipe errors 
    raise e if raise_delivery_errors 
    end 

    return mail 
end 

environment.rbstaging.rb文件应该有控制日志级别的线。类似以下内容:

config.log_level = :debug 

这与您已经找到的邮件配置完全分开,邮件配置控制邮件是否被发送。

config.action_mailer.perform_deliveries = true 
+0

谢谢,优秀的回答!这清除了它。 – jrdioko 2011-01-06 17:46:32