In Ruby 2.0 oder höher, gibt es eine Leerlaufmethode, die einen Codeblock akzeptiert, die jedes Mal, wenn Sie eine nicht markierte Antwort erhalten genannt werden. Sobald Sie diese Antwort erhalten haben, müssen Sie ausbrechen und die eingehenden E-Mails abrufen. Der Leerlaufanruf blockiert ebenfalls. Sie müssen dies also in einem Thread tun, wenn Sie ihn asynchron halten möchten.
Hier ist eine Probe (@mailbox eine Instanz von Net :: IMAP ist in diesem Fall):
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
Wollen Sie wissen wollen, was IMAP IDLE ist und welche Daten Sie müssten wieder auf die schicken Client wann oder möchten Sie wissen, wie IMAP IDLE in Ihrem vorhandenen IMAP-Server zu implementieren? – dkarp
IMAP IDLE ist ein Teil des IMAP-Protokolls. Also, ja, was hat dkarp gefragt: Willst du wissen, was die Protokollspezifikation ist oder wie man es auf einer Website implementiert (ich vermute, du machst keinen IMAP-Server, weil du über Heroku redest). – henrikhodne
Hier finden Sie eine Antwort: http://StackOverflow.com/a/1818718/459863 –