<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]