document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/pygment_trac.css" />');
document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/embed.css" />');
document.write('<div class="flowcoder_post flowcoder_clearfix">');
document.write('<div class="flowcoder_posttitle"><a href=\"http://flowcoder.com/160\">Mock Mail<\/a></div>');
document.write('<div class="flowcoder_postbody flowcoder_syntax"><div class=\"highlight\"><pre><span class=\"c1\">#!/usr/bin/env ruby<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># unknown source :(<\/span>\n\n<span class=\"nb\">require<\/span> <span class=\"s1\">&#39;socket&#39;<\/span>\n\n<span class=\"no\">DEBUG<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">false<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">data<\/span><span class=\"p\">(<\/span><span class=\"n\">sock<\/span><span class=\"p\">)<\/span>\n  <span class=\"n\">s<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">&quot;&quot;<\/span>\n\n  <span class=\"n\">sock<\/span><span class=\"o\">.<\/span><span class=\"n\">print<\/span> <span class=\"s2\">&quot;354 End data with &lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n  <span class=\"k\">while<\/span><span class=\"p\">(<\/span><span class=\"n\">line<\/span> <span class=\"o\">=<\/span> <span class=\"n\">sock<\/span><span class=\"o\">.<\/span><span class=\"n\">gets<\/span><span class=\"p\">)<\/span>\n    <span class=\"nb\">puts<\/span> <span class=\"n\">line<\/span> <span class=\"k\">if<\/span> <span class=\"no\">DEBUG<\/span>\n    <span class=\"k\">break<\/span> <span class=\"k\">if<\/span> <span class=\"n\">line<\/span> <span class=\"o\">=~<\/span> <span class=\"sr\">/^\\.\\r?\\n?$/<\/span>\n    <span class=\"n\">s<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">line<\/span>\n  <span class=\"k\">end<\/span>\n  <span class=\"n\">s<\/span>\n<span class=\"k\">end<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">session<\/span><span class=\"p\">(<\/span><span class=\"n\">sock<\/span><span class=\"p\">)<\/span>\n  <span class=\"n\">sock<\/span><span class=\"o\">.<\/span><span class=\"n\">print<\/span> <span class=\"s2\">&quot;220 localhost SMTP mockmail<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n  <span class=\"n\">from<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">nil<\/span>\n  <span class=\"n\">to<\/span> <span class=\"o\">=<\/span> <span class=\"o\">[]<\/span>\n  <span class=\"n\">body<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">nil<\/span>\n  <span class=\"k\">while<\/span><span class=\"p\">(<\/span><span class=\"n\">line<\/span> <span class=\"o\">=<\/span> <span class=\"n\">sock<\/span><span class=\"o\">.<\/span><span class=\"n\">gets<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">line<\/span><span class=\"o\">.<\/span><span class=\"n\">chomp!<\/span>\n    <span class=\"nb\">puts<\/span> <span class=\"n\">line<\/span> <span class=\"k\">if<\/span> <span class=\"no\">DEBUG<\/span>\n    <span class=\"n\">sock<\/span><span class=\"o\">.<\/span><span class=\"n\">print<\/span> <span class=\"k\">case<\/span> <span class=\"n\">line<\/span>\n      <span class=\"k\">when<\/span><span class=\"sr\"> /HELO/<\/span><span class=\"p\">:<\/span> <span class=\"s2\">&quot;250 localhost<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n      <span class=\"k\">when<\/span><span class=\"sr\"> /RSET/<\/span><span class=\"p\">:<\/span> <span class=\"s2\">&quot;250 Ok<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n      <span class=\"k\">when<\/span><span class=\"sr\"> /VRFY/<\/span><span class=\"p\">:<\/span><span class=\"sr\"><\/span>\n<span class=\"sr\">        /VRFY [^\\s]/<\/span> <span class=\"o\">=~<\/span> <span class=\"n\">line<\/span>\n        <span class=\"s2\">&quot;252 <\/span><span class=\"si\">#{<\/span><span class=\"vg\">$1<\/span><span class=\"si\">}<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n      <span class=\"k\">when<\/span><span class=\"sr\"> /MAIL FROM/<\/span><span class=\"p\">:<\/span><span class=\"sr\"><\/span>\n<span class=\"sr\">        /MAIL FROM:\\s*\\&lt;?([^\\s&lt;&gt;]+)\\&gt;?/<\/span> <span class=\"o\">=~<\/span> <span class=\"n\">line<\/span>\n        <span class=\"n\">from<\/span> <span class=\"o\">=<\/span> <span class=\"vg\">$1<\/span>\n        <span class=\"nb\">puts<\/span> <span class=\"n\">from<\/span> <span class=\"k\">if<\/span> <span class=\"no\">DEBUG<\/span>\n        <span class=\"s2\">&quot;250 Ok<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n      <span class=\"k\">when<\/span><span class=\"sr\"> /RCPT TO/<\/span><span class=\"p\">:<\/span><span class=\"sr\"><\/span>\n<span class=\"sr\">        /RCPT TO:\\s*\\&lt;?([^\\s\\r\\n\\t\\f&lt;&gt;]+)\\&gt;?/<\/span> <span class=\"o\">=~<\/span> <span class=\"n\">line<\/span>\n        <span class=\"n\">to<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"vg\">$1<\/span>\n        <span class=\"nb\">puts<\/span> <span class=\"n\">to<\/span> <span class=\"k\">if<\/span> <span class=\"no\">DEBUG<\/span>\n        <span class=\"s2\">&quot;250 Ok<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n      <span class=\"k\">when<\/span><span class=\"sr\"> /DATA/<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">body<\/span> <span class=\"o\">=<\/span> <span class=\"n\">data<\/span><span class=\"p\">(<\/span><span class=\"n\">sock<\/span><span class=\"p\">)<\/span>\n        <span class=\"s2\">&quot;250 Ok<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n      <span class=\"k\">when<\/span><span class=\"sr\"> /QUIT/<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">sock<\/span><span class=\"o\">.<\/span><span class=\"n\">print<\/span> <span class=\"s2\">&quot;221 Bye<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n        <span class=\"k\">break<\/span>\n      <span class=\"k\">else<\/span> <span class=\"s2\">&quot;500 Err<\/span><span class=\"se\">\\r\\n<\/span><span class=\"s2\">&quot;<\/span>\n    <span class=\"k\">end<\/span>\n  <span class=\"k\">end<\/span>\n  <span class=\"nb\">puts<\/span> <span class=\"s2\">&quot;from: <\/span><span class=\"si\">#{<\/span><span class=\"n\">from<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span>\n  <span class=\"nb\">puts<\/span> <span class=\"s2\">&quot;to: <\/span><span class=\"si\">#{<\/span><span class=\"n\">to<\/span><span class=\"o\">.<\/span><span class=\"n\">join<\/span> <span class=\"s1\">&#39;; &#39;<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span>\n  <span class=\"nb\">puts<\/span> <span class=\"s2\">&quot;---&quot;<\/span>\n  <span class=\"nb\">puts<\/span> <span class=\"n\">body<\/span>\n  <span class=\"nb\">puts<\/span> <span class=\"s2\">&quot;===&quot;<\/span>\n  <span class=\"nb\">open<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;mockmail.txt&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;a&quot;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"o\">|<\/span><span class=\"n\">f<\/span><span class=\"o\">|<\/span>\n    <span class=\"n\">f<\/span><span class=\"o\">.<\/span><span class=\"n\">puts<\/span> <span class=\"s2\">&quot;from: <\/span><span class=\"si\">#{<\/span><span class=\"n\">from<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span>\n    <span class=\"n\">f<\/span><span class=\"o\">.<\/span><span class=\"n\">puts<\/span> <span class=\"s2\">&quot;to: <\/span><span class=\"si\">#{<\/span><span class=\"n\">to<\/span><span class=\"o\">.<\/span><span class=\"n\">join<\/span> <span class=\"s1\">&#39;; &#39;<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span>\n    <span class=\"n\">f<\/span><span class=\"o\">.<\/span><span class=\"n\">puts<\/span> <span class=\"s2\">&quot;---&quot;<\/span>\n    <span class=\"n\">f<\/span><span class=\"o\">.<\/span><span class=\"n\">puts<\/span> <span class=\"n\">body<\/span>\n    <span class=\"n\">f<\/span><span class=\"o\">.<\/span><span class=\"n\">puts<\/span> <span class=\"s2\">&quot;===&quot;<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"n\">sock<\/span><span class=\"o\">.<\/span><span class=\"n\">close<\/span>\n<span class=\"k\">end<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">main<\/span>\n  <span class=\"k\">begin<\/span>\n    <span class=\"n\">server<\/span> <span class=\"o\">=<\/span> <span class=\"no\">TCPServer<\/span><span class=\"o\">.<\/span><span class=\"n\">new<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;localhost&#39;<\/span><span class=\"p\">,<\/span><span class=\"mi\">25<\/span><span class=\"p\">)<\/span>\n    <span class=\"no\">Thread<\/span><span class=\"o\">.<\/span><span class=\"n\">start<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kp\">loop<\/span> <span class=\"p\">{<\/span> <span class=\"nb\">sleep<\/span> <span class=\"mi\">1<\/span> <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"kp\">loop<\/span> <span class=\"k\">do<\/span> \n      <span class=\"no\">Thread<\/span><span class=\"o\">.<\/span><span class=\"n\">start<\/span><span class=\"p\">(<\/span><span class=\"n\">server<\/span><span class=\"o\">.<\/span><span class=\"n\">accept<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"o\">|<\/span><span class=\"n\">sock<\/span><span class=\"o\">|<\/span>\n        <span class=\"k\">begin<\/span>\n          <span class=\"n\">session<\/span><span class=\"p\">(<\/span><span class=\"n\">sock<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">rescue<\/span> <span class=\"no\">Exception<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"n\">e<\/span>\n          <span class=\"nb\">p<\/span> <span class=\"n\">e<\/span>\n        <span class=\"k\">end<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"k\">end<\/span>\n  <span class=\"k\">rescue<\/span> <span class=\"no\">Interrupt<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"n\">i<\/span>\n    <span class=\"nb\">puts<\/span> <span class=\"s2\">&quot;ending...&quot;<\/span>\n  <span class=\"k\">end<\/span>\n<span class=\"k\">end<\/span>\n\n<span class=\"n\">main<\/span>\n<\/pre><\/div>\n</div>');
document.write('<div class="flowcoder_bottombar flowcoder_clearfix">');
document.write('<div class="flowcoder_postedby">Posted by <a href=\"http://flowcoder.com/zh\">zh<\/a> on <a href=\"http://flowcoder.com/\">Flowcoder<\/a></div>');
document.write('<div class="flowcoder_viewraw"><a href=\"http://flowcoder.com/160.txt\">view raw<\/a></div>');
document.write('</div></div>');
