Ruby语言

动态纯面向对象语言

用户操作
[即时聊天] [发私信] [加为好友]
刘斌ID:ruby_cn
96317次访问,排名952好友0人,关注者1
ruby_cn的文章
原创 46 篇
翻译 0 篇
转载 0 篇
评论 54 篇
ruby_cn的公告
Ruby,一种面向对象的脚本语言。 它综合了perl,python,java等语言的特点写成,有强大的文字处理能力,简单的语法,完全的面向对象。 而且,用它来编程,你会得到很多的乐趣,比如.... 仔细往下看吧。同时欢迎有相同爱好的人一起加入这里,共同学习。
最近评论
AcentHuu:我们已经习惯了Java,Ruby可能很难接受,
如果一开始学的就是Ruby 的话,可能会好些
kenlistian:最后一句应该是:
k.hello2 #"Hello from Mod.n"
暗暗:你这查询ruby支持吗?
thinkinlove:英汉本来就没有说一定有对应,我个人觉得闭包这个翻译很好。
另外OO 本来就是世界观的问题,形而上没有错,FP和OO本来就是互相对立的世界观,就如经典力学和量子论。。。。
developer_lee:个人很赞同OO的观点
文章分类
收藏
    相册
    Ruby
    Friends
    tingya的blog
    Java
    Others
    My Home
    纯粹物件导向空间
    Ruby
    Iowa:web开发框架
    Kdeveloper Ruby绑定
    Rails:开源的web应用框架
    Ruby Home
    Ruby讨论组
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 使用Ruby收发邮件收藏

    新一篇: Ruby中的SOAP编程 | 旧一篇: 37个我爱Ruby的理由

     

    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是发信者喜欢的语言的名字。清单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,它将一条条的取出邮件,处理完之后删掉这些信件。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

    发表于 @ 2004年12月06日 09:02:00|评论(loading...)|编辑

    新一篇: Ruby中的SOAP编程 | 旧一篇: 37个我爱Ruby的理由

    评论

    #cvu 发表于2006-06-09 15:54:00  IP: 222.71.47.*
    ruby smtp怎么cc?
    查遍了中英文社区,都没有解答。
    现在我用的方式是,通过mailfactory构造一个有cc的mail,但是cc的人还是放在smtp.send_mail的to变量里面。这是一个假的cc。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © ruby_cn