Как работает IMAP на холостом ходу? - PullRequest
4 голосов
/ 06 января 2011

Может кто-нибудь объяснить мне, как работает IMAP IDLE?Разветвляет ли он новый процесс для каждого соединения, которое он открывает?Можно ли как-то использовать eventmachine с ним?

Я пытаюсь реализовать это в рубине на героку с фоновыми работниками.Есть мысли?

Ответы [ 2 ]

7 голосов
/ 25 января 2014

В 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
1 голос
/ 15 марта 2011

IMAP IDLE - это функция, которую могут поддерживать реализации почтового сервера, которая позволяет получать уведомления в режиме реального времени.[ Wikipedia ]

Команда IDLE может использоваться с любой реализацией сервера IMAP4, которая возвращает «IDLE» в качестве одной из поддерживаемых возможностей команды CAPABILITY.

Команда IDLE отправляется с клиента на сервер, когда клиент готов принять нежелательные сообщения об обновлении почтового ящика.Сервер запрашивает ответ на команду IDLE, используя ответ продолжения («+»).Команда IDLE остается активной до тех пор, пока клиент не ответит на продолжение, и до тех пор, пока активна команда IDLE, сервер теперь может свободно отправлять без тегов EXISTS, EXPUNGE и другие сообщения в любое время.

IDLEкоманда прекращается при получении продолжения «ГОТОВО» от клиента;такой ответ удовлетворяет запросу продолжения сервера.[...] Клиент НЕ ДОЛЖЕН отправлять команду, пока сервер ожидает DONE, так как сервер не сможет отличить команду от продолжения.

[ RFC2177 - команда IMAP4 IDLE ]

...