Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
        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) { }
        }
Exemplo n.º 3
0
 void imap_NewMessage(object sender, MessageEventArgs e)
 {
     var imap = (sender as ImapClient);
     var msg = imap.GetMessage(e.MessageCount - 1);
     Console.WriteLine(msg.Subject);
 }
Exemplo n.º 4
0
        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));
            }
        }
Exemplo n.º 5
0
 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);
       }
 }
Exemplo n.º 6
0
        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);
              }
        }