Отправить письмо из программы Ruby с TLS - PullRequest
7 голосов
/ 26 июня 2009

Я пытаюсь отправить электронное письмо из программы Ruby. SMTP-сервер - это сервер Exchange 2007, который требует от меня входа в систему для отправки электронной почты.

#!/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, 'from@server.com', 'to@server.com'
end

Когда я запускаю это, я получаю следующую ошибку.

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

Я не могу найти ничего в API Ruby для Net :: SMTP , ссылающемся на команду TLS или STARTTLS.

EDIT: Скачайте smtp-tls.rb, код не сильно изменится, но вот что мне нужно.

#!/usr/bin/ruby

require 'rubygems'
require 'net/smtp'
require 'smtp-tls'

msgstr = <<MESSAGE_END
From: me <me@test.com>
To: you <you@test.com>
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, 'me@test.com',  ['you@test.com']
end

РЕДАКТИРОВАТЬ: Работает с ruby ​​1.8.6

Ответы [ 4 ]

11 голосов
/ 24 ноября 2012

Не требуется самоцвет в Ruby 1.9.3

Вам не нужен гем для этого (по крайней мере, не для Gmail и Ruby 1.9.3), документация просто ужасна.

См. https://stackoverflow.com/a/3559598/4376

4 голосов
/ 04 ноября 2009

Я не смог заставить его работать, используя ваш обновленный пример. Но следующее сработало для меня.

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
1 голос
/ 27 июня 2009

Net :: SMTP, похоже, не поддерживает шифрование startTLS. Я нашел проект на github, в котором есть код для решения этой проблемы.

SMTP-TLS

0 голосов
/ 13 мая 2012

Это решение, использующее гем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...