2009-07-26 18 views
22

Qualcuno ha informazioni di qualità (e aggiornate) sull'invio di posta tramite Gmail utilizzando Ruby's Net :: SMTP? Ho visto diversi esempi, la maggior parte risalenti dal 2007 alla metà del 2008 e nessuno di loro lavora per me. Ho bisogno di più esempi attuali che utilizzino la versione 1.8.7 più recente. Mi piacerebbe anche che la documentazione non riguardasse solo semplici esempi che nessuno usa mai veramente.(Ruby) Ottenere rete: SMTP funziona con Gmail ...?

Attualmente sto ricevendo un errore:

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

Io non sono terribilmente familiarità con SSL per quanto riguarda il protocollo SMTP, quindi questo è tutto perso su di me. Sfortunatamente la documentazione di Net :: SMTP copre solo le basi e non fornisce un elenco completo dei vari potenziali contesti OpenSSL :: SSL, quindi non posso provarne di diversi.

In ogni caso, se qualcuno ha informazioni di qualità su come far funzionare tutto questo con Gmail, sarebbe molto apprezzato.

Migliore.

risposta

10

realtà ho appena ricevuto questo lavoro. Ha scritto un breve script per testarlo.

stavo ottenendo un errore di diverso da quello che eri (che richiede STARTTLS), ho anche scoperto che ho dovuto utilizzare la porta 587 invece di 465.

Ho trovato il trucco per farlo funzionare in un plugin Rails ho trovato. (Agilewebdevelopment.com/plugins/net_smtp_tls_support)

se 'eval' questo file (aggiunge il supporto TLS alla Rete di serie :: libreria SMTP):

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

quindi eseguire 'Net :: SMTP. enable_tls() '

tutto sembra funzionare correttamente.

Ecco il mio codice:

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 

ovviamente, ho scaricato il file di cui sopra nella stessa directory e la chiamò 'smtp_tls.rb'

Spero che questo aiuti!

+0

sembra che ci sia una gemma smtp_tls che probabilmente funzionerebbe anche ... – Jerceratops

+0

L'URL "Sopra il file menzionato" è rotto. Qualche idea su dove è andata? Ehi! Trovato: https://github.com/andreashappe/smtp_add_tls_support – JDS

2

Si sta connettendo alla porta smtp.gmail.com 465 Sto assumendo? .

openssl s_client -connect smtp.gmail.com:587 

COLLEGATI (00000003) 8298: errore: 140770FC: routine SSL: SSL23_GET_SERVER_HELLO: sconosciuto protocollo: s23_clnt.c: 601:

L'errore sembra molto simile al tuo. Il seguente comando funziona:

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

Quindi penso che quello che sta accadendo è che non hai il supporto STARTTLS abilitato. Non sono sicuro di come farlo in ruby, comprare quello che ho scoperto è che il plug-in action_mailer_tls permette questo patching di Net :: SMTP. A partire da Ruby 1.8.7, Net :: SMTP ha questo supporto integrato.

Se si utilizza Ruby < 1.8.7 here è la patch.

+0

In realtà Gmail sembra essere una strana bestia. La porta 465 funziona bene, ma la necessità di lavorare sulla porta 587 * e * utilizzare STARTTLS causa problemi. Quest'ultima è la combinazione che ho bisogno di lavorare. Qualche idea? –

+0

Quindi stai dicendo che SSL/STARTTLS non è nemmeno possibile su 587? –

+0

Ho modificato il mio post. Il comando STARTTLS dopo HELO senza SSL per richiedere l'avvio del server sembra funzionare. Non ne sono sicuro –

46

In realtà i lavori al di sotto Gmail senza un plugin o un gioiello, almeno con Ruby 1.9.1p376, ma buona fortuna trovare la documentazione che ti dico così:

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 appare come 'te @ domain.com '& YourDomain può probabilmente essere qualsiasi cosa tu voglia, ma io uso il nome del dominio reale.

+0

Funziona alla grande, grazie mille ... – jasoares

+1

Oh mio Dio, grazie. La documentazione su questo è terribile. Bel esempio! :) –

+0

sto ottenendo errore "livello di stack troppo profondo" con questo. la prima email viene inviata "ok", quindi quando si tenta di inviare un'altra email, ho ricevuto quell'errore. Quale potrebbe essere il problema? Grazie. –

1

È inoltre necessario disporre di due caratteri di nuova riga tra il soggetto e il corpo del messaggio. In caso contrario, verrà trasmesso solo il soggetto e il corpo del messaggio verrà lasciato vuoto.

msg = "Subject: My Subject Goes Here\n\nMy message goes here" 
Problemi correlati