Rails - Как мне использовать полные адреса электронной почты без запуска Net :: SMTPFatalError? - PullRequest
5 голосов
/ 21 февраля 2010

Я новичок в рельсах и использую рельсы-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» вместо «Служба поддержки », все будет отлично.

Однако в руководстве по rails-2.3.5 API или в руководстве по основам ActionMailer отсутствуют ссылки на эту проблему, и на самом деле оба показывают "name " в своих примерах установки actionmailer. Кто-нибудь знает, что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 22 марта 2010

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

  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

0 голосов
/ 01 апреля 2011

Проблема в методе execute_delivery_smtp из ActionMailer :: Base, который используется в рельсах 2.3.4 и 2.3.5.Вы всегда можете попробовать сделать обезьянку-заплатить так:

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
0 голосов
/ 23 февраля 2010

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

...