关于ruby开发中调用 mail模块的一个语法问题?

使用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

https://blog.csdn.net/tse_e/article/details/54930073