2009-06-26 27 views
7

Tôi đang cố gửi email từ chương trình Ruby. Máy chủ smtp là một máy chủ Exchange 2007 yêu cầu tôi đăng nhập để gửi email.Gửi email từ chương trình Ruby với 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 

Khi tôi chạy điều này, tôi nhận được lỗi sau.

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

Tôi không thể tìm thấy bất kỳ điều gì trong số Ruby api for Net::SMTP tham chiếu lệnh TLS hoặc STARTTLS.

EDIT: Tải xuống smtp-tls.rb, mã không thay đổi nhiều nhưng dưới đây là những gì tôi phải làm việc.

#!/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: Làm việc với ruby ​​1.8.6

+0

Câu trả lời được chấp nhận không chính xác (hoặc ít nhất, không còn nữa). –

Trả lời

1

Net :: SMTP không giống như nó hỗ trợ mã hóa STARTTLS. Tôi đã tìm thấy một dự án trên github có mã để đối phó với điều này, mặc dù.

smtp-tls

+1

Điều này không chính xác - hãy xem câu trả lời của tôi bên dưới. –

4

tôi không thể có được nó làm việc sử dụng ví dụ cập nhật của bạn. Nhưng sau đây đã làm việc cho tôi.

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

Bạn đang sử dụng phiên bản Ruby nào? – Mark

+0

Tôi đang sử dụng ruby ​​1.8.6 – brodie31k

+0

Tôi đang ở mức 1.8.7 và nhận được lỗi "phương pháp không xác định 'enable_starttls'. Tôi đã yêu cầu smtp_tls và net/smtp. Một vấn đề có thể là trong cấu hình của tôi tôi có 'ActionMailer :: Base.delivery_method =: smtp'. Điều này có lẽ nên được đặt thành một cái gì đó khác ví dụ như smtp_tls hay cái gì đó? –

0

Đây là một giải pháp sử dụng đá quý 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

Đây là công thức chiến thắng cho tôi với Ruby 1.9.3, nhưng tôi đã thực hiện một thay đổi: Tôi đã chỉ định cổng 587 thay vì cổng 25. –

9

Không yêu cầu trong gói Ruby 1.9.3

Bạn không cần một viên ngọc để làm điều này (ít nhất, không cho Gmail và Ruby 1.9.3), tài liệu chỉ là khủng khiếp.

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

Các vấn đề liên quan