2009-06-26 4 views
7

Ich versuche, eine E-Mail von einem Ruby-Programm zu senden. Der SMTP-Server ist ein Exchange 2007-Server, bei dem ich mich anmelden muss, um die E-Mail zu senden.E-Mail senden von Ruby-Programm mit 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 

Wenn ich dies ausführen bekomme ich den folgenden Fehler.

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

Ich kann nichts in der Ruby api for Net::SMTP Referenzierung TLS oder einem STARTTLS-Befehl finden.

EDIT: Download smtp-tls.rb, der Code ändert sich nicht viel, aber hier ist, was ich arbeiten musste.

#!/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: Funktioniert mit Ruby 1.8.6

+0

Die akzeptierte Antwort nicht korrekt ist (oder zumindest nicht mehr). –

Antwort

1

Net :: SMTP sieht nicht so aus, wie es StartTLS Verschlüsselung unterstützt. Ich habe jedoch ein Projekt auf GitHub gefunden, das Code für den Umgang damit hat.

smtp-tls

+1

Das ist nicht korrekt - siehe meine Antwort unten. –

4

Ich konnte es nicht funktioniert Ihr aktualisiertes Beispiel. Aber folgendes funktionierte für mich.

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

Welche Version von Ruby verwenden Sie? – Mark

+0

Ich benutze Ruby 1.8.6 – brodie31k

+0

Ich bin in 1.8.7 und bekomme eine "unbekannte Methode 'enable_starttls Fehler". Ich habe smtp_tls und net/smtp benötigt. Ein mögliches Problem ist, dass ich in meiner Konfiguration 'ActionMailer :: Base.delivery_method =: smtp' habe. Sollte das vielleicht auf etwas anderes gesetzt werden, zB smtp_tls oder sowas? –

0

Dies ist eine Lösung, die das tlsmail Juwel mit:

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

Dies war die gewinnende Formel für mich mit Ruby 1.9.3, aber ich habe eine Änderung vorgenommen: Ich habe Port 587 statt Port angegeben 25. –

9

Kein Juwel in Ruby erforderlich 1.9.3

Sie haben nicht ein Juwel brauchen, dies zu tun (zumindest nicht für Gmail und Ruby 1.9.3) ist die Dokumentation einfach schrecklich.

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