Powered By Blogger

segunda-feira, 8 de fevereiro de 2010

ActionMailer novamente....

Já tinha um ano que vinha usando o actionmailer 2.2.2 e ultimamente estou pesquisando sobre envio de e-mails em background e tive alguns problemas
com o actionmailer para realizar os jobs devido ao fato de que nessa versão
eu precisava de um monkey-patch para ignorar o protocolo tls.

O problema era que o patch não estava sendo aplicado em scripts...

Então decidi migrar para Rails 2.3.5, (lógico que actionmailer 2.3.5 igualmente ).
Imagina onde foi o primeiro problema??? no ActionMailer é claro.

A app não enviava e-mail por nada, retornava um erro de sintaxe (SMTP 517)
que também não encontrei quase nada sobre o erro.
Fui ver nos tickets (abaixo) que era um problema do mailer que não estava gerando a string do campo From: corretamente.

https://rails.lighthouseapp.com/projects/8994/tickets/2340
https://rails.lighthouseapp.com/projects/8994/tickets/3078-actionmailer-233-broke-display-name-support-in-from-address-when-using-smtp
https://rails.lighthouseapp.com/projects/8994/tickets/2945

Embora o problema venha ocorrendo desde o Rails 2.3.3 o fix definitivo está programado para sair somente na versão 2.3.6.

Vi 3 ou 4 soluções diferentes:
3 usavam patches no fonte do Rails
e uma usava um script em /config/initializers

Experimentei somente a solução do script e está funcionando OK!

Criei o arquivo fix_mailer_rails.rb em /config/initializers
conteúdo:

#https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2340
module ActionMailer
class Base
def perform_delivery_smtp(mail)
destinations = mail.destinations
mail.ready_to_send
sender = (mail['return-path'] && mail['return-path'].spec) || Array(mail.from).first

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
end

2 comentários:

  1. cara tem como vc me ajudar to tentando fazer isso e ate agora nao achei a solução, tem como fazer um tutorial nao?
    desde ja muito obrigado
    ass julio

    ResponderExcluir