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
+252 -494
View File
File diff suppressed because it is too large Load Diff
+238 -355
View File
@@ -4,7 +4,6 @@ using System.Text.RegularExpressions;
using System.IO; using System.IO;
using System.Text.Json; using System.Text.Json;
using System.Windows.Forms; using System.Windows.Forms;
using System.Threading.Tasks;
using Outlook = Microsoft.Office.Interop.Outlook; using Outlook = Microsoft.Office.Interop.Outlook;
namespace OutlookCaseHelper namespace OutlookCaseHelper
@@ -13,11 +12,18 @@ namespace OutlookCaseHelper
{ {
private Outlook.Application? outlookApp; private Outlook.Application? outlookApp;
private Outlook.NameSpace? outlookNamespace; private Outlook.NameSpace? outlookNamespace;
private HashSet<string> activeRules = new HashSet<string>(); private HashSet<string> activeRules = new();
private readonly string rulesFilePath; private readonly string rulesFilePath;
private Outlook.Items? inboxItems; private Outlook.Items? inboxItems;
private Outlook.Items? sentItems; private Outlook.Items? sentItems;
public class RuleInfo
{
public string FolderName { get; set; } = "";
public string TrackingId { get; set; } = "";
public int EmailCount { get; set; }
}
public OutlookHelper() public OutlookHelper()
{ {
rulesFilePath = Path.Combine( rulesFilePath = Path.Combine(
@@ -28,14 +34,16 @@ namespace OutlookCaseHelper
LoadRules(); LoadRules();
} }
// --- Outlook Connection ---
private bool EnsureOutlookConnected() private bool EnsureOutlookConnected()
{ {
if (outlookApp != null && outlookNamespace != null) return true; if (outlookApp != null && outlookNamespace != null) return true;
try try
{ {
var outlookProcess = System.Diagnostics.Process.GetProcessesByName("OUTLOOK"); if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Length == 0)
if (outlookProcess.Length == 0) return false; return false;
outlookApp = new Outlook.Application(); outlookApp = new Outlook.Application();
outlookNamespace = outlookApp.GetNamespace("MAPI"); outlookNamespace = outlookApp.GetNamespace("MAPI");
@@ -50,26 +58,29 @@ namespace OutlookCaseHelper
{ {
try try
{ {
Outlook.Folder? inboxFolder = var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
outlookNamespace?.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder; var sent = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
Outlook.Folder? sentFolder =
outlookNamespace?.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
if (inboxFolder != null) if (inbox != null)
{ {
inboxItems = inboxFolder.Items; inboxItems = inbox.Items;
inboxItems.ItemAdd += OnEmailReceived; inboxItems.ItemAdd += OnEmailReceived;
} }
if (sentFolder != null) if (sent != null)
{ {
sentItems = sentFolder.Items; sentItems = sent.Items;
sentItems.ItemAdd += OnEmailSent; sentItems.ItemAdd += OnEmailSent;
} }
} }
catch { } 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 try
{ {
@@ -81,214 +92,88 @@ namespace OutlookCaseHelper
foreach (var folderName in activeRules) foreach (var folderName in activeRules)
{ {
string trackingId = ExtractTrackingId(folderName); string trackingId = ExtractTrackingId(folderName);
if (mail.Subject.Contains($"TrackingID#{trackingId}")) if (!mail.Subject.Contains($"TrackingID#{trackingId}")) continue;
{
Outlook.Folder? inboxFolder =
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return;
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases"); var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active"); if (inbox == null) return;
Outlook.Folder trackingFolder = GetOrCreateFolder(activeFolder, folderName);
mail.Move(trackingFolder); var target = GetOrCreateFolder(GetOrCreateFolder(GetOrCreateFolder(inbox, "Cases"), "Active"), folderName);
mail.Move(target);
break; break;
} }
} }
}
catch { } catch { }
} }
private void OnEmailSent(object item) // --- Rules Management ---
{
try
{
if (outlookNamespace == null) return;
if (activeRules.Count == 0) return;
if (item is not Outlook.MailItem mail) return;
if (mail.Subject == null) return;
foreach (var folderName in activeRules) public HashSet<string> GetActiveRules() => 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 string? FindRuleByTrackingId(string trackingId) public string? FindRuleByTrackingId(string trackingId)
{ {
foreach (var rule in activeRules) foreach (var rule in activeRules)
{ if (ExtractTrackingId(rule) == trackingId) return rule;
if (ExtractTrackingId(rule) == trackingId)
return rule;
}
return null; 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() public void ReloadRules()
{ {
activeRules.Clear(); activeRules.Clear();
LoadRules(); 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() public string? GetSelectedEmailTrackingId()
{ {
if (!EnsureOutlookConnected()) return null; if (!EnsureOutlookConnected()) return null;
try try
{ {
Outlook.Explorer activeExplorer = outlookApp!.ActiveExplorer(); var email = outlookApp!.ActiveExplorer()?.Selection?[1] as Outlook.MailItem;
if (activeExplorer == null) return null;
Outlook.Selection selection = activeExplorer.Selection;
if (selection.Count == 0) return null;
Outlook.MailItem? email = selection[1] as Outlook.MailItem;
if (email == null) return null; if (email == null) return null;
var match = Regex.Match(email.Subject, @"TrackingID#(\d+)");
Match match = Regex.Match(email.Subject, @"TrackingID#(\d+)"); return match.Success ? match.Groups[1].Value : null;
if (match.Success)
return match.Groups[1].Value;
return null;
} }
catch { return 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)
{
try
{ {
if (!EnsureOutlookConnected()) return false; if (!EnsureOutlookConnected()) return false;
try var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
{ if (inbox == null) return false;
Outlook.Folder? inboxFolder = var closed = GetFolder(GetFolder(inbox, "Cases"), "Closed");
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder; return closed != null && GetFolderStartingWith(closed, trackingId) != null;
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;
} }
catch { return false; }
} }
public bool CreateFolderAndMoveEmails(string trackingId, string folderName) public bool CreateFolderAndMoveEmails(string trackingId, string folderName)
@@ -296,31 +181,23 @@ namespace OutlookCaseHelper
if (!EnsureOutlookConnected()) return false; if (!EnsureOutlookConnected()) return false;
try try
{ {
Outlook.Folder? inboxFolder = var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder; if (inbox == null) return false;
if (inboxFolder == null) return false;
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases");
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active");
Outlook.Folder trackingFolder = GetOrCreateFolder(activeFolder, folderName);
var target = GetOrCreateFolder(GetOrCreateFolder(GetOrCreateFolder(inbox, "Cases"), "Active"), folderName);
string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'"; string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'";
MoveFilteredEmails(inboxFolder, filter, trackingFolder); MoveFilteredEmails(inbox, filter, target);
Outlook.Folder? sentFolder = var sent = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder; if (sent != null) MoveFilteredEmails(sent, filter, target);
if (sentFolder != null)
MoveFilteredEmails(sentFolder, filter, trackingFolder);
foreach (Outlook.Folder folder in inboxFolder.Parent.Folders) foreach (Outlook.Folder folder in inbox.Parent.Folders)
{ {
if (folder.Name != "Cases" && if (folder.Name != "Cases" &&
folder.EntryID != inboxFolder.EntryID && folder.EntryID != inbox.EntryID &&
folder.EntryID != sentFolder?.EntryID) folder.EntryID != sent?.EntryID)
{ try { MoveFilteredEmails(folder, filter, target); } catch { }
try { MoveFilteredEmails(folder, filter, trackingFolder); } catch { }
}
} }
activeRules.Add(folderName); 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) public bool RemoveRuleAndMoveToClosed(string folderName)
{ {
if (!EnsureOutlookConnected()) return false; if (!EnsureOutlookConnected()) return false;
try try
{ {
Outlook.Folder? inboxFolder = var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder; if (inbox == null) return false;
if (inboxFolder == null) return false;
Outlook.Folder? casesFolder = GetFolder(inboxFolder, "Cases"); var cases = GetFolder(inbox, "Cases");
if (casesFolder == null) return false; var active = GetFolder(cases, "Active");
var folder = GetFolder(active, folderName);
Outlook.Folder? activeFolder = GetFolder(casesFolder, "Active"); if (folder == null) return false;
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);
folder.MoveTo(GetOrCreateFolder(cases!, "Closed"));
activeRules.Remove(folderName); activeRules.Remove(folderName);
SaveRules(); SaveRules();
return true; return true;
@@ -381,17 +237,9 @@ namespace OutlookCaseHelper
if (!EnsureOutlookConnected()) return false; if (!EnsureOutlookConnected()) return false;
try try
{ {
Outlook.Folder? inboxFolder = var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder; var active = GetFolder(GetFolder(inbox, "Cases"), "Active");
if (inboxFolder == null) return false; var folder = GetFolder(active, oldFolderName);
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);
if (folder == null) return false; if (folder == null) return false;
folder.Name = newFolderName; folder.Name = newFolderName;
@@ -403,36 +251,159 @@ namespace OutlookCaseHelper
catch { return false; } catch { return false; }
} }
public void RunAllRules() public bool ReopenFromClosed(string trackingId, Outlook.MailItem? triggerEmail = null)
{ {
if (!EnsureOutlookConnected()) return; if (!EnsureOutlookConnected()) return false;
if (activeRules.Count == 0) return; try
{
var inbox = GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
if (inbox == null) return false;
var cases = GetOrCreateFolder(inbox, "Cases");
var active = GetOrCreateFolder(cases, "Active");
var closed = GetFolder(cases, "Closed");
if (closed == null) return false;
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 try
{ {
Outlook.Folder? inboxFolder = var target = GetFolder(active, existingName);
outlookNamespace!.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder; if (triggerEmail != null && target != null)
if (inboxFolder == null) return; triggerEmail.Move(target);
}
catch { }
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases"); activeRules.Add(existingName);
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active"); 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;
}
}
var rootFolder = inboxFolder.Parent as Outlook.Folder; // --- Scan & Run Rules ---
var allFolders = new List<Outlook.Folder>();
if (rootFolder != null) public void ScanInboxOnStartup()
GetAllFolders(rootFolder, allFolders, casesFolder.EntryID); {
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) foreach (var folderName in activeRules)
{ {
string trackingId = ExtractTrackingId(folderName); string trackingId = ExtractTrackingId(folderName);
string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'"; 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) foreach (var folder in allFolders)
try { MoveFilteredEmails(folder, filter, target); } catch { }
}
}
catch { }
}
public List<RuleInfo> GetActiveRulesInfo()
{ {
try { MoveFilteredEmails(folder, filter, trackingFolder); } catch { } 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 { } catch { }
} }
@@ -452,118 +423,30 @@ namespace OutlookCaseHelper
} }
} }
public void ScanInboxOnStartup() private Outlook.Folder? GetDefaultFolder(Outlook.OlDefaultFolders type)
{ => outlookNamespace?.GetDefaultFolder(type) as Outlook.Folder;
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 GetOrCreateFolder(Outlook.Folder parent, string name) private Outlook.Folder GetOrCreateFolder(Outlook.Folder parent, string name)
{ {
foreach (Outlook.Folder folder in parent.Folders) foreach (Outlook.Folder f in parent.Folders)
if (folder.Name == name) return folder; if (f.Name == name) return f;
return (Outlook.Folder)parent.Folders.Add(name); 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 (parent == null) return null;
if (folder.Name == name) return folder; foreach (Outlook.Folder f in parent.Folders)
if (f.Name == name) return f;
return null; return null;
} }
private Outlook.Folder? GetFolderStartingWith(Outlook.Folder parent, string trackingId) private Outlook.Folder? GetFolderStartingWith(Outlook.Folder parent, string trackingId)
{ {
foreach (Outlook.Folder folder in parent.Folders) foreach (Outlook.Folder f in parent.Folders)
{ if (f.Name == trackingId || f.Name.StartsWith(trackingId + " ") || f.Name.StartsWith(trackingId + "|"))
string name = folder.Name; return f;
if (name == trackingId ||
name.StartsWith(trackingId + " ") ||
name.StartsWith(trackingId + "|"))
return folder;
}
return null; 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; }
}
} }
} }