Rubyを使ってメールを送受信します.
1です.SMTPでメールを送ります.
毎週Holden Glova、Pat Eyle、Phil ThomsonはRuby Gardenサイトに行きます.http://www.rubygarden.org)Ruby Weekly News(RWN)記事を提出します.Rubryスクリプトはemailでこの記事を受信し、元のxmlフォーマットからHTMLと純粋なテキストフォーマットに変換し、HTML形式のウェブサイトに投稿し、テキスト形式の文章をメールリストに送信します.この中で何か問題があったら、このスクリプトはエラーメッセージを含むemailを送信者に送信します.
このスクリプトはNet:SMTPライブラリでemailを送ります.リスト1は、このスクリプトでemailを送信する方法であり、この方法では3つのパラメータを受信します.emailアドレス、タイトル、メッセージの内容です.このプログラムは様々な制御環境で使用されるため、送信者のようなものや転送emailのホストなどの属性はパラメータではなくグローバル定数として定義されています.
リスト1:SMTPでメールを送る
1 FROM_ADDRESS = "[email protected]"
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, '[email protected]' ])
14 end
15 end
一つのemailメッセージは二つの部分から構成されています.封筒と内容です.封筒はSMTPエージェントにメッセージを送る方法を教えます.内容は人々に読まれることができるメッセージそのものと一部のタイトル(例えばメッセージ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と接続を確立し、この方法の一つのパラメータはMTAを実行するマシン名であり、デフォルトポート(25)を使用して、この方法はオブジェクトを返してMTAと対話するために使用され、このオブジェクトをパラメータとしてblock(11行から13行)に伝えました.blockを使って、blockが終わったら接続がオフになることを保証できます.
私達の例では、このインタラクティブプロセスはとても簡単で、12行目のプログラムは先ほど剣を伝えたメールの内容だけを送りました.
send_メール方法の2番目のパラメータはFromアドレスを使用しています.これはグローバル変数です.第三のパラメータは、受信者のアドレスを含む配列である.私たちはここでこのメッセージを二つのところに送りました.一つのパラメータで指定されたtoと、もう一つはすべてのメッセージを保存するローカルメールボックスです.
2です.POPでメールを受信して読む
Rubyを使ってPOPサーバからメールを受信するのはとても簡単です.もし私たちが様々な言語に対する人々の好みの度合いを調べるなら、調査に参加する人はi like xxxxというメールを送ることで特定の住所に送ることができます.xxxxは発信者の好きな言語の名前です.リスト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 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は、1つのストリップからメールを取り出し、処理が終わったらこれらのメッセージを削除します.delete_allに必要なパラメータは、POPサーバのアドレスとポート(標準ポートは110)とユーザ名とパスワードがあります.この方法は開始後、指定されたパラメータでサーバーに接続し、一通ずつそのユーザのメールを取得してから、この手紙を所与のblockに送信して処理します.blockがこの手紙を処理した後、削除します.
このブロックの中で、第5行目のこの手紙のheaderはすべて取り出して文字列の中に入れます.そして6行目に正則表現を用いてタイトル(Subject)に類似のI like xxxx行を検索し、xxxx代表の言語を探し出し、12行と13行の中で見つけた投票者が選択した言語のカウントを更新する.
12行目は面白い構造です.私たちはある言語に投票するたびに、この言語で得られた投票数をファイルで保存します.私たちはこの値を読み取り、それを増やしてファイルに書き戻すことができます.しかし、初めてある言語に投票した時、このファイルはまだ存在しませんでした.このファイルを読み込むと異常が発生しました.Rubyは異常なメカニズムを提供しました.しかし、異常が発生した時はファイルが存在しないため、この異常を捕獲し、標準値0に戻ります.つまり、この言語の得票数は0です.
もう一つのテクニックは13行目のold_です.count.succは、これを使って文字列を追加します.Rubyではこれは許可されています.文字列が整数である場合、このsucc方法はこの整数の次の値を含む文字列を返します.つまりaString.succ=aString.to_i.succc.to_sです
old_count.succはcount.succかもしれません.