自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

教你迅速掌握Ruby發(fā)送郵件

開發(fā) 開發(fā)工具
Ruby發(fā)送郵件可以通過SMTP來實現(xiàn)發(fā)送,并用POP接收和閱讀郵件。我們給出的代碼示例方便大家理解掌握這一技巧,提升大家的編程能力。

Ruby語言可以幫助我們實現(xiàn)許多內(nèi)容,比如對郵件的發(fā)送等。在這里我們將會了解到有關(guān)Ruby發(fā)送郵件的相關(guān)技巧,希望對大家有所幫助。#t#

1。通過SMTP發(fā)送Email

每星期Holden Glova, Pat Eyler, 和 Phil Thomson都會向Ruby Garden 網(wǎng)站(http://www.rubygarden.org)提交一個Ruby Weekly News (RWN)文章。一個Ruby腳本通過email接收這篇文章,將它從原來的xml格式轉(zhuǎn)換為HTML和純文本格式,然后將HTML格式的發(fā)表到網(wǎng)站,然后將純文本格式的文章發(fā)到郵件列表。如果這中間出現(xiàn)什么問題(比如xml文檔結(jié)構(gòu)不對等),這個腳本將向發(fā)送者發(fā)送一封包含錯誤信息的email。

這個腳本用Net::SMTP (Simple Mail Transfer Protocol) 庫發(fā)送email。清單 1 是這個腳本中用來發(fā)送email的方法,這個方法接收3個參數(shù):email地址,標(biāo)題,和信件內(nèi)容。因為這個程序要在各種控制環(huán)境下使用,所以一些類似發(fā)件人,轉(zhuǎn)發(fā)email的主機等屬性都定義為全局常量,而不是參數(shù)。

Ruby發(fā)送郵件清單 1: 通過SMTP發(fā)送郵件

 

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

一個email消息由兩部分組成:信封(envelope)和內(nèi)容(content)。信封告訴SMTP代理(sendmail或者postfix)如何投遞消息。內(nèi)容包括能被人們閱讀的消息本身和一些標(biāo)題(header)(比如消息subject),而一些內(nèi)容中的header可能和envelope中的重復(fù)(比如"To"地址),這些重復(fù)的header用來顯示時候使用,而envelope中的則是用來投遞使用。(這也是為什么你會收到"To"地址不是你的垃圾郵件)

你可以看到reply方法已經(jīng)分離了envelop和content,第5行到第9行生成了content,它包括3個header:To,F(xiàn)rom,Subject,然后在一個空行后面加上了消息內(nèi)容。注意郵件主體內(nèi)容之前的header之后必須有一個回車換行,即"\r"和"\n"的組合。

Ruby發(fā)送郵件方法Net::SMTP.start來和MTA( mail transfer agent)建立連接,這個方法的一個參數(shù)是運行MTA的機器名稱,并且使用了默認(rèn)端口(25),這個方法返回一個對象用來和MTA交互,并且把這個對象作為參數(shù)傳給了block(11行到13行)。使用block,能保證block結(jié)束后連接能夠被關(guān)閉。

在我們的例子里,這個交互過程很簡單,第12行的程序只是發(fā)送了剛才傳劍的郵件內(nèi)容。

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

 

2。Ruby發(fā)送郵件用POP接收和閱讀郵件

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

Ruby發(fā)送郵件清單3: Fetching email with POP

 

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

POP服務(wù)器存放著用戶的消息,當(dāng)你讀完一條消息的時候,你可以選擇刪除這封信,或者還把它放在服務(wù)器上存放,在我們的例子里,我們讀完之后將刪除它。幸運的是,Ruby提供了一個很方便的迭代器delete_all,它將一條條的取出郵件,處理完之后刪掉這些信件。delete_all需要的參數(shù)有POP服務(wù)器的地址和端口(標(biāo)準(zhǔn)端口為110),還有用戶名和密碼。

這個Ruby發(fā)送郵件方法開始之后將用指定的參數(shù)連接服務(wù)器,一封一封的取得該用戶的郵件,然后每次將這封信(作為一個Net::POPMail對象)傳給給定的block來處理,當(dāng)block處理完這封信之后,將刪除這封信。

在這個塊內(nèi),第5行將這封信的所有header都取出來放到一個字符串當(dāng)中。然后在第6行中用一個正則表達(dá)式在標(biāo)題(Subject)中查找類似的包括的I like xxxx 行,找出xxxx代表的語言,然后在12和13行中對找到的投票者選擇的語言的計數(shù)進行更新。

第12行有一個很有意思的結(jié)構(gòu)。每次我們得到一個給某種語言的投票,我們都用一個文件來存儲這個語言得到的投票數(shù)。我們可以讀取這個值,增加它,然后寫回到文件。但是第一次有人給某個語言投票時,這個文件還不存在,當(dāng)我們讀取這個文件時會得到一個異常,很幸運Ruby提供了一個異常機制(關(guān)鍵字rescue),但出現(xiàn)異常的時候可能是因為文件不存在,所以捕獲這個異常,返回一個默認(rèn)值0,即這個語言的得票數(shù)為0。

另一個Ruby發(fā)送郵件小技巧是第13行的old_count.succ,我們用這個來增加一個字符串。在Ruby中這是允許的,如果一個字符串包含的是一個整數(shù),那么這個succ方法返回的是這個包含這個整數(shù)的下一個值的字符串。即aString.succ=aString.to_i.succ.to_s 。

譯者注:old_count.succ可能應(yīng)該是count.succ

責(zé)任編輯:曹凱 來源: 百度博客
相關(guān)推薦

2009-12-14 15:54:34

Ruby轉(zhuǎn)義字符

2009-12-16 10:57:16

Ruby文件鎖

2009-12-14 16:35:28

Ruby文件行數(shù)計算

2009-12-18 14:19:45

Ruby on Rai

2010-01-11 14:28:14

VB.NET操作Exc

2010-01-08 18:10:44

VB.NET實現(xiàn)任務(wù)欄

2009-12-10 14:18:22

PHP導(dǎo)出Word文檔

2009-12-14 18:23:38

Ruby DSL測試

2009-10-29 13:38:05

VB.NET Shar

2010-01-12 10:19:02

VB.NET操作GDI

2009-12-04 14:23:33

PHP JSON加密函

2017-04-26 09:00:23

Python發(fā)送郵件腳本

2021-11-09 09:01:36

Python網(wǎng)絡(luò)爬蟲Python基礎(chǔ)

2009-12-17 14:03:42

Ruby監(jiān)控網(wǎng)絡(luò)

2009-12-17 14:36:57

Ruby on Rai

2022-01-28 15:04:57

Python日志郵件

2020-07-27 16:52:59

Mailmerge定制郵件系統(tǒng)應(yīng)用

2022-09-02 15:08:02

Python郵件發(fā)送

2009-12-15 13:41:49

Ruby向?qū)ο蟀l(fā)送消息

2009-06-28 22:56:00

虛擬化桌面虛擬化問題
點贊
收藏

51CTO技術(shù)棧公眾號