`
aideehorn
  • 浏览: 260781 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

运用Ruby 收发邮件

    博客分类:
  • ruby
阅读更多

转http://tech.it168.com/o/2007-09-07/200709071011860.shtml

 


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)

分享到:
评论

相关推荐

    使用RabbitMQ的Rails工业级后台工作者系统。_Ruby_HTM.zip

    它的主要功能是作为中间人,接收和转发消息,使得生产者(发送消息的应用)和消费者(处理消息的应用)之间解耦。这种设计模式允许应用在不影响用户体验的情况下执行耗时操作,如批量数据处理、电子邮件发送等。 ...

    LinkedIn_email_guesser_extension:Chrome扩展程序,使用我的emailChecker sinatra应用来猜测某人的LinkedIn个人资料的电子邮件

    在emailChecker应用接收到数据后,它可能运用一系列的规则和算法来推测电子邮件地址。例如,应用可能会假设常用的邮箱域名(如gmail.com, yahoo.com, outlook.com等),结合LinkedIn用户的名字和姓氏,尝试组合成...

    CobaltStrike4.0用户手册中文翻译.rar

    总的来说,Cobalt Strike 4.0用户手册中文翻译为国内的安全研究人员提供了宝贵的资源,帮助他们更好地理解和运用这款强大的工具,提升网络安全防护和进攻技能。对于红队而言,这是一份不可多得的实战指南;对于蓝队...

    web.temporal

    9. **应用场景**:web.temporal可能适用于临时分享大型文件、协作编辑文档、在线演示文稿、临时存储备份等场景,避免了邮件附件的大小限制,同时也提供了更直观的文件管理方式。 综上所述,"web.temporal"项目是一...

    Grails基础教程

    - **添加新的邮件**:讲解了如何处理用户提交的邮件数据。 - **探究作用域**:探讨了作用域的概念及其在控制器中的应用。 - **处理默认操作**:介绍了如何定义默认的操作行为。 - **重定向**:讲解了重定向的概念...

    JAVA上百实例源码以及开源项目源代码

    Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...

    java开源包1

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包2

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包3

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包6

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包5

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包10

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包4

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包8

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包7

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包9

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包101

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

Global site tag (gtag.js) - Google Analytics