2010-11-30 5 views
5

ich erfolgreich gesendet zu einem Remote-Server über Port deren Port 25 (nicht abgesichert) mit diesem Skript E-Mail haben zu erreichen:Ruby-Post, wie SSL E-Mail

require 'rubygems' 
require 'mail' 

options = { :address    => "mail.domain.com", 
      :port     => 25, 
      :domain    => 'mail.domain.com', 
      :user_name   => '[email protected]', 
      :password    => 'topsecret', 
      :authentication  => 'login', 
      :enable_starttls_auto => true } 
Mail.defaults do 
    delivery_method :smtp, options 
end 

mail = Mail.new do 
     from '[email protected]' 
     to '[email protected]' 
    subject 'This is a test email' 
     body File.read('body.txt') 
end 

puts mail.to_s 
mail.deliver! 

Was muss ich jetzt tun, ist ihre Verwendung SSL-Port 466. Wenn ich es versuche, erhalte ich die normale Ausgabe die Meldung Detaillierung, dann hält es für ca. 2 Minuten und spuckt diese:

/usr/local/rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/timeout.rb:60:in `rbuf_fill': execution expired (Timeout::Error) 
     from /usr/local/rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill' 
     from /usr/local/rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/net/protocol.rb:116:in `readuntil' 
     from /usr/local/rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/net/protocol.rb:126:in `readline' 
     from /usr/local/rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/net/smtp.rb:911:in `recv_response' 
     from /usr/local/rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/net/smtp.rb:554:in `do_start' 
     from /usr/local/rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/net/smtp.rb:921:in `critical' 
     from /usr/local/rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/net/smtp.rb:554:in `do_start' 
     from /usr/local/rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/net/smtp.rb:525:in `start' 
     from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/mail-2.2.10/lib/mail/network/delivery_methods/smtp.rb:127:in `deliver!' 
     from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/mail-2.2.10/lib/mail/message.rb:243:in `deliver!' 
     from testmail.rb:30 

ich denke, das liegt daran, dass es nicht einmal die SSL-Authentifizierung Prozess kann beginnen . Wie mache ich es?

Antwort

4

Hmm Lesen des Netzwerks/delivery_methods/smtp.rb, es sieht nicht so aus, als ob es Direct SSL unterstützt. TLS ist nicht dasselbe, da die Verbindung mit Nur-Text beginnt und dann mit dem Befehl starttls zu SSL wechselt. Kannst du einfach startls auf Port 587 verwenden?

Ziehen Sie meinen Kommentar nach oben.

siehe

How to send mail with ruby over smtp with ssl (not with rails, no TLS for gmail)

Welche, dass Sie Net können Affen-Patch schlägt :: SMTP, es zu tun ..

Ok irgendwie das Problem gefunden und kann um es flicken, aber so weit diese Lösung eklig ist .. aber es funktioniert :)

#!/usr/bin/env ruby 

require 'rubygems' 
require "openssl" 
require "net/smtp" 
require "mail" 

Net::SMTP.class_eval do 

    def self.start(address, port = nil, 
        helo = 'localhost.localdomain', 
        user = nil, secret = nil, authtype = nil, use_tls = false, 
        use_ssl = true, &block) # :yield: smtp 
    new(address, port).start(helo, user, secret, authtype, use_tls, use_ssl, &block) 
    end 

    def start(helo = 'localhost.localdomain', 
      user = nil, secret = nil, authtype = nil, use_tls = false, use_ssl = true) # :yield: smtp 
    start_method = use_tls ? :do_tls_start : use_ssl ? :do_ssl_start : :do_start 
    if block_given? 
     begin 
     send start_method, helo, user, secret, authtype 
     return yield(self) 
     ensure 
     do_finish 
     end 
    else 
     send start_method, helo, user, secret, authtype 
     return self 
    end 
    end 

    private 

    def do_tls_start(helodomain, user, secret, authtype) 
    raise IOError, 'SMTP session already started' if @started 

    check_auth_args user, secret 

    sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) } 
    @socket = Net::InternetMessageIO.new(sock) 
    @socket.read_timeout = 60 #@read_timeout 
    @socket.debug_output = STDERR #@debug_output 

    check_response(critical { recv_response() }) 
    do_helo(helodomain) 

    raise 'openssl library not installed' unless defined?(OpenSSL) 
    starttls 
    ssl = OpenSSL::SSL::SSLSocket.new(sock) 
    ssl.sync_close = true 
    ssl.connect 
    @socket = Net::InternetMessageIO.new(ssl) 
    @socket.read_timeout = 60 #@read_timeout 
    @socket.debug_output = STDERR #@debug_output 
    do_helo(helodomain) 

    authenticate user, secret, authtype if user 
    @started = true 
    ensure 
    unless @started 
     # authentication failed, cancel connection. 
     @socket.close if not @started and @socket and not @socket.closed? 
     @socket = nil 
    end 
    end 

    def do_ssl_start(helodomain, user, secret, authtype) 
    raise IOError, 'SMTP session already started' if @started 

    check_auth_args user, secret 

    sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) } 
    raise 'openssl library not installed' unless defined?(OpenSSL) 
    ssl = OpenSSL::SSL::SSLSocket.new(sock) 
    ssl.sync_close = true 
    ssl.connect 
    @socket = Net::InternetMessageIO.new(ssl) 
    @socket.read_timeout = 60 #@read_timeout 
    @socket.debug_output = STDERR #@debug_output 

    check_response(critical { recv_response() }) 
    do_helo(helodomain) 

    do_helo(helodomain) 

    authenticate user, secret, authtype if user 
    @started = true 
    ensure 
    unless @started 
     # authentication failed, cancel connection. 
     @socket.close if not @started and @socket and not @socket.closed? 
     @socket = nil 
    end 
    end 

    def do_helo(helodomain) 
    begin 
     if @esmtp 
     ehlo helodomain 
     else 
     helo helodomain 
     end 
    rescue Net::ProtocolError 
     if @esmtp 
     @esmtp = false 
     @error_occured = false 
     retry 
     end 
     raise 
    end 
    end 

    def starttls 
    getok('STARTTLS') 
    end 

    def quit 
    begin 
     getok('QUIT') 
    rescue EOFError, OpenSSL::SSL::SSLError 
    end 
    end 
end 

options = { 
    :address    => "mail.domain.net", 
    :port     => 466, 
    :domain    => 'mail.domain.net', 
    :user_name   => '[email protected]', 
    :password    => 'Secret!', 
    :authentication  => 'login', 
    :use_ssl => true } 

Mail.defaults do 
    delivery_method :smtp, options 
end 

mail = Mail.new do 
    from '[email protected]' 
    to '[email protected]' 
    subject 'This is a test email' 
    body File.read('body.txt') 
end 

puts mail.to_s 
mail.deliver! 

es aus irgendeinem Grunde nicht die use_ssl im orig Affen Patch nicht in machen, und Paar, das mit VE RSION ist in Net :: SMTP nicht definiert. Also änderte ich das, und erzwang use_ssl, um E-Mail zu senden.

+0

Wir haben keine Kontrolle über die 466-Port-Zuweisung und Port 587 ist nicht verfügbar –

+0

Hmm scheint nicht, dass Net :: SMTP SSL out of the box unterstützt, die Mail verwendet. Schaue hier nach. http://stackoverflow.com/questions/708858/how-to-send-mail-with-ruby-over-smtp-with-ssl-not-with-rails-no-tls-for-gmail sieht aus wie Sie Affe können Patch Net :: SMTP zu arbeiten .. – Doon

+0

Ich habe das versucht, und es produziert leider genau das gleiche Ergebnis. –

0

Meinst du Port 465 zu verwenden? Das ist der Standard-Fallback-Port, nicht 466. Wahrscheinlich wird die Verbindung zum falschen Port unterbrochen.

+0

Nein, der Port wurde von unserem Dienstanbieter zugewiesen. Jemand anderes hat das auch vorgeschlagen, also haben wir es auch versucht, aber ohne Erfolg. –

+0

Was passiert, wenn Sie "telnet mail.myserver.com 466"? Hast du überhaupt eine Verbindung? –

+0

nein. Auch 465 versucht. Sagt nur "Verbindung mit mail.safetysend.com ..." –