diff --git a/OpaqueMail/Imap/ImapClient.Synchronous.cs b/OpaqueMail/Imap/ImapClient.Synchronous.cs index be61ba2..fc8b510 100644 --- a/OpaqueMail/Imap/ImapClient.Synchronous.cs +++ b/OpaqueMail/Imap/ImapClient.Synchronous.cs @@ -697,9 +697,9 @@ public bool RenameMailbox(string currentMailboxName, string newMailboxName) /// Perform a search in the current mailbox and return all matching messages. /// /// Well-formatted IMAP search criteria. - public List Search(string searchQuery) + public List Search(string searchQuery, bool headersOnly = false, bool setSeenFlag = false) { - return Task.Run(() => SearchAsync(searchQuery)).Result; + return Task.Run(() => SearchAsync(searchQuery, headersOnly, setSeenFlag)).Result; } /// diff --git a/OpaqueMail/Imap/ImapClient.cs b/OpaqueMail/Imap/ImapClient.cs index 803cada..68acc90 100644 --- a/OpaqueMail/Imap/ImapClient.cs +++ b/OpaqueMail/Imap/ImapClient.cs @@ -1979,7 +1979,7 @@ public async Task RenameMailboxAsync(string currentMailboxName, string new /// Perform a search in the current mailbox and return all matching messages. /// /// Well-formatted IMAP search criteria. - public async Task> SearchAsync(string searchQuery) + public async Task> SearchAsync(string searchQuery, bool headersOnly = false, bool setSeenFlag = false) { // Protect against commands being called out of order. if (!IsAuthenticated) @@ -2009,7 +2009,7 @@ public async Task> SearchAsync(string searchQuery) int numericMessageID = -1; if (int.TryParse(messageID, out numericMessageID)) { - MailMessage message = await GetMessageAsync(int.Parse(messageID)); + MailMessage message = await GetMessageAsync(CurrentMailboxName, int.Parse(messageID), headersOnly, setSeenFlag); if (message != null) messages.Add(message); } @@ -2299,6 +2299,8 @@ private async void CheckIdle(object idleInitializedTimeObject) private async Task GetMessageHelper(string mailboxName, int id, bool headersOnly, bool setSeenFlag, bool isUid) { MessagePartialHelper helper = await GetMessagePartialHelper(mailboxName, id, headersOnly, setSeenFlag, -1, -1, isUid); + if (helper == null) + return null; MailMessage message = new MailMessage(helper.MessageString, ProcessingFlags); message.ImapUid = helper.ImapUid; @@ -2376,14 +2378,17 @@ private async Task GetMessagePartialHelper(string mailboxN { // Read the message's UID and flags. int uid = 0; - if (!int.TryParse(Functions.ReturnBetween(response, "\r\n UID ", " "), out uid)) - { + int.TryParse(Functions.ReturnBetween(response, "\r\n UID ", " "), out uid); + if (uid == 0) int.TryParse(Functions.ReturnBetween(response, "\r\n UID ", ")"), out uid); - } - else if (!int.TryParse(Functions.ReturnBetween(response, "\r\nUID ", " "), out uid)) - { + if (uid == 0) + int.TryParse(Functions.ReturnBetween(response, "\r\nUID ", " "), out uid); + if (uid == 0) int.TryParse(Functions.ReturnBetween(response, "\r\nUID ", ")"), out uid); - } + if (uid == 0) + int.TryParse(Functions.ReturnBetween(response, "UID ", " "), out uid); + if (uid == 0) + int.TryParse(Functions.ReturnBetween(response, "UID ", ")"), out uid); string flagsString = Functions.ReturnBetween(response, "FLAGS (", ")"); // Strip IMAP response padding.