3

我正在开发一个 Ruby 脚本,该脚本将从 Gmail 下载电子邮件并下载与特定模式匹配的附件。我基于 Ruby 的优秀Mail gem。我正在使用 Ruby 1.9.2。我对 Ruby 没有那么丰富的经验,并感谢提供的任何帮助。

在下面的代码中,电子邮件是从 gmail 返回的包含特定标签的电子邮件数组。我坚持的是遍历电子邮件数组并处理每封电子邮件上可能有多个附件的内容。如果我指定索引值,则 emails[index].attachments.each 的内部循环确实有效,但我未能成功包装第一个循环以遍历数组的所有索引值。

emails = Mail.find(:order => :asc, :mailbox => 'label')

emails.each_with_index do |index|
    emails[index].attachments.each do | attachment |
      # Attachments is an AttachmentsList object containing a
      # number of Part objects
      if (attachment.filename.start_with?('attachment'))
        filename = attachment.filename
        begin
            File.open(file_dir + filename, "w+b", 0644) {|f| f.write attachment.body.decoded}
        rescue Exception => e
            puts "Unable to save data for #{filename} because #{e.message}"
        end
      end
    end
end
4

2 回答 2

10

的语法each_with_index是这样的:

@something.each_with_index do |thing,index|
    puts index, thing
end

然后你应该替换行 emails.each_with_index do |index|

emails.each_with_index do |email,index|

但是我没有看到您实际使用索引,因此您可以将其简化为:

emails.each do |email|
    email.attachments.each do | attachment |
....
于 2012-04-15T20:00:15.617 回答
3

each_with_index 为块产生的第一个参数是对象,而不是索引。

emails.each_with_index do |o, i|
  o.attachments.each do | attachment |

除非您需要我们未见过的代码中的索引,否则您可以使用each那里的方法。

于 2012-04-15T19:56:56.490 回答