使用rubu语言开发一个处理邮件的小脚本:筛选出为他人提供回复的邮件,并统计!
问题:
使用ruby的email library库,建立基础数据结构:
emails = {}
for each file:
emails[message_id] = email_obj
for each email:
return false if is_review(email_obj)
count to people
show counts
is_review(email_obj):
return false if no Re:
return false if not PATCH
return false if no email_obj['References']
return false if emails[email_obj['References'][0]]['From'] == email_obj['From'] # replying to oneself? May need email alias mapping to match
accurately.
return true
在 is_review()函数模块中,想要使用mail内部的映射关系直接返回出Message_id对应的发件人,但是调用过程中出现了问题。
----
for each file:
mail=Mail.read(file_name)
$emails[mail.message_id]=mail
...
values=$emails.values
values.each do |i|
if $emails[i.references[0]].from==i.from
return false
end
end
Error message:
./review-3.rb:25:in `is_review': undefined method `from' for
nil:NilClass (NoMethodError)
使用 $eamils[i.reference[0]] 返回结果为邮件内容,
使用 $emails[i.references[0]].from 报错!
源代码:
#!/usr/bin/ruby -w
#
require 'mail'
$emails={}
mail_path="/home/wcl/Maildir/.inbox/new/"
def open_file(file_name)
mail=Mail.read(file_name)
$emails[mail.message_id]=mail
end
def is_review(i)
if not i.subject.include?("Re:")
return false
end
if not i.subject.include?("PATCH")
return false
end
if not i.references
return false
end
if mail.references.is_a? Array
if $emails[i.references[0]].from==i.from
return false
end
else
if $emails[i.references].from==i.from
return false
end
end
return true
end
#main
file_name=Dir.entries(mail_path)
file_name.each do |i|
file_name="#{mail_path}#{i}"
if File.file?("#{file_name}")
open_file(file_name)
end
end
count_hash={}
values=$emails.values
values.each do |i|
if is_review(i)
name="#{i.from}"
if count=count_hash[name]
count_hash[name]=count+1
else
count_hash[name]=1
end
end
end
puts "people\t\t\t\t\t\ttreview"
keys=count_hash.keys
keys.each do |i|
puts "#{i}\t\t\t#{count_hash[i]}"
end