ITEMS BY CATEGORY
aphorism(2)
biz(11) in english(6) indian food(16) kaneko(17) korea(21) life and love(23) misc(81) salsa(3) soc(71) tech(48) things(22) travel(16)
Topics With Recent Comments
Archives
February 2008 (1)
December 2007 (1) November 2007 (1) October 2007 (2) September 2007 (3) August 2007 (2) June 2007 (2) May 2006 (1) March 2006 (1) February 2006 (3) December 2005 (1) November 2005 (2) October 2005 (1) August 2005 (8) July 2005 (6) June 2005 (8) May 2005 (5) April 2005 (10) March 2005 (9) February 2005 (5) January 2005 (8) December 2004 (6) November 2004 (5) October 2004 (7) September 2004 (5) August 2004 (3) July 2004 (6) June 2004 (3) May 2004 (19) April 2004 (10) March 2004 (20) February 2004 (7) January 2004 (6) December 2003 (6) November 2003 (7) October 2003 (7) September 2003 (5) August 2003 (8) July 2003 (6) June 2003 (12) May 2003 (12) April 2003 (15) March 2003 (14) February 2003 (11) January 2003 (12) December 2002 (14) November 2002 (15) October 2002 (7)
Recent Entries
精神科医薬とサイエントロジー
Asiajin - アジアのITに関する英語ブログ Rozerem - 全く新しい睡眠薬 A380ようやく就航 Animate! 福岡空港の増設・移転 Techcrunch20行きます mockmail.rb Embassy Suites Rails初心者講習会
Search
A-vertisement
|
September 01, 2007mockmail.rbRubyでモックのメールサーバーを作りました。SMTPを25番ポートで待ち受けして、送られたメールの内容をファイルに書き出します。Rails Appをローカルでテストしてるときなどに使えると思います。 EHLOなどは全く対応してません。SMTPの実装はみてのとおり極めていいかげんです。クライアントはrubyのnet/smtpと、Outlook Expressしかテストしてません。もしうまく動かなかったらパッチを送ってください。 気に入ったらコメントつけてくださいね:)
require 'socket'
DEBUG = false
def data(sock)
s = ""
sock.print "354 End data with <CR><LF>.<CR><LF>\r\n"
while(line = sock.gets)
puts line if DEBUG
break if line =~ /^\.\r?\n?$/
s += line
end
s
end
def session(sock)
sock.print "220 localhost SMTP mockmail\r\n"
from = nil
to = []
body = nil
while(line = sock.gets)
line.chomp!
puts line if DEBUG
sock.print case line
when /HELO/: "250 localhost\r\n"
when /RSET/: "250 Ok\r\n"
when /VRFY/:
/VRFY [^\s]/ =~ line
"252 #{$1}\r\n"
when /MAIL FROM/:
/MAIL FROM:\s*\<?([^\s<>]+)\>?/ =~ line
from = $1
puts from if DEBUG
"250 Ok\r\n"
when /RCPT TO/:
/RCPT TO:\s*\<?([^\s\r\n\t\f<>]+)\>?/ =~ line
to << $1
puts to if DEBUG
"250 Ok\r\n"
when /DATA/:
body = data(sock)
"250 Ok\r\n"
when /QUIT/:
sock.print "221 Bye\r\n"
break
else "500 Err\r\n"
end
end
puts "from: #{from}"
puts "to: #{to.join '; '}"
puts "---"
puts body
puts "==="
open("mockmail.txt", "a") { |f|
f.puts "from: #{from}"
f.puts "to: #{to.join '; '}"
f.puts "---"
f.puts body
f.puts "==="
}
sock.close
end
def main
begin
server = TCPServer.new('localhost',25)
Thread.start {
loop { sleep 1 }
}
loop do
Thread.start(server.accept) { |sock|
begin
session(sock)
rescue Exception => e
p e
end
}
end
rescue Interrupt => i
puts "ending..."
end
end
main
Posted by arai at September 1, 2007 02:05 AM
Comments
Post a comment
|