Rails — Как использовать полные адреса электронной почты, не вызывая Net:: SMTPFatalError?

Я новичок в рельсах и использую 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<[email protected]>"  
    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. Конечно же, если я просто использую «[email protected]» вместо «Support Team‹[email protected]›», все работает нормально.

Тем не менее, эта проблема не упоминается ни в Rails-2.3.5 API, ни в руководстве Rails по ActionMailer Basics, и фактически оба показывают «имя‹почтовый адрес›» в своих примерах установки actionmailer. Кто-нибудь знает, что я делаю неправильно?


person Alan S    schedule 21.02.2010    source источник


Ответы (3)


Из билета, на который ссылается Трэвис, похоже, что вы можете избежать проблемы с помощью:

  def password_reset_instructions(user)  
    subject       "Password Reset Instructions"  
    from          "Support Team<[email protected]>"  
+   headers       "return-path" => '[email protected]'
    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.

person Rob Biedenharn    schedule 22.03.2010
comment
Извините, я думал, что уже ответил, но я не вижу его здесь. Спасибо - ваше решение сработало как шарм! - person Alan S; 27.04.2010
comment
Похоже, они исправили это 29 марта. - person iwasrobbed; 29.04.2011

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 . Потребовались месяцы, чтобы исправить это.

person Travis Reeder    schedule 22.02.2010

Проблема заключается в методе Perform_delivery_smtp из ActionMailer::Base, используемом в rails 2.3.4 и 2.3.5. Вы всегда можете попытаться исправить это так:

class ApplicationMailer < ActionMailer::Base

  def welcome_email(user)
    recipients user.email from "Site Notifications<[email protected]>"
    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
person Ireneusz Skrobis    schedule 01.04.2011