Adjusting multiple popups and general refactoring

This commit is contained in:
2026-03-20 22:47:28 +00:00
parent 3edc2ee208
commit 72dda149a9
2 changed files with 496 additions and 855 deletions
+255 -497
View File
File diff suppressed because it is too large Load Diff
+241 -358
View File
@@ -4,7 +4,6 @@ using System.Text.RegularExpressions;
using System.IO;
using System.Text.Json;
using System.Windows.Forms;
using System.Threading.Tasks;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace OutlookCaseHelper
@@ -13,11 +12,18 @@ namespace OutlookCaseHelper
{
private Outlook.Application? outlookApp;
private Outlook.NameSpace? outlookNamespace;
private HashSet<string> activeRules = new HashSet<string>();
private HashSet<string> activeRules = new();
private readonly string rulesFilePath;
private Outlook.Items? inboxItems;
private Outlook.Items? sentItems;
public class RuleInfo
{
public string FolderName { get; set; } = "";
public string TrackingId { get; set; } = "";
public int EmailCount { get; set; }
}
public OutlookHelper()
{
rulesFilePath = Path.Combine(
@@ -28,14 +34,16 @@ namespace OutlookCaseHelper
LoadRules();
}
// --- Outlook Connection ---
private bool EnsureOutlookConnected()
{
if (outlookApp != null && outlookNamespace != null) return true;
try
{
var outlookProcess = System.Diagnostics.Process.GetProcessesByName("OUTLOOK");
if (outlookProcess.Length == 0) return false;
if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Length == 0)
return false;
outlookApp = new Outlook.Application();
outlookNamespace = outlookApp.GetNamespace("MAPI");
@@ -50,26 +58,29 @@ namespace OutlookCaseHelper
{
try
{
Outlook.Folder? inboxFolder =
outlookNamespace?.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
Outlook.Folder? sentFolder =
outlookNamespace?.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
var sent = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
if (inboxFolder != null)
if (inbox != null)
{
inboxItems = inboxFolder.Items;
inboxItems = inbox.Items;
inboxItems.ItemAdd += OnEmailReceived;
}
if (sentFolder != null)
if (sent != null)
{
sentItems = sentFolder.Items;
sentItems = sent.Items;
sentItems.ItemAdd += OnEmailSent;
}
}
catch { }
}
private void OnEmailReceived(object item)
// --- Email Events ---
private void OnEmailReceived(object item) => MoveEmailIfRuleExists(item);
private void OnEmailSent(object item) => MoveEmailIfRuleExists(item);
private void MoveEmailIfRuleExists(object item)
{
try
{
@@ -81,214 +92,88 @@ namespace OutlookCaseHelper
foreach (var folderName in activeRules)
{
string trackingId = ExtractTrackingId(folderName);
if (mail.Subject.Contains($"TrackingID#{trackingId}"))
{
Outlook.Folder? inboxFolder =
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return;
if (!mail.Subject.Contains($"TrackingID#{trackingId}")) continue;
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases");
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active");
Outlook.Folder trackingFolder = GetOrCreateFolder(activeFolder, folderName);
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
if (inbox == null) return;
mail.Move(trackingFolder);
break;
}
var target = GetOrCreateFolder(GetOrCreateFolder(GetOrCreateFolder(inbox, "Cases"), "Active"), folderName);
mail.Move(target);
break;
}
}
catch { }
}
private void OnEmailSent(object item)
{
try
{
if (outlookNamespace == null) return;
if (activeRules.Count == 0) return;
if (item is not Outlook.MailItem mail) return;
if (mail.Subject == null) return;
// --- Rules Management ---
foreach (var folderName in activeRules)
{
string trackingId = ExtractTrackingId(folderName);
if (mail.Subject.Contains($"TrackingID#{trackingId}"))
{
Outlook.Folder? inboxFolder =
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return;
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases");
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active");
Outlook.Folder trackingFolder = GetOrCreateFolder(activeFolder, folderName);
mail.Move(trackingFolder);
break;
}
}
}
catch { }
}
private string ExtractTrackingId(string folderName)
{
var match = Regex.Match(folderName, @"^(\d+)");
return match.Success ? match.Groups[1].Value : folderName;
}
public HashSet<string> GetActiveRules() => activeRules;
public string? FindRuleByTrackingId(string trackingId)
{
foreach (var rule in activeRules)
{
if (ExtractTrackingId(rule) == trackingId)
return rule;
}
if (ExtractTrackingId(rule) == trackingId) return rule;
return null;
}
public bool ExistsInClosed(string trackingId)
{
try
{
if (!EnsureOutlookConnected()) return false;
Outlook.Folder? inboxFolder =
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return false;
Outlook.Folder? casesFolder = GetFolder(inboxFolder, "Cases");
if (casesFolder == null) return false;
Outlook.Folder? closedFolder = GetFolder(casesFolder, "Closed");
if (closedFolder == null) return false;
return GetFolderStartingWith(closedFolder, trackingId) != null;
}
catch { return false; }
}
private void LoadRules()
{
try
{
if (File.Exists(rulesFilePath))
{
var json = File.ReadAllText(rulesFilePath);
var rules = JsonSerializer.Deserialize<List<string>>(json);
if (rules != null)
activeRules = new HashSet<string>(rules);
}
}
catch { }
}
private void SaveRules()
{
try
{
var json = JsonSerializer.Serialize(new List<string>(activeRules));
File.WriteAllText(rulesFilePath, json);
}
catch { }
}
public void ReloadRules()
{
activeRules.Clear();
LoadRules();
}
public HashSet<string> GetActiveRules() => activeRules;
public void ProcessActiveRules() { }
private void LoadRules()
{
try
{
if (!File.Exists(rulesFilePath)) return;
var rules = JsonSerializer.Deserialize<List<string>>(File.ReadAllText(rulesFilePath));
if (rules != null) activeRules = new HashSet<string>(rules);
}
catch { }
}
private void SaveRules()
{
try { File.WriteAllText(rulesFilePath, JsonSerializer.Serialize(new List<string>(activeRules))); }
catch { }
}
// --- Outlook Operations ---
public string? GetSelectedEmailTrackingId()
{
if (!EnsureOutlookConnected()) return null;
try
{
Outlook.Explorer activeExplorer = outlookApp!.ActiveExplorer();
if (activeExplorer == null) return null;
Outlook.Selection selection = activeExplorer.Selection;
if (selection.Count == 0) return null;
Outlook.MailItem? email = selection[1] as Outlook.MailItem;
var email = outlookApp!.ActiveExplorer()?.Selection?[1] as Outlook.MailItem;
if (email == null) return null;
Match match = Regex.Match(email.Subject, @"TrackingID#(\d+)");
if (match.Success)
return match.Groups[1].Value;
return null;
var match = Regex.Match(email.Subject, @"TrackingID#(\d+)");
return match.Success ? match.Groups[1].Value : null;
}
catch { return null; }
}
public bool ReopenFromClosed(string trackingId, Outlook.MailItem? triggerEmail = null)
public Outlook.MailItem? GetSelectedEmail()
{
if (!EnsureOutlookConnected()) return null;
try { return outlookApp!.ActiveExplorer()?.Selection?[1] as Outlook.MailItem; }
catch { return null; }
}
public bool ExistsInClosed(string trackingId)
{
if (!EnsureOutlookConnected()) return false;
try
{
Outlook.Folder? inboxFolder =
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return false;
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases");
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active");
Outlook.Folder? closedFolder = GetFolder(casesFolder, "Closed");
if (closedFolder == null) return false;
Outlook.Folder? closedTracking = GetFolderStartingWith(closedFolder, trackingId);
if (closedTracking == null) return false;
string existingName = closedTracking.Name;
Outlook.Folder? existingActive = GetFolder(activeFolder, existingName);
if (existingActive != null)
{
var toMove = new List<Outlook.MailItem>();
foreach (object item in closedTracking.Items)
if (item is Outlook.MailItem mail) toMove.Add(mail);
foreach (var mail in toMove)
mail.Move(existingActive);
try { closedTracking.Delete(); } catch { }
}
else
{
closedTracking.MoveTo(activeFolder);
}
if (triggerEmail != null)
{
try
{
Outlook.Folder? targetFolder = GetFolder(activeFolder, existingName);
if (targetFolder != null)
triggerEmail.Move(targetFolder);
}
catch { }
}
activeRules.Add(existingName);
SaveRules();
return true;
}
catch
{
try
{
Outlook.Folder? inboxFolder =
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
Outlook.Folder? casesFolder = GetFolder(inboxFolder!, "Cases");
Outlook.Folder? activeFolder = GetFolder(casesFolder!, "Active");
Outlook.Folder? movedFolder = GetFolderStartingWith(activeFolder!, trackingId);
if (movedFolder != null)
{
activeRules.Add(movedFolder.Name);
SaveRules();
return true;
}
}
catch { }
return false;
if (!EnsureOutlookConnected()) return false;
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
if (inbox == null) return false;
var closed = GetFolder(GetFolder(inbox, "Cases"), "Closed");
return closed != null && GetFolderStartingWith(closed, trackingId) != null;
}
catch { return false; }
}
public bool CreateFolderAndMoveEmails(string trackingId, string folderName)
@@ -296,31 +181,23 @@ namespace OutlookCaseHelper
if (!EnsureOutlookConnected()) return false;
try
{
Outlook.Folder? inboxFolder =
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return false;
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases");
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active");
Outlook.Folder trackingFolder = GetOrCreateFolder(activeFolder, folderName);
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
if (inbox == null) return false;
var target = GetOrCreateFolder(GetOrCreateFolder(GetOrCreateFolder(inbox, "Cases"), "Active"), folderName);
string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'";
MoveFilteredEmails(inboxFolder, filter, trackingFolder);
MoveFilteredEmails(inbox, filter, target);
Outlook.Folder? sentFolder =
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
if (sentFolder != null)
MoveFilteredEmails(sentFolder, filter, trackingFolder);
var sent = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
if (sent != null) MoveFilteredEmails(sent, filter, target);
foreach (Outlook.Folder folder in inboxFolder.Parent.Folders)
foreach (Outlook.Folder folder in inbox.Parent.Folders)
{
if (folder.Name != "Cases" &&
folder.EntryID != inboxFolder.EntryID &&
folder.EntryID != sentFolder?.EntryID)
{
try { MoveFilteredEmails(folder, filter, trackingFolder); } catch { }
}
folder.EntryID != inbox.EntryID &&
folder.EntryID != sent?.EntryID)
try { MoveFilteredEmails(folder, filter, target); } catch { }
}
activeRules.Add(folderName);
@@ -334,41 +211,20 @@ namespace OutlookCaseHelper
}
}
private void MoveFilteredEmails(Outlook.Folder source, string filter, Outlook.Folder dest)
{
try
{
Outlook.Items restricted = source.Items.Restrict(filter);
var toMove = new List<Outlook.MailItem>();
foreach (object item in restricted)
if (item is Outlook.MailItem mail) toMove.Add(mail);
foreach (var mail in toMove)
mail.Move(dest);
}
catch { }
}
public bool RemoveRuleAndMoveToClosed(string folderName)
{
if (!EnsureOutlookConnected()) return false;
try
{
Outlook.Folder? inboxFolder =
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return false;
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
if (inbox == null) return false;
Outlook.Folder? casesFolder = GetFolder(inboxFolder, "Cases");
if (casesFolder == null) return false;
Outlook.Folder? activeFolder = GetFolder(casesFolder, "Active");
if (activeFolder == null) return false;
Outlook.Folder? trackingFolder = GetFolder(activeFolder, folderName);
if (trackingFolder == null) return false;
Outlook.Folder closedFolder = GetOrCreateFolder(casesFolder, "Closed");
trackingFolder.MoveTo(closedFolder);
var cases = GetFolder(inbox, "Cases");
var active = GetFolder(cases, "Active");
var folder = GetFolder(active, folderName);
if (folder == null) return false;
folder.MoveTo(GetOrCreateFolder(cases!, "Closed"));
activeRules.Remove(folderName);
SaveRules();
return true;
@@ -381,17 +237,9 @@ namespace OutlookCaseHelper
if (!EnsureOutlookConnected()) return false;
try
{
Outlook.Folder? inboxFolder =
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return false;
Outlook.Folder? casesFolder = GetFolder(inboxFolder, "Cases");
if (casesFolder == null) return false;
Outlook.Folder? activeFolder = GetFolder(casesFolder, "Active");
if (activeFolder == null) return false;
Outlook.Folder? folder = GetFolder(activeFolder, oldFolderName);
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
var active = GetFolder(GetFolder(inbox, "Cases"), "Active");
var folder = GetFolder(active, oldFolderName);
if (folder == null) return false;
folder.Name = newFolderName;
@@ -403,40 +251,163 @@ namespace OutlookCaseHelper
catch { return false; }
}
public void RunAllRules()
public bool ReopenFromClosed(string trackingId, Outlook.MailItem? triggerEmail = null)
{
if (!EnsureOutlookConnected()) return;
if (activeRules.Count == 0) return;
if (!EnsureOutlookConnected()) return false;
try
{
Outlook.Folder? inboxFolder =
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return;
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
if (inbox == null) return false;
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases");
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active");
var cases = GetOrCreateFolder(inbox, "Cases");
var active = GetOrCreateFolder(cases, "Active");
var closed = GetFolder(cases, "Closed");
if (closed == null) return false;
var rootFolder = inboxFolder.Parent as Outlook.Folder;
var allFolders = new List<Outlook.Folder>();
if (rootFolder != null)
GetAllFolders(rootFolder, allFolders, casesFolder.EntryID);
var closedTracking = GetFolderStartingWith(closed, trackingId);
if (closedTracking == null) return false;
string existingName = closedTracking.Name;
var existingActive = GetFolder(active, existingName);
if (existingActive != null)
{
var toMove = new List<Outlook.MailItem>();
foreach (object item in closedTracking.Items)
if (item is Outlook.MailItem m) toMove.Add(m);
foreach (var m in toMove) m.Move(existingActive);
try { closedTracking.Delete(); } catch { }
}
else
{
closedTracking.MoveTo(active);
}
try
{
var target = GetFolder(active, existingName);
if (triggerEmail != null && target != null)
triggerEmail.Move(target);
}
catch { }
activeRules.Add(existingName);
SaveRules();
return true;
}
catch
{
try
{
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
var active = GetFolder(GetFolder(inbox, "Cases"), "Active");
var moved = GetFolderStartingWith(active!, trackingId);
if (moved != null) { activeRules.Add(moved.Name); SaveRules(); return true; }
}
catch { }
return false;
}
}
// --- Scan & Run Rules ---
public void ScanInboxOnStartup()
{
if (activeRules.Count == 0 || !EnsureOutlookConnected()) return;
try
{
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
var sent = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
if (inbox == null) return;
var active = GetOrCreateFolder(GetOrCreateFolder(inbox, "Cases"), "Active");
foreach (var folderName in activeRules)
{
string trackingId = ExtractTrackingId(folderName);
string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'";
Outlook.Folder trackingFolder = GetOrCreateFolder(activeFolder, folderName);
var target = GetOrCreateFolder(active, folderName);
MoveFilteredEmails(inbox, filter, target);
if (sent != null) MoveFilteredEmails(sent, filter, target);
}
}
catch { }
}
public void RunAllRules()
{
if (activeRules.Count == 0 || !EnsureOutlookConnected()) return;
try
{
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
if (inbox == null) return;
var cases = GetOrCreateFolder(inbox, "Cases");
var active = GetOrCreateFolder(cases, "Active");
var allFolders = new List<Outlook.Folder>();
if (inbox.Parent is Outlook.Folder root)
GetAllFolders(root, allFolders, cases.EntryID);
foreach (var folderName in activeRules)
{
string trackingId = ExtractTrackingId(folderName);
string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'";
var target = GetOrCreateFolder(active, folderName);
foreach (var folder in allFolders)
{
try { MoveFilteredEmails(folder, filter, trackingFolder); } catch { }
}
try { MoveFilteredEmails(folder, filter, target); } catch { }
}
}
catch { }
}
public List<RuleInfo> GetActiveRulesInfo()
{
var result = new List<RuleInfo>();
if (!EnsureOutlookConnected()) return result;
try
{
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
var active = GetFolder(GetFolder(inbox, "Cases"), "Active");
if (active == null) return result;
foreach (var folderName in activeRules)
{
var folder = GetFolder(active, folderName);
result.Add(new RuleInfo
{
FolderName = folderName,
TrackingId = ExtractTrackingId(folderName),
EmailCount = folder?.Items.Count ?? 0
});
}
}
catch { }
return result;
}
// --- Helpers ---
private string ExtractTrackingId(string folderName)
{
var match = Regex.Match(folderName, @"^(\d+)");
return match.Success ? match.Groups[1].Value : folderName;
}
private void MoveFilteredEmails(Outlook.Folder source, string filter, Outlook.Folder dest)
{
try
{
var toMove = new List<Outlook.MailItem>();
foreach (object item in source.Items.Restrict(filter))
if (item is Outlook.MailItem mail) toMove.Add(mail);
foreach (var mail in toMove) mail.Move(dest);
}
catch { }
}
private void GetAllFolders(Outlook.Folder parent, List<Outlook.Folder> result, string excludeEntryId)
{
foreach (Outlook.Folder folder in parent.Folders)
@@ -452,118 +423,30 @@ namespace OutlookCaseHelper
}
}
public void ScanInboxOnStartup()
{
if (activeRules.Count == 0) return;
if (!EnsureOutlookConnected()) return;
try
{
Outlook.Folder? inboxFolder =
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return;
Outlook.Folder? sentFolder =
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases");
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active");
foreach (var folderName in activeRules)
{
string trackingId = ExtractTrackingId(folderName);
string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'";
Outlook.Folder trackingFolder = GetOrCreateFolder(activeFolder, folderName);
MoveFilteredEmails(inboxFolder, filter, trackingFolder);
if (sentFolder != null)
MoveFilteredEmails(sentFolder, filter, trackingFolder);
}
}
catch { }
}
public class RuleInfo
{
public string FolderName { get; set; } = "";
public string TrackingId { get; set; } = "";
public int EmailCount { get; set; }
}
public List<RuleInfo> GetActiveRulesInfo()
{
var result = new List<RuleInfo>();
if (!EnsureOutlookConnected()) return result;
try
{
Outlook.Folder? inboxFolder =
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return result;
Outlook.Folder? casesFolder = GetFolder(inboxFolder, "Cases");
if (casesFolder == null) return result;
Outlook.Folder? activeFolder = GetFolder(casesFolder, "Active");
if (activeFolder == null) return result;
foreach (var folderName in activeRules)
{
Outlook.Folder? folder = GetFolder(activeFolder, folderName);
result.Add(new RuleInfo
{
FolderName = folderName,
TrackingId = ExtractTrackingId(folderName),
EmailCount = folder?.Items.Count ?? 0
});
}
}
catch { }
return result;
}
public void ProcessActiveRules() { }
private Outlook.Folder? GetDefaultFolder(Outlook.OlDefaultFolders type)
=> outlookNamespace?.GetDefaultFolder(type) as Outlook.Folder;
private Outlook.Folder GetOrCreateFolder(Outlook.Folder parent, string name)
{
foreach (Outlook.Folder folder in parent.Folders)
if (folder.Name == name) return folder;
foreach (Outlook.Folder f in parent.Folders)
if (f.Name == name) return f;
return (Outlook.Folder)parent.Folders.Add(name);
}
private Outlook.Folder? GetFolder(Outlook.Folder parent, string name)
private Outlook.Folder? GetFolder(Outlook.Folder? parent, string name)
{
foreach (Outlook.Folder folder in parent.Folders)
if (folder.Name == name) return folder;
if (parent == null) return null;
foreach (Outlook.Folder f in parent.Folders)
if (f.Name == name) return f;
return null;
}
private Outlook.Folder? GetFolderStartingWith(Outlook.Folder parent, string trackingId)
{
foreach (Outlook.Folder folder in parent.Folders)
{
string name = folder.Name;
if (name == trackingId ||
name.StartsWith(trackingId + " ") ||
name.StartsWith(trackingId + "|"))
return folder;
}
foreach (Outlook.Folder f in parent.Folders)
if (f.Name == trackingId || f.Name.StartsWith(trackingId + " ") || f.Name.StartsWith(trackingId + "|"))
return f;
return null;
}
public Outlook.MailItem? GetSelectedEmail()
{
if (!EnsureOutlookConnected()) return null;
try
{
Outlook.Explorer activeExplorer = outlookApp!.ActiveExplorer();
if (activeExplorer == null) return null;
Outlook.Selection selection = activeExplorer.Selection;
if (selection.Count == 0) return null;
return selection[1] as Outlook.MailItem;
}
catch { return null; }
}
}
}