Beispiel #1
0
        private async Task <(MimeMessage, UniqueId)> CreateEmptyStorageMessageAsync(IMailFolder folder, string messageId, Action <MimeMessage>?initializationCallback)
        {
            var resultMessage = new MimeMessage(new Header(HeaderId.MessageId, messageId));

            resultMessage.From.Add(new MailboxAddress(Constants.AppName, Constants.AppFakeEmail));
            resultMessage.To.Add(new MailboxAddress(Constants.AppName, Constants.AppFakeEmail));
            resultMessage.Date    = new DateTime(2000, 01, 01);
            resultMessage.Subject = Constants.MetadataMessageSubjectPrefix;
            resultMessage.Body    = new Multipart();

            // gives caller the chance to further initialize the message
            if (initializationCallback != null)
            {
                initializationCallback(resultMessage);
            }

            // note: this creates the message on the server AND receives it again - this could be optimized if made more context aware
            await folder.OpenAsync(FolderAccess.ReadWrite);

            logger.Verbose("Creating storage message in folder {FolderPath}", folder.FullName);
            var newId = await folder.AppendAsync(resultMessage, MessageFlags.Seen);

            if (!newId.HasValue)
            {
                throw new TeasmCompanionException("Cannot create storage message");
            }
            resultMessage = await folder.GetMessageAsync(newId.Value);

            logger.Debug("Created storage message in folder {FolderPath} with {@ID}", folder.FullName, newId);
            return(resultMessage, newId.Value);
        }
Beispiel #2
0
        public virtual async Task <UniqueId?> AppendMessage(MimeMessage mimeMessage, bool asNotSeen = false)
        {
            var flags = asNotSeen ? MessageFlags.None : MessageFlags.Seen;

            if (_mailFolder == null)
            {
                _mailFolder = await AuthenticateAsync();
            }
            await _mailFolder.OpenAsync(FolderAccess.ReadWrite);

            return(await _mailFolder.AppendAsync(mimeMessage));
        }
Beispiel #3
0
        private static async Task RunAsync(MailSortConfig config)
        {
            var rules = GetRules(config.ConfigFile).ToList();

            if (rules.Count == 0)
            {
                throw new Exception("No rules found. Please define rules first.");
            }

            IEnumerable <Tuple <Func <MimeMessage, bool>, string> > predicatesAndTargetFolders =
                rules.Where(r => !r.IsCombinationRule)
                .Select(r => Tuple.Create(BuildPredicate(GetCombinedRules(r, new Queue <MailSortRule>(new[] { r }), rules)), r.TargetFolder)).ToList();

            using var imapClient = new ImapClient();
            await imapClient.ConnectAsync(config.Host, config.UseSsl?EncryptedImapPort : ImapPort, config.UseSsl).ConfigureAwait(false);

            await imapClient.AuthenticateAsync(config.Username, config.Password).ConfigureAwait(false);

            var inbox = imapClient.Inbox;
            await inbox.OpenAsync(FolderAccess.ReadWrite).ConfigureAwait(false);

            var summaries = await inbox.FetchAsync(0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.InternalDate | MessageSummaryItems.Flags);

            foreach (var summary in summaries)
            {
                if (summary.Flags !.Value.HasFlag(MessageFlags.Deleted))
                {
                    continue;
                }

                var message = await inbox.GetMessageAsync(summary.UniqueId).ConfigureAwait(false);

                var tuple = predicatesAndTargetFolders.FirstOrDefault(t => t.Item1(message));
                if (tuple == null)
                {
                    continue;
                }

                IMailFolder destinationFolder = null !;
                try
                {
                    destinationFolder = await imapClient.GetFolderAsync(tuple.Item2).ConfigureAwait(false);
                }
                catch (FolderNotFoundException)
                {
                    var folders = await imapClient.GetFoldersAsync(imapClient.PersonalNamespaces[0]).ConfigureAwait(false);

                    Console.WriteLine($"The folder '{tuple.Item2}' was not found. The following folders are available: {string.Join(", ", folders.Select(f => f.Name))}");
                    Environment.Exit(1);
                }

                await destinationFolder.OpenAsync(FolderAccess.ReadWrite).ConfigureAwait(false);

                await destinationFolder.AppendAsync(message, summary.Flags !.Value, summary.InternalDate !.Value).ConfigureAwait(false);

                await destinationFolder.CloseAsync().ConfigureAwait(false);

                await inbox.OpenAsync(FolderAccess.ReadWrite).ConfigureAwait(false);

                await inbox.AddFlagsAsync(summary.UniqueId, MessageFlags.Deleted, true).ConfigureAwait(false);
            }

            await inbox.CloseAsync(true).ConfigureAwait(false);
        }