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.