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

匿名 (未验证) 提交于 2019-12-03 02:52:02

问题:

All I want is to send emails from my ruby scripts, over SMTP using SSL.

I only find examples of doing it from Rails, or for Gmail with TLS.

I found people talking about SMTPS support with ruby 1.8.5, but the libdoc doesn't mention it.

Anyone with an example of sending mail over SMTP with SSL, on port 465?

ruby -v ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]

回答1:

I solve this issue with this configuration below :

config.action_mailer.perform_deliveries = true config.action_mailer.raise_delivery_errors = false config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = {     :address              => 'mail.domain.com',     :port                 => '465',     :domain               => 'yourdomain.com',     :user_name            => 'email@yourdomain.com',     :password             => 'yourpassword',     :authentication       => :login,     :ssl                  => true,     :openssl_verify_mode  => 'none' #Use this because ssl is activated but we have no certificate installed. So clients need to confirm to use the untrusted url. }

It works very well for me.



回答2:

How about pony ?
gem install pony.
http://github.com/adamwiggins/pony/tree/master
or I did not understand your question ?

I hope it help you.
Thanks
tknv/



回答3:

You probably already know about the Net::SMTP standard library

Regarding the SSL part, which doesn't seem to be supported out of the box, I found a couple of possible pointers:



回答4:

The only interesting thing I've heard of in programmatic email recently is Lamson: http://lamsonproject.org/

It's Python, not Ruby, but you can call Python from Ruby if you want to (here's one way: http://www.goto.info.waseda.ac.jp/~fukusima/ruby/python-e.html)



回答5:

You could use a third party open source command line program like mailsend (http://www.muquit.com/muquit/software/mailsend/mailsend.html) to do your dirty work for you. Just pipe some output to it in the format it expects.



回答6:

If you have to use SSL instead of TLS you can monkey-patch Net::SMTP like this:

require "openssl" require "net/smtp"  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 = false, &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 = false ) # :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      if VERSION == '1.8.6'       check_auth_args user, secret, authtype if user or secret     elsif VERSION == '1.8.7'       check_auth_args user, secret     end      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      if VERSION == '1.8.6'       check_auth_args user, secret, authtype if user or secret     elsif VERSION == '1.8.7'       check_auth_args user, secret     end      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

See http://github.com/collectiveidea/action_mailer_optional_tls/blob/master/lib/smtp_tls.rb



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!