RFC 2177 - команда IMAP4 IDLE

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

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

 henrikhodne26 янв. 2011 г., 06:42
IMAP IDLE является частью протокола IMAP. Итак, да, что dkarp спросил: вы хотите знать, что такое спецификация протокола или как реализовать ее на веб-сайте (я предполагаю, что вы не делаете IMAP-сервер, так как вы говорите о heroku).
 Wolfram Arnold21 дек. 2012 г., 01:12
Смотрите здесь для ответа:stackoverflow.com/a/1818718/459863
 dkarp06 янв. 2011 г., 14:53
Вы хотите знать, что такое IMAP IDLE и какие данные вам нужно будет отправлять обратно клиенту, или вы хотите знать, как реализовать IMAP IDLE на вашем существующем сервере IMAP?

Ответы на вопрос(2)

которую могут поддерживать реализации почтового сервера, позволяющие получать уведомления в режиме реального времени. [Википедия]

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

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

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

[RFC 2177 - команда IMAP4 IDLE]

который принимает блок кода, который будет вызываться каждый раз, когда вы получите ответ без тега. Как только вы получите этот ответ, вам нужно разорвать и вытащить поступившие электронные письма. Простой также блокируется, поэтому вам нужно сделать это в потоке, если вы хотите сохранить его асинхронным.

Вот пример (в этом случае @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
 Giorgio Robino13 дек. 2014 г., 17:20
Спасибо! наконец твой пример очистил мой разум. Я только что написал полный сценарий здесь:gist.github.com/solyaris/b993283667f15effa579

Ваш ответ на вопрос