Adjusting multiple popups and general refactoring
This commit is contained in:
+255
-497
File diff suppressed because it is too large
Load Diff
+241
-358
@@ -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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user