2009-06-26 19 views
7

Estoy tratando de enviar un correo electrónico desde un programa de Ruby. El servidor smtp es un servidor de Exchange 2007 que me requiere iniciar sesión para enviar el correo electrónico.Enviar correo electrónico desde el programa Ruby con TLS

#!/usr/bin/ruby 

require 'rubygems' 
require 'net/smtp' 

msgstr = "Test email." 

smtp = Net::SMTP.start('smtp.server.com', 587, 
    'mail.server.com', 'username', 'password', :login) do |smtp| 
    smtp.send_message msgstr, '[email protected]', '[email protected]' 
end 

Cuando ejecuto esto obtengo el siguiente error.

/usr/lib/ruby/1.8/net/smtp.rb:948:in `check_auth_continue': 
530 5.7.0 Must issue a STARTTLS command first (Net::SMTPAuthenticationError) 
    from /usr/lib/ruby/1.8/net/smtp.rb:740:in `auth_login' 
    from /usr/lib/ruby/1.8/net/smtp.rb:921:in `critical' 
    from /usr/lib/ruby/1.8/net/smtp.rb:739:in `auth_login' 
    from /usr/lib/ruby/1.8/net/smtp.rb:725:in `send' 
    from /usr/lib/ruby/1.8/net/smtp.rb:725:in `authenticate' 
    from /usr/lib/ruby/1.8/net/smtp.rb:566:in `do_start' 
    from /usr/lib/ruby/1.8/net/smtp.rb:525:in `start' 
    from /usr/lib/ruby/1.8/net/smtp.rb:463:in `start' 

no puedo encontrar nada en los Ruby api for Net::SMTP TLS o hacen referencia a un comando STARTTLS.

EDITAR: Descargar smtp-tls.rb, el código no cambia mucho, pero esto es lo que tengo que trabajar.

#!/usr/bin/ruby 

require 'rubygems' 
require 'net/smtp' 
require 'smtp-tls' 

msgstr = <<MESSAGE_END 
From: me <[email protected]> 
To: you <[email protected]> 
Subject: e-mail test 

body of email 

MESSAGE_END 

smtp = Net::SMTP.start('smtp.test.com', 587, 'test.com', 'username', 'passwd', :login) do |smtp| 
    smtp.send_message msgstr, '[email protected]', ['[email protected]'] 
end 

EDIT: funciona con Ruby 1.8.6

+0

La respuesta aceptada no es correcta (o al menos, no más). –

Respuesta

1

Net :: SMTP no parezca que soporta la encriptación STARTTLS. Sin embargo, encontré un proyecto en github que tiene un código para tratar con esto.

smtp-tls

+1

Esto no es correcto; vea mi respuesta a continuación. –

4

no pude conseguir que funcione usando tu ejemplo actualizado. Pero lo siguiente funcionó para mí.

require 'rubygems' 
require 'smtp_tls' 
require 'net/smtp' 

smtp = Net::SMTP.new 'smtp.gmail.com', 587 
smtp.enable_starttls 

smtp.start(Socket.gethostname,username,password,:login) do |server| 
    server.send_message msg, from, to 
end 
+0

¿Qué versión de Ruby estás usando? – Mark

+0

Estoy usando ruby ​​1.8.6 – brodie31k

+0

Estoy en 1.8.7 y obtengo un "método desconocido" enable_starttls 'error ". He solicitado smtp_tls y net/smtp. Un posible problema es que en mi configuración tengo 'ActionMailer :: Base.delivery_method =: smtp'. ¿Debería establecerse esto en alguna otra cosa, por ejemplo, smtp_tls o algo así? –

0

Esta es una solución utilizando la gema tlsmail:

require 'rubygems' 
require 'tlsmail' 
require 'net/smtp' 

Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE) 
Net::SMTP.start(server,25,Socket.gethostname,username,password,:login) do |server| 
    server.send_message msg, from, to 
end 
+0

Esta fue la fórmula ganadora para mí con Ruby 1.9.3, pero hice un cambio: Especifiqué el puerto 587 en lugar del puerto 25. –

9

No se requiere joya en Ruby 1.9.3

que no es necesario una joya para hacer esto (al menos, no para Gmail y Ruby 1.9.3), la documentación es simplemente terrible.

Ver https://stackoverflow.com/a/3559598/4376

Cuestiones relacionadas