示例#1
0
        public static void Run()
        {
            //ExStart: 1
            ImapClient imapClient = new ImapClient();

            imapClient.Host                = "<HOST>";
            imapClient.Port                = 993;
            imapClient.Username            = "******";
            imapClient.Password            = "******";
            imapClient.SupportedEncryption = EncryptionProtocols.Tls;
            imapClient.SecurityOptions     = SecurityOptions.SSLImplicit;

            ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages();

            Console.WriteLine("ListMessages Count: " + messageInfoCol.Count);
            int[]    sequenceNumberAr = messageInfoCol.Select((ImapMessageInfo mi) => mi.SequenceNumber).ToArray();
            string[] uniqueIdAr       = messageInfoCol.Select((ImapMessageInfo mi) => mi.UniqueId).ToArray();

            IList <MailMessage> fetchedMessagesBySNumMC = imapClient.FetchMessages(sequenceNumberAr);

            Console.WriteLine("FetchMessages-sequenceNumberAr Count: " + fetchedMessagesBySNumMC.Count);

            IList <MailMessage> fetchedMessagesByUidMC = imapClient.FetchMessages(uniqueIdAr);

            Console.WriteLine("FetchMessages-uniqueIdAr Count: " + fetchedMessagesByUidMC.Count);
            //ExEnd: 1

            Console.WriteLine("ImapFetchGroupMessages executed successfully.");
        }
示例#2
0
        private static void DumpMessages(List<string> paramNames, ImapClient client, ImapFolder f, string upperCmd)
        {
            long lowUid = 1;
            long highUid = f.UidNext;

            string dumpRange = upperCmd.Substring("DUMP".Length).Trim();
            var rangeArgs = dumpRange.Split(new char[] { ':', ' ', '-' }, StringSplitOptions.RemoveEmptyEntries);
            if (rangeArgs.Length > 0)
            {
                if (!long.TryParse(rangeArgs[0], out lowUid))
                {
                    lowUid = 1;
                }
            }

            if (rangeArgs.Length > 1)
            {
                if (!long.TryParse(rangeArgs[1], out highUid))
                {
                    highUid = f.UidNext;
                }
            }

            System.Console.WriteLine("Fetching UIDs in range [{0}:{1}] from folder [\"{2}\"]...",
                lowUid, highUid, client.SelectedFolder.Name);

            long[] msUids = client.FetchUids(lowUid, highUid, true).ToArray();

            System.Console.WriteLine("Fetching [{0}] headers...", msUids.Length);

            const int HeaderBlockSize = 1000;

            for (int i = 0; i < msUids.Length; i += HeaderBlockSize)
            {
                int j = i + HeaderBlockSize;

                if (j >= msUids.Length)
                {
                    j = msUids.Length - 1;
                }

                ImapFetchOption opts =
                    ImapFetchOption.Envelope
                    | ImapFetchOption.BodyStructure
                    | ImapFetchOption.Flags;

                ImapMessage[] ms = client.FetchMessages(msUids[i], msUids[j], opts, paramNames).ToArray();

                foreach (ImapMessage m in ms)
                {
                    DumpMessageInfo(m);
                    System.Console.WriteLine();
                }
            }
        }
示例#3
0
        private static void DumpBody(List<string> paramNames, ImapClient client, ImapFolder f, string upperCmd)
        {
            long uid = -1;
            string uidString = upperCmd.Substring("BODY".Length).Trim();
            if (!long.TryParse(uidString, out uid))
            {
                throw new ArgumentException("Must include valid message UID for BODY dump.", "uid");
            }

            var message = client.FetchMessages(uid, uid, ImapFetchOption.BodyStructure).FirstOrDefault();
            if (null == message)
            {
                System.Console.WriteLine("Message with UID [{0}] not found.  Can not dump its body.", uid);
            }
            else
            {
                foreach (var part in message.BodyParts)
                {
                    DumpBodyPart(client, uid, part);
                }
            }
        }
示例#4
0
        private void DoGMailQuery(string query, int maxhits, IQueryResult result)
        {
            Log.Debug("GMailSearchDriver: Searching for [{0}]", query);
            MessageSet results = imap_client.Search(query, false);

            if (results == null)
            {
                return;
            }

            Log.Debug("Recvd {0} messages", results.Messages.Count);

            // Get the messages in reverse order; latest first
            ArrayList matched_ids = new ArrayList(results.Messages);

            matched_ids.Reverse();

            const int MAX_QUEUED_HITS = 25;
            int       left            = Math.Min(maxhits, matched_ids.Count);
            ArrayList result_batch    = new ArrayList(MAX_QUEUED_HITS);

            MailCollection emails;

            GMime.StreamMem stream;
            GMime.Parser    parser;
            GMime.Message   message;
            Hit             hit;

            foreach (string id in matched_ids)
            {
                if (left-- == 0)
                {
                    break;
                }
                Log.Debug("Fetching headers for message id {0}", id);

                emails = imap_client.FetchMessages(id, id, false, true, false);
                if (emails == null || emails.Count == 0)
                {
                    Log.Error("IMAP error: {0}", imap_client.LastError);
                    continue;
                }

                foreach (Mail m in emails)
                {
                    hit = null;

                    using (stream = new GMime.StreamMem(m.Header))
                        using (parser = new GMime.Parser(stream))
                            using (message = parser.ConstructMessage())
                                hit = MessageToHit(message);

                    if (hit == null)
                    {
                        Log.Error("Bad IMAP email {0}: no msg-id", id);
                        continue;
                    }
                    else
                    {
                        result_batch.Add(hit);
                    }
                }

                if (result_batch.Count >= MAX_QUEUED_HITS)
                {
                    result.Add(result_batch);
                    result_batch.Clear();
                }
            }

            result.Add(result_batch, matched_ids.Count);
        }