6 12, 2004

ÔÚRubyÖÐÀûÓÃSMTPºÍPOP3ÊÕ·¢Óʼþ

Èç¹ûÄãÏëÕÒÒ»¸ö¼òµ¥ÎÄÑŵķ½·¨À´±àÐ´ÍøÂçÓ¦ÓóÌÐò£¬ÄÇôÄãÓ¦¸Ã¿´¿´Ruby£¨¹ØÓÚRubyµÄ¼ò½é¿ÉÒÔ¿´¿´¡°A Ruby Refresher¡±£©¡£Ruby¼òµ¥£¨ÏñPython£©£¬ÍêÈ«µÄÃæÏò¶ÔÏó£¨Smalltalk£©£¬Ç¿´ó£¨ÏñPerl£©¡£ÁíÍ⣬RubyµÄÒ»¸öÏÔÖøµÄÌØµãÊÇÊʺϱàÐ´ÍøÂçÓ¦ÓóÌÐò¡£Ê¹ÓÃRubyÌṩµÄ¿âº¯ÊýºÍÄÚ½¨µÄÍøÂçÖ§³Ö£¬ÄãÄÜÇáËɵıàÐ´ÍøÂçÓ¦ÓóÌÐò£¨±ÈÈçemail¿Í»§¶Ë£¬SOAP·þÎñÆ÷£¬·Ö²¼Ê½´¦ÀíµÈ£©£¬²¢ÇÒά»¤ºÍÀ©Õ¹Ò²ºÜÈÝÒס£ÎÒÃÇÀ´¿´¿´Ruby£¬Ñ§Ï°Ò»ÏÂRuby fansÒѾ­ÖªµÀµÄ¶«Î÷£º Ruby really connects.

1¡£Í¨¹ýSMTP·¢ËÍEmail

ÿÐÇÆÚHolden Glova, Pat Eyler, ºÍ Phil Thomson¶¼»áÏòRuby Garden ÍøÕ¾£¨http://www.rubygarden.org£©Ìá½»Ò»¸öRuby Weekly News (RWN)ÎÄÕ¡£Ò»¸öRuby½Å±¾Í¨¹ýemail½ÓÊÕÕâÆªÎÄÕ£¬½«Ëü´ÓÔ­À´µÄxml¸ñʽת»»ÎªHTMLºÍ´¿Îı¾¸ñʽ£¬È»ºó½«HTML¸ñʽµÄ·¢±íµ½ÍøÕ¾£¬È»ºó½«´¿Îı¾¸ñʽµÄÎÄÕ·¢µ½ÓʼþÁÐ±í¡£Èç¹ûÕâÖмä³öÏÖʲôÎÊÌ⣨±ÈÈçxmlÎĵµ½á¹¹²»¶ÔµÈ£©£¬Õâ¸ö½Å±¾½«Ïò·¢ËÍÕß·¢ËÍÒ»·â°üº¬´íÎóÐÅÏ¢µÄemail¡£

Õâ¸ö½Å±¾ÓÃNet::SMTP (Simple Mail Transfer Protocol) ¿â·¢ËÍemail¡£Çåµ¥ 1 ÊÇÕâ¸ö½Å±¾ÖÐÓÃÀ´·¢ËÍemailµÄ·½·¨£¬Õâ¸ö·½·¨½ÓÊÕ3¸ö²ÎÊý£ºemailµØÖ·£¬±êÌ⣬ºÍÐżþÄÚÈÝ¡£ÒòΪÕâ¸ö³ÌÐòÒªÔÚ¸÷ÖÖ¿ØÖÆ»·¾³ÏÂʹÓã¬ËùÒÔһЩÀàËÆ·¢¼þÈË£¬×ª·¢emailµÄÖ÷»úµÈÊôÐÔ¶¼¶¨ÒåΪȫ¾Ö³£Á¿£¬¶ø²»ÊDzÎÊý¡£

Çåµ¥ 1: ͨ¹ýSMTP·¢ËÍÓʼþ

 1   FROM_ADDRESS = "dave@pragprog.com"
 2   SMTP_HOST = "localhost"
 3
 4   def reply(to, subject, msg)
 5     mail = "To: #{to}rn" +
 6            "From: #{FROM_ADDRESS}rn" +
 7            "Subject: #{subject}rn" +
 8            "rn" +
 9            msg
10
11     Net::SMTP.start(SMTP_HOST) do |smtp|
12       smtp.send_mail(mail, FROM_ADDRESS,
13         [ to, 'rurl_archive@zip.local.pragprog.com' ])
14     end
15   end

Ò»¸öemailÏûÏ¢ÓÉÁ½²¿·Ö×é³É£ºÐŷ⣨envelope£©ºÍÄÚÈÝ£¨content£©¡£ÐÅ·â¸æËßSMTP´úÀí£¨sendmail»òÕßpostfix£©ÈçºÎͶµÝÏûÏ¢¡£ÄÚÈݰüÀ¨Äܱ»ÈËÃÇÔĶÁµÄÏûÏ¢±¾ÉíºÍһЩ±êÌ⣨header£©£¨±ÈÈçÏûÏ¢subject£©£¬¶øÒ»Ð©ÄÚÈÝÖеÄheader¿ÉÄܺÍenvelopeÖеÄÖØ¸´£¨±ÈÈç"To"µØÖ·£©£¬ÕâÐ©ÖØ¸´µÄheaderÓÃÀ´ÏÔʾʱºòʹÓ㬶øenvelopeÖеÄÔòÊÇÓÃÀ´Í¶µÝʹÓᣣ¨ÕâÒ²ÊÇΪʲôÄã»áÊÕµ½"To"µØÖ·²»ÊÇÄãµÄÀ¬»øÓʼþ£©

Äã¿ÉÒÔ¿´µ½reply·½·¨ÒѾ­·ÖÀëÁËenvelopºÍcontent£¬µÚ5Ðе½µÚ9ÐÐÉú³ÉÁËcontent£¬Ëü°üÀ¨3¸öheader£ºTo£¬From£¬Subject£¬È»ºóÔÚÒ»¸ö¿ÕÐкóÃæ¼ÓÉÏÁËÏûÏ¢ÄÚÈÝ¡£×¢ÒâÓʼþÖ÷ÌåÄÚÈÝ֮ǰµÄheaderÖ®ºó±ØÐëÓÐÒ»¸ö»Ø³µ»»ÐУ¬¼´"r"ºÍ"n"µÄ×éºÏ¡£

·½·¨Net::SMTP.startÀ´ºÍMTA( mail transfer agent)½¨Á¢Á¬½Ó£¬Õâ¸ö·½·¨µÄÒ»¸ö²ÎÊýÊÇÔËÐÐMTAµÄ»úÆ÷Ãû³Æ£¬²¢ÇÒʹÓÃÁËĬÈ϶˿ڣ¨25£©£¬Õâ¸ö·½·¨·µ»ØÒ»¸ö¶ÔÏóÓÃÀ´ºÍMTA½»»¥£¬²¢ÇÒ°ÑÕâ¸ö¶ÔÏó×÷Ϊ²ÎÊý´«¸øÁËblock£¨11Ðе½13ÐУ©¡£Ê¹ÓÃblock£¬Äܱ£Ö¤block½áÊøºóÁ¬½ÓÄܹ»±»¹Ø±Õ¡£

ÔÚÎÒÃǵÄÀý×ÓÀÕâ¸ö½»»¥¹ý³ÌºÜ¼òµ¥£¬µÚ12ÐеijÌÐòÖ»ÊÇ·¢ËÍÁ˸ղŴ«½£µÄÓʼþÄÚÈÝ¡£

send_mail·½·¨µÄµÚ¶þ¸ö²ÎÊýÊÇʹÓõÄFromµØÖ·£¬ÕâÊÇÒ»¸öÈ«¾Ö±äÁ¿¡£µÚÈý¸ö²ÎÊýÊÇÒ»¸ö°üº¬½ÓÊÕÕßµØÖ·µÄÊý×é¡£ÎÒÃÇÕâÀï°ÑÕâÌõÏûÏ¢·¢Ë͵½ÁËÁ½¸öµØ·½£¬Ò»¸ö²ÎÊýÖ¸¶¨µÄto£¬»¹ÓÐÒ»¸ö¹éµµËùÓÐÏûÏ¢µÄ±¾µØÓÊÏä¡£

 


2¡£ÓÃPOP½ÓÊÕºÍÔĶÁÓʼþ

ʹÓÃRuby´ÓPOP·þÎñÆ÷½ÓÊÕÓʼþÊǷdz£¼òµ¥µÄÊÂÇé¡£¼ÙÉèÎÒÃÇÒª¶ÔÈËÃǶԸ÷ÖÖÓïÑÔµÄϲ°®³Ì¶È£¬²Î¼Óµ÷²éµÄÈË¿ÉÒÔͨ¹ý·¢ËͱêÌâΪi like xxxxxµÄÓʼþ¸øÌض¨µÄµØÖ·£¬xxxxxÊÇ·¢ÐÅÕßϲ»¶µÄÓïÑÔµÄÃû×Ö¡£Çåµ¥3µÄRuby½Å±¾ÓÃÀ´´ÓPOP·þÎñÆ÷½ÓÊÕ½á¹û²¢½øÐмÆË㣬°ÑÿÖÖÓïÑÔµÄϲ°®ÕßµÄÊýÄ¿´æÔÚÒ»¸öÆÕͨÎļþ£¬Ã¿ÖÖÓïÑÔÒ»¸öÎļþ¡£

 

Çåµ¥3: Fetching email with POP

 1   require 'net/pop'
 2
 3   Net::POP3.delete_all('pop3.server.address', 110,
 4                        'YourAccount', 'YourPassword' ) do |email|
 5     hdr = email.header
 6     if hdr =~ /Subject:s+I likes+(w+)/
 7       language = $1.upcase
 8     else
 9       language = "INVALID"
10     end
11
12     count = (File.read(language) rescue "0")
13     File.open(language, "w") {|f| f.puts old_count.succ}
14   end

POP·þÎñÆ÷´æ·Å×ÅÓû§µÄÏûÏ¢£¬µ±Äã¶ÁÍêÒ»ÌõÏûÏ¢µÄʱºò£¬Äã¿ÉÒÔÑ¡Ôñɾ³ýÕâ·âÐÅ£¬»òÕß»¹°ÑËü·ÅÔÚ·þÎñÆ÷ÉÏ´æ·Å£¬ÔÚÎÒÃǵÄÀý×ÓÀÎÒÃǶÁÍêÖ®ºó½«É¾³ýËü¡£ÐÒÔ˵ÄÊÇ£¬RubyÌṩÁËÒ»¸öºÜ·½±ãµÄµü´úÆ÷delete_all£¬Ëü½«Ò»ÌõÌõµÄÈ¡³öÓʼþ£¬´¦ÀíÍêÖ®ºóɾµôÕâЩÐżþ¡£delete_allÐèÒªµÄ²ÎÊýÓÐPOP·þÎñÆ÷µÄµØÖ·ºÍ¶Ë¿Ú£¨±ê×¼¶Ë¿ÚΪ110£©£¬»¹ÓÐÓû§ÃûºÍÃÜÂë¡£

Õâ¸ö·½·¨¿ªÊ¼Ö®ºó½«ÓÃÖ¸¶¨µÄ²ÎÊýÁ¬½Ó·þÎñÆ÷£¬Ò»·âÒ»·âµÄÈ¡µÃ¸ÃÓû§µÄÓʼþ£¬È»ºóÿ´Î½«Õâ·âÐÅ£¨×÷Ϊһ¸öNet::POPMail¶ÔÏ󣩴«¸ø¸ø¶¨µÄblockÀ´´¦Àí£¬µ±block´¦ÀíÍêÕâ·âÐÅÖ®ºó£¬½«É¾³ýÕâ·âÐÅ¡£

ÔÚÕâ¸ö¿éÄÚ£¬µÚ5Ðн«Õâ·âÐŵÄËùÓÐheader¶¼È¡³öÀ´·Åµ½Ò»¸ö×Ö·û´®µ±ÖС£È»ºóÔÚµÚ6ÐÐÖÐÓÃÒ»¸öÕýÔò±í´ïʽÔÚ±êÌ⣨Subject£©ÖвéÕÒÀàËÆµÄ°üÀ¨µÄI like xxxx ÐУ¬ÕÒ³öxxxx´ú±íµÄÓïÑÔ£¬È»ºóÔÚ12ºÍ13ÐÐÖжÔÕÒµ½µÄͶƱÕßÑ¡ÔñµÄÓïÑԵļÆÊý½øÐиüС£

 

µÚ12ÐÐÓÐÒ»¸öºÜÓÐÒâ˼µÄ½á¹¹¡£Ã¿´ÎÎÒÃǵõ½Ò»¸ö¸øÄ³ÖÖÓïÑÔµÄͶƱ£¬ÎÒÃǶ¼ÓÃÒ»¸öÎļþÀ´´æ´¢Õâ¸öÓïÑԵõ½µÄͶƱÊý¡£ÎÒÃÇ¿ÉÒÔ¶ÁÈ¡Õâ¸öÖµ£¬Ôö¼ÓËü£¬È»ºóд»Øµ½Îļþ¡£µ«ÊǵÚÒ»´ÎÓÐÈ˸øÄ³¸öÓïÑÔͶƱʱ£¬Õâ¸öÎļþ»¹²»´æÔÚ£¬µ±ÎÒÃǶÁÈ¡Õâ¸öÎļþʱ»áµÃµ½Ò»¸öÒì³££¬ºÜÐÒÔËRubyÌṩÁËÒ»¸öÒì³£»úÖÆ£¨¹Ø¼ü×Örescue£©£¬µ«³öÏÖÒì³£µÄʱºò¿ÉÄÜÊÇÒòΪÎļþ²»´æÔÚ£¬ËùÒÔ²¶»ñÕâ¸öÒì³££¬·µ»ØÒ»¸öĬÈÏÖµ0£¬¼´Õâ¸öÓïÑÔµÄµÃÆ±ÊýΪ0¡£

ÁíÒ»¸öС¼¼ÇÉÊǵÚ13ÐеÄold_count.succ£¬ÎÒÃÇÓÃÕâ¸öÀ´Ôö¼ÓÒ»¸ö×Ö·û´®¡£ÔÚRubyÖÐÕâÊÇÔÊÐíµÄ£¬Èç¹ûÒ»¸ö×Ö·û´®°üº¬µÄÊÇÒ»¸öÕûÊý£¬ÄÇôÕâ¸ösucc·½·¨·µ»ØµÄÊÇÕâ¸ö°üº¬Õâ¸öÕûÊýµÄÏÂÒ»¸öÖµµÄ×Ö·û´®¡£¼´aString.succ=aString.to_i.succ.to_s ¡£

ÒëÕß×¢£ºold_count.succ¿ÉÄÜÓ¦¸ÃÊÇcount.succ

½ÚÑ¡×Ô£ºhttp://www.linux-mag.com/2002-09/ruby_01.html

×îлظ´