2009-07-26 20 views
22

¿Alguien tiene información de calidad (y actualizada) sobre el envío de correo a través de Gmail usando Ruby's Net :: SMTP? He visto varios ejemplos, la mayoría datan de 2007 a mediados de 2008 y ninguno de ellos funciona para mí. Necesito más ejemplos actuales que utilicen la versión 1.8.7 más reciente. También agradecería que la documentación no solo cubriera ejemplos simples que nadie utiliza realmente.(Ruby) Getting Net :: SMTP trabajando con Gmail ...?

Actualmente estoy recibiendo un error:

SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol 

No estoy terriblemente familiar con SSL lo que respecta al protocolo SMTP, así que todo esto se me escapa. Lamentablemente, la documentación de Net :: SMTP solo cubre las bases y no proporciona una lista completa de los diversos contextos potenciales de OpenSSL :: SSL tampoco, así que no puedo probar varios.

De todos modos, si alguien tiene alguna información de calidad para hacer que esto funcione con Gmail, sería muy apreciado.

Mejor.

Respuesta

10

De hecho, me acabo de este trabajo. Escribió un guión rápido para probarlo.

que estaba recibiendo un error diferente de lo que estaban (que requiere STARTTLS), también me encontré con que tenía para utilizar el puerto 587 en lugar de 465.

He encontrado el truco para conseguir que funcione en un plugin de rieles que encontré. (Agilewebdevelopment.com/plugins/net_smtp_tls_support)

si 'eval' este archivo (TLS que añade soporte a la red estándar :: biblioteca SMTP):

http://happiness-is-slavery.net/wp-content/rails-plugins/smtp_add_tls_support/lib/smtp_add_tls_support.rb

continuación, ejecute 'Net :: SMTP. enable_tls() '

todo parece funcionar bien.

Aquí está mi código:

require 'rubygems' 
require 'net/smtp' 

eval File.read("smtp_tls.rb") 
Net::SMTP.enable_tls() 
FROM_EMAIL = "REMOVED" 
PASSWORD = "REMOVED" 
TO_EMAIL = "REMOVED" 

msgstr = <<END_OF_MESSAGE 
From: Your Name <#{FROM_EMAIL}> 
To: my phone <#{TO_EMAIL}> 
Subject: text message 
Date: Sat, 23 Jun 2001 16:26:43 +0900 
Message-Id: <[email protected]> 

This is a test message. 
END_OF_MESSAGE 

Net::SMTP.start('smtp.gmail.com', 587, 'gmail.com', 
         FROM_EMAIL, PASSWORD, :plain) do |smtp| 
    smtp.send_message msgstr, FROM_EMAIL, TO_EMAIL 

end 

obviamente, he descargado el archivo mencionado anteriormente en el mismo directorio y lo llamó 'smtp_tls.rb'

Espero que esto ayude!

+0

parece que hay una gema smtp_tls que probablemente también funcione ... – Jerceratops

+0

La URL del "archivo mencionado anteriormente" está rota. ¿Alguna idea de a dónde ha ido? ¡Hola! Lo encontré: https://github.com/andreashappe/smtp_add_tls_support – JDS

2

¿Se está conectando al puerto smtp.gmail.com 465 que estoy asumiendo? .

openssl s_client -connect smtp.gmail.com:587 

RELACIONADOS (00000003) 8298: Error: 140770FC: rutinas SSL: SSL23_GET_SERVER_HELLO: protocolo desconocido: s23_clnt.c: 601:

El error se ve muy similar a la suya. El siguiente comando funciona:

openssl s_client -starttls smtp -connect smtp.gmail.com:587 

Así que creo que lo que está sucediendo es que usted no tiene el apoyo STARTTLS habilitado. No estoy seguro de cómo hacerlo en ruby. Lo que descubrí es que el plugin action_mailer_tls lo permite parcheando Net :: SMTP. A partir de Ruby 1.8.7, Net :: SMTP tiene esta compatibilidad incorporada.

Si está usando Ruby < 1.8.7 here es el parche.

+0

En realidad, Gmail parece ser una extraña bestia. El puerto 465 funciona bien, pero la necesidad de trabajar en el puerto 587 * y * usa STARTTLS causa problemas. Este último es la combinación que necesito para trabajar. ¿Algunas ideas? –

+0

¿Entonces está diciendo que SSL/STARTTLS ni siquiera es posible en 587? –

+0

Edité mi publicación. El comando STARTTLS después de HELO sin SSL para solicitar que el servidor lo inicie parece estar funcionando. No estoy seguro. –

46

En realidad las obras siguientes para Gmail sin un plugin o una joya, al menos con Ruby 1.9.1p376, pero una buena documentación encontrar la suerte de que te lo dirá:

require 'net/smtp' 

    msg = "Subject: Hi There!\n\nThis works, and this part is in the body." 
    smtp = Net::SMTP.new 'smtp.gmail.com', 587 
    smtp.enable_starttls 
    smtp.start(YourDomain, YourAccountName, YourPassword, :login) do 
     smtp.send_message(msg, FromAddress, ToAddress) 
    end 

YourAccountName parece 'que @ domain.com '& YourDomain puede ser lo que quieras, pero uso el nombre de dominio real.

+0

Funciona muy bien, muchas gracias ... – jasoares

+1

Dios mío, gracias. La documentación sobre esto es terrible. Buen ejemplo! :) –

+0

obtengo un error de "nivel de pila demasiado alto" con esto. el primer correo electrónico se envía "bien", luego al tratar de enviar otro correo electrónico, recibí ese error. ¿Cual podría ser el problema? Gracias. –

1

También necesita tener dos caracteres de nueva línea entre el asunto y el cuerpo del mensaje. De lo contrario, solo se transmitirá el asunto y el cuerpo del mensaje se dejará en blanco.

msg = "Subject: My Subject Goes Here\n\nMy message goes here" 
Cuestiones relacionadas