В Ruby 2.0 и более поздних версиях существует простой метод, который принимает блок кода, который будет вызываться каждый раз, когда вы получаете непомеченный ответ. Как только вы получите этот ответ, вам нужно разорвать и вытащить поступившие электронные письма. Простой также блокируется, поэтому вам нужно делать это в потоке, если вы хотите сохранить его асинхронным.
Вот пример (в данном случае @mailbox является экземпляром Net :: IMAP):
def start_listener()
@idler_thread = Thread.new do
# Run this forever. You can kill the thread when you're done. IMAP lib will send the
# DONE for you if it detects this thread terminating
loop do
begin
@mailbox.select("INBOX")
@mailbox.idle do |resp|
# You'll get all the things from the server. For new emails you're only
# interested in EXISTS ones
if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS"
# Got something. Send DONE. This breaks you out of the blocking call
@mailbox.idle_done
end
end
# We're out, which means there are some emails ready for us.
# Go do a seach for UNSEEN and fetch them.
process_emails()
rescue Net::IMAP::Error => imap_err
# Socket probably timed out
rescue Exception => gen_err
puts "Something went terribly wrong: #{e.messsage}"
end
end
end
end