【发布时间】:2017-11-11 00:22:43
【问题描述】:
我正在尝试提取从我们的一个服务提供商发送的电子邮件的附件,并将它们保存到网络驱动器,以显示 Smashing Dashboard 的信息。
我正在尝试使用 Mail Gem 来执行此操作: https://github.com/mikel/mail http://www.rubydoc.info/github/mikel/mail/Mail
但是,我对 ruby 尤其是这个特定的 gem 非常缺乏经验,所以我在破译电子邮件时遇到了错误。
###########################################################################
######################## Connect to the POP Server ########################
###########################################################################
require 'mail'
Mail.defaults do
retriever_method :pop3, :address => "pop.gmail.com",
:port => 995,
:user_name => '----',
:password => '----',
:enable_ssl => true
end
###################################################################
######################## Retrieve the Mail ########################
###################################################################
email = Mail.first #=> Returns the first unread
puts email
if (email.length > 0)
puts "New Mail Found"
else
puts "No New Mail"
end
当我在没有新电子邮件的情况下运行此程序时,一切运行正常,但是当有新电子邮件时,我收到以下错误。
/var/lib/gems/2.3.0/gems/mail-2.6.6/lib/mail/message.rb:1379:in
method_missing: 未定义方法length用于# (NoMethodError) from Pop.rb:35:in
main
这一行对应于 if 语句。但是 github 示例非常清楚地使用 mail.length 来检查返回的电子邮件数量,我只是不知道如何解决这个问题。
我会很感激额外的眼睛检查这是否有任何明显错误,甚至是一些调试它的提示。
【问题讨论】:
-
请提供MCVE。
-
我相信这是复制问题所需的最小值,前提是弹出详细信息指向已启用的电子邮件地址。
-
Mail.first返回 single 首封未读电子邮件。使用email.length可能期望那里的集合。试试Mail.all而不是Mail.first。 -
我不确定,但我想你必须做
emails = Mail.all,然后检查电子邮件的长度,或者你必须做email = Mail.first,然后检查电子邮件是否等于nil,就像这样if email == nil -
我最初是在检查电子邮件是否为空,但正在尝试长度作为替代方案,在任何一种情况下都出现类似的错误。虽然将检查更改为 if `!(email==nil)` 确实允许代码在新电子邮件的情况下运行,并允许我从示例中剪切的其余代码正常运行。在没有新邮件的情况下它会失败,因为无论从 Mail.first 返回什么,即使没有新邮件也不能为零。在没有新邮件的情况下,电子邮件的 puts 不会向终端输出任何内容。