Skip to content

Instantly share code, notes, and snippets.

@janv
Created March 17, 2010 11:19
Show Gist options
  • Save janv/335135 to your computer and use it in GitHub Desktop.
Save janv/335135 to your computer and use it in GitHub Desktop.
A dummy mailserver implemented in Ruby, running on the commandline. It just spits out whatever it receives.
require 'socket'
class SMTPSession
@@timeout = 25
def initialize (session)
@session = session
puts "## SESSION STARTED ##"
end
def write (s)
@session.write s + "\r\n"
puts s
end
def read
start_timer
line = @session.gets
stop_timer
puts " " + line
return line
end
def close
@session.close
puts "## SESSION CLOSED ##"
end
private
def start_timer
stop_timer
@timer = Thread.new do
sleep @@timeout
close
puts "## TIMEOUT ##"
end
end
def stop_timer
@timer.kill if @timer.is_a? Thread
end
end
server = TCPServer.new 'localhost', 25
class <<server
def accept_interruptable
ts = nil
Thread.new { ts = self.accept }
while true
return ts if ts; sleep 1
end
end
end
puts "## Dummymail started ##"
while true
puts "## WAITING FOR CONNECTION ##"
session = SMTPSession.new server.accept_interruptable
begin
session.write "220 Dummymail ready"
while line = session.read
session.write "250 OK"
break if line =~ /DATA/
end
session.write "354 Start mail input; end with <CRLF>.<CRLF>"
while line = session.read
break if ".\r\n" == line
end
session.write "250 OK"
while line = session.read
session.write "250 OK"
break if line =~ /QUIT/
end
#session.write "221 thanks for coming\r\n"
session.close
puts "\n\n\n"
rescue IOError
next
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment