我的目标是在gmail gem自述文件中找到调用save_attachments_to的地方:
folder = "/where/ever"
gmail.mailbox("Faxes").emails do |email|
if !email.message.attachments.empty?
email.message.save_attachments_to(folder)
end
end
我在循环中运行“put email.message.attachments.methods和”email.message.attachments.class“:
Mail::AttachmentsList
guess_encoding
set_mime_type
inspect
然后我运行一个“puts email.message.methods and a puts email.message.class”for good measure。示例方法调用不在列表中。
所以我潜入https://github.com/nu7hatch/gmail/blob/master/lib/gmail/message.rb。
也没有定义任何方法,但是我注意到mime / message被定义了,所以我去看看它的方法:http://rubydoc.info/gems/mime/0.1/MIME/Message
这里也没有save_attachments_to方法。
这种方法的平均值是多少? gmail gem没有定义附件方法,所以整个东西必须从某个地方继承。哪里?继承它的电话在哪里?
答案 0 :(得分:2)
您无法找到它的原因是因为它不存在。我不知道为什么。我下载了宝石并在irb
中使用它玩了一段时间:
1.9.3-p194 :066 > x.message.attachments
=> [#<Mail::Part:70234804200840, Multipart: false, Headers: <Content-Type: application/vnd.ms-excel; name="MVBINGO.xls">, <Content-Transfer-Encoding: base64>, <Content-Disposition: attachment; filename="MVBINGO.xls">, <Content-Description: MVBINGO.xls>>]
1.9.3-p194 :063 > x.message.save_attachments_to(folder)
NoMethodError: undefined method `save_attachments_to' for #<Mail::Message:0x007fc1a3875818>
from /Users/Qsario/.rvm/gems/ruby-1.9.3-p194/gems/mail-2.4.4/lib/mail/message.rb:1289:in `method_missing'
from (irb):63
from /Users/Qsario/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'
不是很有帮助。通常,您可以执行类似
的操作puts my_obj.method(:some_method_name).source_location
但是当问题的方法不存在时,这对你没有多大帮助。编辑:现在我看,这个确切的错误已经在他们的issue tracker。一些人发布了代码来实现不存在的函数,例如a-b代码:
folder = Dir.pwd # for example
email.message.attachments.each do |f|
File.write(File.join(folder, f.filename), f.body.decoded)
end
答案 1 :(得分:2)
感谢Qsario的理智检查。 : - )
以下是适用于Ruby 1.9.3(1.9.3-p194)的代码:
gmail = Gmail.connect('username@gmail.com', 'pass')
gmail.inbox.emails.each do |email|
email.message.attachments.each do |f|
File.write(File.join(local_path, f.filename), f.body.decoded)
end
end
以下代码适用于1.9.2(1.9.2-p320)和1.9.3(1.9.3-p194):
gmail = Gmail.connect('username@gmail.com', 'pass')
gmail.inbox.emails.each do |email|
email.message.attachments.each do |file|
File.open(File.join(local_path, "name-of-file.doc or use file.filename"), "w+b", 0644 ) { |f| f.write file.body.decoded }
end
end