tailenderProgrammer 2020-06-09 19:19 采纳率: 0%
浏览 151
已结题

关于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
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-06-10 00:09
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多