Example #1
0
        public async Task GetAllMailsAsync()
        {
            _retrievalClient.SetMailFolder(_settings.MailFolderName);
            var uIds = await _retrievalClient.GetUIds(new ImapFilter());

            var existingMails = await _repo.GetExistingUidsAsync(_settings.MailFolderName);

            var        existingUids = existingMails.Select(x => x.UniqueId).ToList();
            ImapFilter uIdFilter    = new();

            if (existingUids.Count > 0)
            {
                uIdFilter = new ImapFilter().Uids(uIds.Where(x => !existingUids.Contains(x.Id)).ToList());
            }

            await foreach (var imapMessage in _mailConverter.GetMessagesAsync(uIdFilter))
            {
                try
                {
                    var email = await _repo.SaveEmailAsync(imapMessage);

                    if (email == null)
                    {
                        _logger.LogInformation($"Email from imap folder '{imapMessage.MailFolder}', uId '{imapMessage.UId}' could not be saved to database.");
                        continue;
                    }

                    var fullFileName = Path.Combine(_settings.DownloadDirectory, EXPORT_PATH, CleanUpMailFolderName(_settings.MailFolderName), email.FileName + IME_FILE_EXTENSION);

                    if (!await _fileSystem.TryWriteAllBytesAsync(fullFileName, imapMessage.MimeMessageBytes))
                    {
                        await _repo.DeleteEmailAsync(email);

                        _logger.LogInformation($"Email from imap folder '{imapMessage.MailFolder}', uId '{imapMessage.UId}' could not be saved to disc.");
                    }
                }
                catch (System.Exception ex)
                {
                    _logger.LogError(ex.Message);
                }
            }
        }