Example #1
0
 public RetrievalTests()
 {
     Credentials            = ConfigHelper.GetCredentials();
     RetrievalConfiguration = ConfigHelper.GetRetrievalConfiguration();
     Mail2DB       = new GenericClient(Credentials);
     Converter     = new MailTypeConverter(Mail2DB);
     DefaultFilter = new ImapFilter().NotSeen(); // younger than two days
 }
Example #2
0
 public ImapService(IRetrievalClient retrievalClient, ILookupRepository repo, IFileSystem fileSystem, AppSettings settings, ILogger <ImapService> logger)
 {
     _mailConverter   = new MailTypeConverter(retrievalClient);
     _retrievalClient = retrievalClient;
     _repo            = repo;
     _fileSystem      = fileSystem;
     _settings        = settings;
     _logger          = logger;
 }
Example #3
0
        private async Task <ImeFile> GetSingleImeFileAsync(CancellationToken cancellationToken = default)
        {
            var bytes = await File.ReadAllBytesAsync(_settings.ImeFilePath, cancellationToken);

            var imapMessage = await MailTypeConverter.DeserializeMimeMessageAsync(bytes, null);

            return(new ImeFile()
            {
                FileInfo = new System.IO.FileInfo(_settings.ImeFilePath),
                ImapMessage = imapMessage
            });
        }
Example #4
0
        public async Task Deserialisation()
        {
            var list = await Converter.GetMessages(new ImapFilter().Uids(RetrievalConfiguration.UidWithAttachments));

            var oneMsg = list.FirstOrDefault();

            oneMsg.Should().NotBeNull();
            var imapMsg = await MailTypeConverter.DeserializeMimeMessageAsync(oneMsg.MimeMessageBytes, oneMsg.UId);

            oneMsg.Subject.Should().Be(imapMsg.Subject);
            Console.WriteLine("Deserialized message subject: '" + imapMsg.Subject + "'");
        }
Example #5
0
        private async IAsyncEnumerable <ImeFile> GetFilesInDirectoryAsync([EnumeratorCancellation] CancellationToken cancellationToken = default)
        {
            var files = Directory.GetFiles(_settings.InputDirectoryPath, "*.ime");

            foreach (var file in files.Select(x => new FileInfo(x)))
            {
                var bytes = await File.ReadAllBytesAsync(file.FullName, cancellationToken);

                yield return(new ImeFile
                {
                    FileInfo = file,
                    ImapMessage = await MailTypeConverter.DeserializeMimeMessageAsync(bytes, null)
                });
            }
        }
        private async Task ProcessAccount(Credentials imapCreds, DataAccount account)
        {
            var mail2db          = new Client(imapCreds);
            var converter        = new MailTypeConverter(mail2db);
            var availableFolders = await mail2db.GetMailFolders();

            var folders = mailFolders.IntersectCaseIgnore(availableFolders).ToList();
            var filter  = new ImapFilter();

            foreach (var mailFolder in folders)
            {
                if (InvalidMailfolder(mailFolder))
                {
                    continue;
                }

                try {
                    mail2db.SetMailFolder(mailFolder);
                    var countInFolder = await mail2db.GetTotalMailCount();

                    if (mail2db.OpenedMailFolder.IsNullOrEmpty())
                    {
                        continue;
                    }
                    Console.WriteLine($"{account.EmailAddress}  mail folder: '{mail2db.OpenedMailFolder}'");
                    Console.WriteLine($"Total Count: {countInFolder}");
                    var savedMessages = await db.Query(SqlBase <DataMessage> .TableName)
                                        .Select(nameof(DataMessage.EmailAccountId), nameof(DataMessage.UId), nameof(DataMessage.MailFolder))
                                        .Where(new { EmailAccountId = account.Id, MailFolder = mailFolder })
                                        .GetAsync <DataMessage>();

                    Console.WriteLine("Existing Uids: {0}", savedMessages.Count());
                    Console.WriteLine("===================\n");

                    converter.UIdsToExclude = savedMessages.Select(x => x.UId).ToArray();

                    async Task ProcessImapMessage(ImapMessage item)
                    {
                        //var TA = db.Connection.BeginTransaction();
                        Console.WriteLine("Saving: {0}\t{1}\"{2}\"", item?.ReceivedAtLocal,
                                          SpacePadding(item?.From?.EmailAddress),
                                          item?.Subject);
                        try {
                            if (!savedMessages.MessageExists(item.UId, item.MailFolder, account.Id))
                            {
                                var msgId = await db.Query(SqlBase <DataMessage> .TableName).InsertGetIdAsync <uint>(item.ToData(account.Id));

                                foreach (var contact in item.ToDataContact(msgId))
                                {
                                    await db.Query(SqlBase <DataContact> .TableName).InsertAsync(contact);
                                }
                                if (item.HasAttachments)
                                {
                                    foreach (var file in item.ToAttachment(msgId))
                                    {
                                        Console.WriteLine("Saving Attachment: {0}", file.Filename);
                                        await db.Query(SqlBase <DataAttachment> .TableName).InsertAsync(file);
                                    }
                                }
                            }
                            //TA.Commit();
                        } catch (Exception ex) {
                            //TA.Rollback();
                            Console.WriteLine(ex.Message);
                        }
                    }

                    await converter.GetMessagesAsync(ProcessImapMessage, filter);
                } catch (Exception ex2) {
                    Console.WriteLine(ex2.Message);
                }
                GC.Collect();
                Console.WriteLine("\n");
            }
        }