Uno de las mejores cosas que tiene Ruby on Rails, es su soporte para enviar correos, el manejo muy simple de plantillas y la forma de conectarlo con el servidor.
En mi caso yo no soy SysAdmin, soy desarrollador o al menos lo intento, y en mi caso… Logre configurar en mi VPS, un servidor con Apache, Mysql, Mongrel, Rails, Ruby, Rubygems, etc etc. Pero cuando quise configurar un servidor smtp para solo enviar correos, me tope con una muy poco documentada y engorrosa forma de echar a andar un servidor smtp.
¿Como envío correos sin tener que instalar un smtp server en el vps?
Leyendo y leyendo, encontré una excelente forma de hacerlo ocupando el smtp de google y como la mayoría usamos google apps for your domain es bastante simple.
Vamos por el código!
Copia esto en tu carpeta lib de tu aplicación con el nombre de smtp_tls.rb
require 'openssl'
require 'net/smtp'
Net::SMTP.class_eval do
private
def do_start(helodomain, user, secret, authtype)
raise IOError, 'SMTP session already started' if @started
check_auth_args user, secret, authtype if user or secret
sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
@socket = Net::InternetMessageIO.new(sock)
@socket.read_timeout = 60 #@read_timeout
check_response(critical { recv_response() })
do_helo(helodomain)
raise 'openssl library not installed' unless defined?(OpenSSL)
starttls
ssl = OpenSSL::SSL::SSLSocket.new(sock)
ssl.sync_close = true
ssl.connect
@socket = Net::InternetMessageIO.new(ssl)
@socket.read_timeout = 60 #@read_timeout
do_helo(helodomain)
authenticate user, secret, authtype if user
@started = true
ensure
unless @started
# authentication failed, cancel connection.
@socket.close if not @started and @socket and not @socket.closed?
@socket = nil
end
end
def do_helo(helodomain)
begin
if @esmtp
ehlo helodomain
else
helo helodomain
end
rescue Net::ProtocolError
if @esmtp
@esmtp = false
@error_occured = false
retry
end
raise
end
end
def starttls
getok('STARTTLS')
end
def quit
begin
getok('QUIT')
rescue EOFError
end
end
end
Luego en tu config/enviromment.rb
Copia en la cabecera:
require 'lib/smtp_tls'
y en la parte baja
# Include your application configuration below
ActionMailer::Base.smtp_settings = {
:address => "smtp.gmail.com",
:port => "587",
:domain => "tudominio.com",
:authentication => :plain,
:user_name => "tusuarioengafyd",
:password => "ñamñamtuclave"
}
Ahora tienes toda la configuración necesaria para enviar correos!
Pero falta algo mas, implementarlo y echar a correr la magina de ActionMailer.
(En este punto todo es mas fácil y existe mucha documentación al respecto, de hecho la totalidad de los libros sobre Rails refieren capítulos enteros a este punto)
En models/user_mailer.rb
class UserMailer < ActionMailer::Base
def sent()
@subject = "El titulo de tu correo"
@recipients = 'correo@de.destino'
@from = 'correo@de.origen'
@sent_on = Time.now
@body["user"] = "Pasale alguna variable para personalizar tu correo"
end
end
Solo 2 pasos mas.
En tus vistas
views/user_mailer/sent.rhtml -> El mensaje y podras pasar la variable(Ups!! tu objeto! Recuerda: En ruby absolutamente todo es un objeto) enviada en el body
Bienvenidos
Tus datos son:
user: <%= @user.login %>
Nota: Si tu cuenta no es activada en 24 horas sera borrado el registro.
(En el punto anterior puedes usar etiquetas html para enriquecer el correo.
y finalmente para hacer uso de el.
En cualquiera de tus controladores/metodo o donde quieras hacerlo (Just try to Be DRY).
#Envio el correo
email = UserMailer.create_sent() #Aqui puedes pasarle objetos.
email.set_content_type("text/html")
UserMailer.deliver(email)
Y listo, Ya estas enviando correos con tu flamante aplicación rails.
He tenido algunos problemas con el soporte UTF-8 si alguien tuviese experiencia con lo anterior, comentelo!