Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Run an SMTP service within Sinatra-Rscript (See related posts)

The following Sinatra-Rscript RSF job runs an SMTP locally on port 1234.

<job id='load-service'>
  <script>
    <![CDATA[

    require 'gserver'

    class SMTPServer < GServer
      def serve(io)
        @data_mode = false
        puts "Connected"
        io.print "220 hello\r\n"
        loop do
          if IO.select([io], nil, nil, 0.1)
            data = io.readpartial(4096)
            puts ">>" + data
            ok, op = process_line(data)
            break unless ok
            io.print op
          end
          break if io.closed?
        end
        io.print "221 bye\r\n"
        io.close
      end

      def process_line(line)
        if (line =~ /^(HELO|EHLO)/)
          return true, "220 and..?\r\n"
        end
        if (line =~ /^QUIT/)
          return false, "bye\r\n"
        end
        if (line =~ /^MAIL FROM\:/)
          return true, "220 OK\r\n"
        end
        if (line =~ /^RCPT TO\:/)
          return true, "220 OK\r\n"
        end
        if (line =~ /^DATA/)
          @data_mode = true
          return true, "354 Enter message, ending with \".\" on a line by itself\r\n"
        end
        if (@data_mode) && (line.chomp =~ /^.$/)
          @data_mode = false
          return true, "220 OK\r\n"
        end
        if @data_mode
          puts line 
          return true, ""
        else
          return true, "500 ERROR\r\n"
        end
      end
    end

    @@services['smtp-service'] = SMTPServer.new(1234)

    "SMTP service loaded"

    ]]>
  </script>
</job>
<job id='start'>
  <script>
    <![CDATA[

    @@services['smtp-service'].start
    "SMTP service started"

    ]]>
  </script>
</job>
<job id='stop'>
  <script>
    <![CDATA[

    @@services['smtp-service'].stop
    "SMTP-server stopped"

    ]]>
  </script>
</job>
<job id='remove'>
  <script>
    <![CDATA[

    Object.send(:remove_const, :SMTPServer)
    @@services.delete('smtp-service')
    "SMTP service removed"

    ]]>
  </script>
</job>


Tested (http://localhost:4567) Observed
------------------------------- ---------
/do/smtp-server/load-service SMTP service loaded
/do/smtp-server/start SMTP service started
[using telnet I logged in to the mail service on port 1234]

/do/smtp-server/stop SMTP-server stop
[using telnet I attemted to to log in to the mail service on port 1234]

/do/smtp-server/remove SMTP service removed


Resources:
- Ultra-simplistic Ruby SMTP server [dzone.com]

You need to create an account or log in to post comments to this site.


Click here to browse all 7207 code snippets

Related Posts