2009-06-26 5 views
7

J'essaie d'envoyer un e-mail à partir d'un programme Ruby. Le serveur smtp est un serveur Exchange 2007 qui nécessite que je me connecte pour envoyer l'email.Envoyer un e-mail à partir du programme Ruby avec 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 

Lorsque j'exécute ceci, j'obtiens l'erreur suivante.

/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' 

Je ne peux pas trouver quoi que ce soit dans les Ruby api for Net::SMTP faisant référence TLS ou une commande STARTTLS.

EDIT: Télécharger smtp-tls.rb, le code ne change pas beaucoup mais voici ce que je dois travailler.

#!/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: Fonctionne avec Ruby 1.8.6

+0

La réponse acceptée n'est pas correcte (ou du moins, n'est plus). –

Répondre

1

Net :: SMTP ne ressemble pas à elle prend en charge le cryptage StartTLS. J'ai trouvé un projet sur github qui a du code pour gérer ça.

smtp-tls

+1

Ce n'est pas correct - voir ma réponse ci-dessous. –

4

je ne pouvais pas le faire fonctionner en utilisant votre exemple mis à jour. Mais ce qui suit a fonctionné pour moi.

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

Quelle version de Ruby utilisez-vous? – Mark

+0

J'utilise ruby ​​1.8.6 – brodie31k

+0

Je suis en 1.8.7 et j'obtiens une "erreur de méthode inconnue 'enable_starttls'". J'ai demandé smtp_tls et net/smtp. Un problème possible est que dans ma configuration, j'ai 'ActionMailer :: Base.delivery_method =: smtp'. Cela devrait-il être réglé sur autre chose, par exemple smtp_tls ou quelque chose? –

0

C'est une solution utilisant la gemme 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

C'était la formule gagnante pour moi avec Ruby 1.9.3, mais j'ai fait un changement: J'ai spécifié le port 587 plutôt que le port 25 –

9

Aucun bijou requis Ruby 1.9.3

Vous n'avez pas besoin d'un petit bijou de le faire (au moins, pas pour Gmail et Ruby 1.9.3), la documentation est tout simplement terrible.

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

Questions connexes