• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    使用Ruby收發郵件

    發布: 2007-6-11 15:27 | 作者: seanhe | 來源: | 查看: 42次 | 進入軟件測試論壇討論

    領測軟件測試網

    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的主機等屬性都定義為全局常量,而不是參數。

    清單1:通過SMTP發送郵件

    1 FROM_ADDRESS = "dave@pragprog.com"

    2 SMTP_HOST = "localhost"

    3

    4 def reply(to, subject, msg)

    5 mail = "To: #{to}\r\n" +

    6 "From: #{FROM_ADDRESS}\r\n" +

    7 "Subject: #{subject}\r\n" +

    8 "\r\n" +

    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行的程序只是發送了剛才傳送的郵件內容。

    send_mail方法的第二個參數是使用的From地址,這是一個全局變量。第三個參數是一個包含接收者地址的數組。我們這里把這條消息發送到了兩個地方,一個參數指定的to,還有一個歸檔所有消息的本地郵箱。

    2、用POP接收和閱讀郵件

    使用Ruby從POP服務器接收郵件是非常簡單的事情。假設我們要對人們對各種語言的喜愛程度,參加調查的人可以通過發送標題為i like xxxxx的郵件給特定的地址,xxxxx是發信者喜歡的語言的名字。清單 2的Ruby腳本用來從POP服務器接收結果并進行計算,把每種語言的喜愛者的數目存在一個普通文件,每種語言一個文件。

    清單2: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 like\s+(\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)

    (責任編輯 火鳳凰 sunsj@51cto.com  TEL:(010)68476636-8007)



    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>