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); }
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)); }
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); }