5

我是 Rails 新手,使用 rails-2.3.5 和 ruby​​-1.8.7。这是我的 notifier.rb 模型:

# app/models/notifier.rb
class Notifier < ActionMailer::Base
  default_url_options[:host] = "foo.com"  

  #This method sends an email with token to users who request a new password
  def password_reset_instructions(user)  
    subject       "Password Reset Instructions"  
    from          "Support Team<support@foo.com>"  
    recipients    user.email  
    sent_on       Time.now  
    body          :edit_password_reset_url => 
                   edit_password_reset_url(user.perishable_token)  
  end  
end

当我调用此方法时,出现以下错误:

Net::SMTPFatalError in Password resetsController#create
555 5.5.2 Syntax error. 36sm970138yxh.13

我发现一篇文章说问题是 ruby​​-1.8.4 中的一个错误,修复方法是从 :from 字段中删除尖括号。果然,如果我只使用“support@foo.com”而不是“支持团队<support@foo.com>”一切正常。

但是,在 rails-2.3.5 API 或 ActionMailer Basics rails 指南中都没有提及此问题,实际上两者都在其 actionmailer 设置示例中显示“名称<邮件地址>”。有人知道我在做什么错吗?

4

3 回答 3

3

从 Travis 引用的票证来看,您似乎可以通过以下方式避免该问题:

  def password_reset_instructions(user)  
    subject       "Password Reset Instructions"  
    from          "Support Team<support@foo.com>"  
+   headers       "return-path" => 'support@foo.com'
    recipients    user.email  
    sent_on       Time.now  
    body          :edit_password_reset_url => 
                   edit_password_reset_url(user.perishable_token)  
  end  

否则,您可以获取票证中注明的补丁之一或等待 2.3.6 或 3.x

于 2010-03-22T20:44:24.873 回答
0

Rails/ActionMailer 打破了这一点:

https://rails.lighthouseapp.com/projects/8994/tickets/2340

而且由于像这样的严重错误在 Rails 项目中没有获得高优先级或临时版本来修复它们,因此您要么必须自己修补它,要么等待很长时间才能修复它。就像 Rails 2.3.4 中出现的这个非常糟糕的错误一样,它使 Rails 完全无法用于 Ruby 1.9:https ://rails.lighthouseapp.com/projects/8994/tickets/3144-undefined-method-for-string-ror -234。花了几个月的时间来解决这个问题。

于 2010-02-22T23:32:07.340 回答
0

问题是 Rails 2.3.4 和 2.3.5 中使用的 ActionMailer::Base 中的 perform_delivery_smtp 方法。你总是可以尝试像这样对它进行猴子补丁:

class ApplicationMailer < ActionMailer::Base

  def welcome_email(user)
    recipients user.email from "Site Notifications<notifications@example.com>"
    subject "Welcome!"
    sent_on Time.now
    ...
  end

  def perform_delivery_smtp(mail)
    destinations = mail.destinations
    mail.ready_to_send
    sender = mail['return-path'] || mail.from
    smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
    smtp.enable_starttls_auto if smtp_settings[:enable_starttls_auto] && smtp.respond_to?(:enable_starttls_auto)
    smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password],
               smtp_settings[:authentication]) do |smtp|
      smtp.sendmail(mail.encoded, sender, destinations)
    end
  end

end
于 2011-04-01T07:48:09.507 回答