2009-07-26 12 views
22

Hat jemand qualitativ (und aktuelle) Informationen zum Senden von E-Mails über Gmail mit Rubys Net :: SMTP? Ich habe einige Beispiele gesehen - die meisten von 2007 bis Mitte 2008 und keiner von ihnen funktioniert für mich. Ich brauche aktuellere Beispiele, die die neueste Version 1.8.7 verwenden. Ich würde es auch begrüßen, wenn die Dokumentation nicht nur einfache Beispiele behandelt, die niemand wirklich verwendet.(Ruby) Getting Net :: SMTP funktioniert mit Google Mail ...?

Zeit einen Fehler Ich erhalte:

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

ich mit SSL nicht sehr vertraut bin, wie das SMTP-Protokoll angeht, so ist dies bei mir ist alles verloren. Leider deckt die Net :: SMTP-Dokumentation nur die Grundlagen ab und bietet keine vollständige Liste der verschiedenen möglichen OpenSSL :: SSL-Kontexte, so dass ich verschiedene nicht ausprobieren kann.

Wie auch immer, wenn jemand irgendwelche Qualitätsinformationen darüber hat, dies mit Gmail zu arbeiten, würde es am meisten geschätzt werden.

Am besten.

Antwort

10

ich eigentlich habe gerade diese Arbeit. Hat ein schnelles Skript geschrieben, um es zu testen.

ich einen anderen Fehler bekommen, als Sie (erfordert STARTTLS) wurden, fand ich auch Port 587 Ich hatte stattdessen 465. von verwenden

ich den Trick fand es in einer Rails-Plugin zum Laufen zu bringen, fand ich. (Agilewebdevelopment.com/plugins/net_smtp_tls_support)

wenn Sie EVAL 'diese Datei (es TLS-Unterstützung zum Standard Net fügt :: SMTP-Bibliothek):

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

dann laufen ‚Net :: SMTP. enable_tls() '

alles scheint gut zu funktionieren.

Hier ist mein Code:

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 

offensichtlich, i die oben genannte Datei in das gleiche Verzeichnis heruntergeladen und es smtp_tls.rb 'genannt

hoffe, das hilft!

+0

sieht aus wie es ein smtp_tls Juwel ist, das würde wahrscheinlich auch funktionieren ... – Jerceratops

+0

"Oben erwähnte Datei" URL ist kaputt. Irgendwelche Ideen, wo es hingehört? Hey! Gefunden: https://github.com/andreashappe/smtp_add_tls_support – JDS

2

Verbinden Sie sich mit smtp.gmail.com Port 465 nehme ich an? .

openssl s_client -connect smtp.gmail.com:587 

CONNECTED (00000003) 8298: Fehler: 140770FC: SSL-Routinen: SSL23_GET_SERVER_HELLO: unbekanntes Protokoll: s23_clnt.c: 601:

Der Fehler sieht bei Ihnen sehr ähnlich. Der folgende Befehl funktioniert:

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

Ich denke also, was passiert ist, dass Sie nicht STARTTLS-Unterstützung aktiviert haben. Ich bin nicht sicher, wie es in Ruby zu tun ist, was ich herausgefunden habe, ist, dass das Plugin action_mailer_tls dies durch das Patchen von Net :: SMTP ermöglicht. Seit Ruby 1.8.7 hat Net :: SMTP diese Unterstützung eingebaut.

Wenn Sie Ruby < 1.8.7 here verwenden, ist das Patch.

+0

Eigentlich scheint Gmail ein merkwürdiges Biest zu sein. Port 465 funktioniert einwandfrei, aber die Arbeit an Port 587 * und * STARTTLS verursacht Probleme. Letzteres ist die Kombination, die ich arbeiten muss. Irgendwelche Ideen? –

+0

Sie sagen also, dass SSL/STARTTLS nicht einmal auf 587 möglich ist? –

+0

Ich habe meinen Beitrag bearbeitet. STARTTLS Befehl nach HELO ohne SSL, um den Server anzufordern, es zu starten scheint zu funktionieren. Ich bin mir nicht sicher. –

46

Tatsächlich ist die unter Arbeiten für gmail ohne ein Plugin oder ein Juwel, zumindest mit Rubin 1.9.1p376, aber viel Glück zu finden Dokumentation, die Sie so sagen werde:

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 sieht aus wie ‚you @ domain.com '& YourDomain kann wahrscheinlich alles sein, was Sie wollen, aber ich benutze den tatsächlichen Domain-Namen.

+0

Es funktioniert super, vielen Dank ... – jasoares

+1

Oh mein Gott, danke. Die Dokumentation dazu ist schrecklich. Nettes Beispiel! :) –

+0

Ich bekomme "Stapel Ebene zu tief" Fehler mit diesem. Die erste E-Mail wird "ok" gesendet, und beim Versuch, eine andere E-Mail zu senden, habe ich diesen Fehler erhalten. Was könnte das Problem sein? Vielen Dank. –

1

Sie müssen auch zwei Zeilenumbruchzeichen zwischen dem Betreff und dem Nachrichtentext haben. Andernfalls wird nur der Betreff gesendet und der Nachrichtentext wird leer gelassen.

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