예제 #1
0
        public virtual async Task <int> GetTotalMailCount()
        {
            _mailFolder = await AuthenticateAsync();

            _mailFolder.Open(FolderAccess.ReadOnly);
            return((await _mailFolder.SearchAsync(SearchQuery.All))?.Count ?? 0);
        }
예제 #2
0
        public async Task <List <MimeMessage> > GetMessages(IMailFolder sourceFolder, SearchQuery query, CancellationToken ct)
        {
            return(await PolicyWrapper.WrapRetryOnNotConnected(async() =>
            {
                await sourceFolder.OpenAsync(FolderAccess.ReadOnly).ConfigureAwait(false);
                var uids = (await sourceFolder.SearchAsync(query).ConfigureAwait(false))
                           .Take(10); // TODO Only for test for better performance

                var messages = new List <MimeMessage>();
                foreach (var uid in uids)
                {
                    if (ct.IsCancellationRequested)
                    {
                        break;
                    }
                    try
                    {
                        var msg = await sourceFolder.GetMessageAsync(uid).ConfigureAwait(false);
                        messages.Add(msg);
                    }
                    catch (FolderNotOpenException)
                    {
                        break;
                    }
                }
                return messages;
            },
                                                               EnsureConnected).ConfigureAwait(false));
        }
        public static async Task<(UniqueId, IMailFolder?)> FindIdByMessageIdHeader(this IMailFolder folder, string? messageIdHeaderValue, bool recursive, bool skipParent, bool onlyImmediateChildren = false)
        {
            if (messageIdHeaderValue == null)
            {
                return (UniqueId.Invalid, null);
            }

            await folder.OpenAsync(FolderAccess.ReadOnly);
            if (!skipParent)
            {
                var hit = (await folder.SearchAsync(SearchQuery.HeaderContains("Message-ID", messageIdHeaderValue))).FirstOrDefault(); // sometimes there are more than one if the companion got terminated; ignore this, think later about handling this
                if (hit.IsValid)
                    return (hit, folder);
            }

            var subfolders = await folder.GetSubfoldersAsync(false);
            foreach (var subFolder in subfolders)
            {
                var hit2 = await subFolder.FindIdByMessageIdHeader(messageIdHeaderValue, recursive && onlyImmediateChildren, false, onlyImmediateChildren);
                if (hit2.Item1.IsValid)
                {
                    return hit2;
                }
            }

            return (UniqueId.Invalid, null);
        }
예제 #4
0
        public virtual async Task <IList <UniqueId> > GetUIds(ImapFilter filter = null)
        {
            _mailFolder = await AuthenticateAsync();

            await _mailFolder.OpenAsync(FolderAccess.ReadOnly);

            if (filter == null)
            {
                _lastRetrievedUIds = await _mailFolder.SearchAsync(new SearchQuery());
            }
            else
            {
                _lastRetrievedUIds = await _mailFolder.SearchAsync(filter.ToSearchQuery());
            }

            if (_lastRetrievedUIds == null)
            {
                _lastRetrievedUIds = new List <UniqueId>();
            }

            return(_lastRetrievedUIds);
        }
        public async Task TestImapNotCount4novOutlook()
        {
            var count = 0;

            using (var _clientImap4 = new ImapClient())
            {
                _clientImap4.Connect("outlook.office365.com", 993, true);
                // Como não há autenticação OAuth2 na lib, desabilita o mecanismo de conexão.
                _clientImap4.AuthenticationMechanisms.Remove("XOAUTH2");
                _clientImap4.Authenticate(OUTLOOK_USERNAME, OUTLOOK_PASSWORD);

                IMailFolder mailBox = null;
                if ((_clientImap4.Capabilities & (ImapCapabilities.SpecialUse | ImapCapabilities.XList)) != 0)
                {
                    mailBox = _clientImap4.GetFolder("INBOX");
                }

                var selectedFolder = _clientImap4.GetFolder(_clientImap4.PersonalNamespaces[0]);
                foreach (var existentFolder in selectedFolder.GetSubfolders(false))
                {
                    if (existentFolder.Name.ToLower().Contains("INBOX".ToLower().Trim()))
                    {
                        mailBox = existentFolder;
                    }
                }
                mailBox.Open(FolderAccess.ReadWrite);

                // Filtra todas as mensagens a partir da data indicada e que não foram marcadas como visualizadas.
                // Mais informações em: https://components.xamarin.com/gettingstarted/mailkit
                var dateToFilter = new DateTime(2018, 11, 04);
                var query        = SearchQuery.All.And(SearchQuery.DeliveredAfter(dateToFilter));
                var IdsResult    = await mailBox.SearchAsync(query).ConfigureAwait(false);

                count = IdsResult.Count();

                _clientImap4.Disconnect(true);

                Assert.True(count > 0);
            }
        }
예제 #6
0
        public static async Task <List <MeasuredData> > ReceiveEmailAsync(DateTime?dateTime)
        {
            List <MeasuredData> measuredDatas = new List <MeasuredData>();

            try
            {
                using (ImapClient client = new ImapClient())
                {
                    await client.ConnectAsync("imap.gmail.com", 993, true);

                    await client.AuthenticateAsync(FromEmail, Password);

                    IMailFolder inbox = client.Inbox;
                    await inbox.OpenAsync(FolderAccess.ReadOnly);

                    dynamic query;
                    if (dateTime == null)
                    {
                        query = SearchQuery.FromContains("balpisystem");
                    }
                    else
                    {
                        query = SearchQuery.DeliveredAfter(DateTime.Parse(dateTime.Value.AddHours(-24).ToString())) //Message sending time
                                .And(SearchQuery.FromContains("balpisystem"));
                    }
                    foreach (var uid in await inbox.SearchAsync(query))
                    {
                        try
                        {
                            List <string> text    = new List <string>();
                            var           message = await inbox.GetMessageAsync(uid);

                            var html = new HtmlAgilityPack.HtmlDocument();
                            html.LoadHtml(message.HtmlBody);
                            html.DocumentNode.SelectNodes("//span/text()").ToList().ForEach(x => text.Add(x.InnerHtml.Replace("\t", "")));

                            var value = text[text.FindIndex(x => x.Contains("Значение")) + 1];
                            var date  = text[text.FindIndex(x => x.Contains("среднего")) + 1];
                            date = date.Substring(0, date.IndexOf("Central") - 1);
                            var dateTimeServer = DateTime.ParseExact(date, "M/d/yyyy h:mm:ss tt", CultureInfo.InvariantCulture);
                            if (dateTimeServer > dateTime || dateTime == null)
                            {
                                int MeasuredParameterId = 9,
                                    PollutionSourceId   = 5;
                                bool Averaged           = true;
                                measuredDatas.Add(new MeasuredData
                                {
                                    Value               = Convert.ToDecimal(value.Replace(".", CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator)),
                                    DateTime            = dateTimeServer,
                                    MeasuredParameterId = MeasuredParameterId,
                                    PollutionSourceId   = PollutionSourceId,
                                    Averaged            = Averaged
                                });
                            }
                        }
                        catch
                        {
                        }
                    }

                    await client.DisconnectAsync(true);
                }

                return(measuredDatas);
            }
            catch (Exception ex)
            {
                return(measuredDatas);
            }
        }