If you ever see the following error message when running a Ruby mail script that uses the IMAP library it may not be as bad as it seems:
/usr/local/lib/ruby/1.8/net/imap.rb:971:in get_tagged_response: Error in IMAP command received by server. (Net::IMAP::NoResponseError) from /usr/local/lib/ruby/1.8/net/imap.rb:1022:in send_command from /usr/local/lib/ruby/1.8/monitor.rb:229:in synchronize from /usr/local/lib/ruby/1.8/net/imap.rb:1007:in send_command from /usr/local/lib/ruby/1.8/net/imap.rb:1140:in search_internal from /usr/local/lib/ruby/1.8/monitor.rb:229:in synchronize from /usr/local/lib/ruby/1.8/net/imap.rb:1136:in search_internal from /usr/local/lib/ruby/1.8/net/imap.rb:675:in search from read_but_no_reply.rb:11
This "in get_tagged_response: Error in IMAP command received by server" error message looks bad, but as a practical matter it usually means I have something wrong in my Ruby IMAP search criteria. For instance, the following code segment has a slight error:
# intentional error here
imap.search(["FROM", "acme.com",
"AFTER", "15-Nov-2006",
"SEEN",
"NOT", "ANSWERED"]).each do |message_id|
env = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"]
puts "#{env.from[0].name}: \t#{env.subject}"
end
The subtle error in my IMAP search criteria is that there is no AFTER keyword(!). I assumed that because there was a BEFORE keyword the opposite would be called AFTER, but no, the correct string is SINCE. Changing AFTER to SINCE fixes the problem, and gets rid of the ugly Error in IMAP command received by server error message.
This error is fixed in the following code:
# error fixed here
imap.search(["FROM", "acme.com",
"SINCE", "15-Nov-2006",
"SEEN",
"NOT", "ANSWERED"]).each do |message_id|
env = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"]
puts "#{env.from[0].name}: \t#{env.subject}"
end
So, when you see this message, take a close look at your IMAP search criteria.

