2009-07-26 17 views
22

Est-ce que quelqu'un a des informations de qualité (et à jour) concernant l'envoi de courrier via Gmail en utilisant Ruby's Net :: SMTP? J'ai vu plusieurs exemples - la plupart datant de 2007 à la mi-2008 et aucun d'eux ne fonctionne pour moi. J'ai besoin de plus d'exemples actuels qui utilisent la version 1.8.7 la plus récente. J'apprécierais aussi que la documentation ne couvre pas seulement des exemples simples que personne n'utilise vraiment.(Ruby) Obtenir Net :: SMTP fonctionne avec Gmail ...?

Actuellement, je reçois une erreur:

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

Je ne suis pas terriblement familier avec SSL en ce qui concerne le protocole SMTP, donc tout cela est perdu sur moi. Malheureusement, la documentation Net :: SMTP ne couvre que les bases et ne fournit pas non plus une liste complète des divers contextes OpenSSL :: SSL potentiels, donc je ne peux pas en essayer plusieurs.

Quoi qu'il en soit, si quelqu'un a des informations de qualité pour que cela fonctionne avec Gmail, il serait très apprécié.

Meilleur.

Répondre

10

En fait, je viens de recevoir ce travail. A écrit un script rapide pour le tester.

Je recevais une autre erreur que vous (ce qui nécessite STARTTLS), je trouve aussi que je devais utiliser le port 587 au lieu de 465.

J'ai trouvé le truc pour le faire fonctionner dans un plugin Rails j'ai trouvé. (Agilewebdevelopment.com/plugins/net_smtp_tls_support)

si vous eval ce fichier (il ajoute tls soutien au net standard :: bibliothèque SMTP):

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

puis exécutez Net :: SMTP. enable_tls() '

Tout semble fonctionner correctement.

Voici mon 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 

évidemment, je l'ai téléchargé le fichier mentionné ci-dessus dans le même répertoire et l'a nommé 'smtp_tls.rb'

Hope this helps!

+0

ressemble à un gem smtp_tls qui fonctionnerait probablement aussi ... – Jerceratops

+0

L'URL "ci-dessus" est cassée. Des idées où ça va? Hey! Trouvé: https://github.com/andreashappe/smtp_add_tls_support – JDS

2

Vous vous connectez au port smtp.gmail.com 465 Je suppose? .

openssl s_client -connect smtp.gmail.com:587 

CONNECTE (00000003) 8298: Erreur: 140770FC: routines SSL: SSL23_GET_SERVER_HELLO: protocole inconnu: s23_clnt.c: 601:

L'erreur semble très semblable à la vôtre. La commande suivante fonctionne:

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

Je pense donc que le support STARTTLS n'est pas activé. Je ne suis pas sûr de savoir comment le faire dans Ruby acheter ce que j'ai découvert est que le plugin action_mailer_tls permet cela en patchant Net :: SMTP. À partir de Ruby 1.8.7, Net :: SMTP a ce support intégré.

Si vous utilisez Ruby < 1.8.7 here est le correctif.

+0

En fait, Gmail semble être une bête étrange. Port 465 fonctionne très bien, mais la nécessité de travailler sur le port 587 * et * utiliser STARTTLS provoque des problèmes. Ce dernier est la combinaison dont j'ai besoin pour travailler. Des idées? –

+0

Donc vous dites que SSL/STARTTLS n'est même pas possible sur 587? –

+0

J'ai modifié mon message. La commande STARTTLS après HELO sans SSL pour demander au serveur de démarrer semble fonctionner. Je ne suis pas certain. –

46

En fait, les travaux ci-dessous pour gmail sans plugin ou un bijou, au moins avec Ruby 1.9.1p376, mais une bonne documentation de trouver la chance qui vous le dire:

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 ressemble « vous @ domain.com '& YourDomain peut probablement être quelque chose que vous aimez, mais j'utilise le nom de domaine réel.

+0

Cela fonctionne très bien, merci beaucoup ... – jasoares

+1

Oh mon Dieu, merci. La documentation sur ceci est terrible. Bel exemple! :) –

+0

je reçois l'erreur "niveau de pile trop profond" avec ceci. le premier email est envoyé "ok", puis en essayant d'envoyer un autre email, j'ai eu cette erreur. quel pourrait être le problème? Merci. –

1

Vous devez également avoir deux caractères de nouvelle ligne entre le sujet et le corps du message. Sinon, seul le sujet sera transmis et le corps du message sera laissé vide.

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