private void HandleNewMessage(object sender, MessageEventArgs args) { var msg = imap.GetMessage(args.MessageCount - 1); if (msg == null) return; Debug.WriteLine("Received a message: " + msg.Subject); HandleMessage(msg); }
private void WatchIdleQueue() { try { string last = null, resp; while (true) { if (!TryGetResponse(out resp, idleTimeout)) { //send NOOP every 20 minutes Noop(false); //call noop without aborting this Idle thread continue; } if (resp.Contains("OK IDLE")) return; var data = resp.Split(' '); if (data[0] == "*" && data.Length >= 3) { var e = new MessageEventArgs { Client = this, MessageCount = int.Parse(data[1]) }; if (data[2].Is("EXISTS") && !last.Is("EXPUNGE") && e.MessageCount > 0) { ThreadPool.QueueUserWorkItem(callback => _NewMessage.Fire(this, e)); //Fire the event on a separate thread } else if (data[2].Is("EXPUNGE")) { _MessageDeleted.Fire(this, e); } last = data[2]; } } } catch (Exception) { } }
void imap_NewMessage(object sender, MessageEventArgs e) { var imap = (sender as ImapClient); var msg = imap.GetMessage(e.MessageCount - 1); Console.WriteLine(msg.Subject); }
private void WatchIdleQueue() { try { string last = null, resp; while (true) { if (!TryGetResponse(out resp)) { //Child task should still running on ReadByte here. //Need to send some data to get it to exit. SendCommand("DONE"); //_ResponseTask should pick up response and exit if (!_ResponseTask.Wait(ServerTimeout)) { //Not responding Disconnect(); throw new ImapClientException("Lost communication to IMAP server, connection closed."); } _ResponseTask.Dispose(); _ResponseTask = null; IdleResumeCommand(); continue; } if (resp.Contains("OK IDLE")) //Server response after DONE return; var data = resp.Split(' '); if (data[0] == "*" && data.Length >= 3) { var e = new MessageEventArgs { Client = this, MessageCount = int.Parse(data[1]) }; if (data[2].Is("EXISTS") && !last.Is("EXPUNGE") && e.MessageCount > 0) { Task.Factory.StartNew(() => _NewMessage.Fire(this, e)); //Fire the event in a task } else if (data[2].Is("EXPUNGE")) { Task.Factory.StartNew(() => _MessageDeleted.Fire(this, e)); } last = data[2]; } } } catch (Exception e) { ImapClientExceptionEventArgs args = new ImapClientExceptionEventArgs(e); Task.Factory.StartNew(() => ImapException.Fire(this, args)); } }
private void WatchIdleQueue() { try { string last = null; while (true) { _IdleEventsMre.WaitOne(); if (_IdleQueue.Count == 0) continue; var resp = _IdleQueue.Dequeue(); var data = resp.Split(' '); if (data[0] == "*" && data.Length >= 3) { var e = new MessageEventArgs { Client = this, MessageCount = int.Parse(data[1]) }; if (data[2].Is("EXISTS") && !last.Is("EXPUNGE")) { _NewMessage.Fire(this, e); } else if (data[2].Is("EXPUNGE")) { _MessageDeleted.Fire(this, e); } last = data[2]; } } } catch (ThreadAbortException) { } catch (Exception ex) { Console.WriteLine(ex.Message); } }
private void WatchIdleQueue() { try { string last = null; while (true) { string resp; if (!TryGetResponse(out resp, (int)TimeSpan.FromMinutes(20).TotalMilliseconds)) { //send NOOP every 20 minutes Noop(false); //call noop without aborting this Idle thread continue; } if (resp == IDLE_THREAD_ABORT) //string that tells us to close the thread return; var data = resp.Split(' '); if (data[0] == "*" && data.Length >= 3) { var e = new MessageEventArgs { Client = this, MessageCount = int.Parse(data[1]) }; if (data[2].Is("EXISTS") && !last.Is("EXPUNGE") && e.MessageCount > 0) { ThreadPool.QueueUserWorkItem(callback => _NewMessage.Fire(this, e)); //Fire the event on a separate thread } else if (data[2].Is("EXPUNGE")) { _MessageDeleted.Fire(this, e); } last = data[2]; } } } catch (ThreadAbortException) { Console.WriteLine("IdleEvent thread aborted"); } catch (Exception ex) { Console.WriteLine(ex.Message); } }