在Rails应用程序中,我在其环境/文件中设置了一个新的临时环境,其中包含以下参数:
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的电子邮件是否被发送出去,登录到日志文件,或者两者兼而有之?)
解决方法
关于第三次编辑,日志记录是您为应用程序本身设置的日志级别的函数,而不是ActionMailer中的任何特定设置.
在Rails 2.3中,ActionMailer :: Base只是将电子邮件发送到已配置的任何记录器(如果有).收件人将被发送到信息日志,电子邮件正文将发送到调试日志. (评论是我的.其余的都是源代码.)
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.rb或staging.rb文件应该有一行控制日志级别.类似于以下内容:
config.log_level = :debug
这些都与您已找到的邮件程序配置完全分开,后者控制是否发送电子邮件.
config.action_mailer.perform_deliveries = true