Added rules as json to monitor the inbox

This commit is contained in:
2026-03-17 14:16:06 +00:00
parent af384a8dd1
commit 7699086df4
6 changed files with 422 additions and 171 deletions
+96 -53
View File
@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.IO;
using System.Text.Json;
using System.Windows.Forms;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace OutlookCaseHelper
@@ -9,52 +12,81 @@ namespace OutlookCaseHelper
{
private Outlook.Application outlookApp;
private Outlook.NameSpace outlookNamespace;
private HashSet<string> activeRules = new HashSet<string>();
private readonly string rulesFilePath;
public OutlookHelper()
{
outlookApp = new Outlook.Application();
outlookNamespace = outlookApp.GetNamespace("MAPI");
rulesFilePath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"OutlookCaseHelper",
"active_rules.json");
Directory.CreateDirectory(Path.GetDirectoryName(rulesFilePath)!);
LoadRules();
}
// Get Tracking ID from selected email subject
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 HashSet<string> GetActiveRules() => activeRules;
public string? GetSelectedEmailTrackingId()
{
try
{
Outlook.Explorer activeExplorer = outlookApp.ActiveExplorer();
if (activeExplorer == null)
return null;
if (activeExplorer == null) return null;
Outlook.Selection selection = activeExplorer.Selection;
if (selection.Count == 0)
return null;
if (selection.Count == 0) return null;
Outlook.MailItem email = selection[1] as Outlook.MailItem;
if (email == null)
return null;
// Subject pattern: "Something - TrackingID1234567890123456"
string pattern = @"TrackingID(\d+)";
Match match = Regex.Match(email.Subject, pattern);
Outlook.MailItem? email = 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;
}
catch
{
return null;
}
catch { return null; }
}
// Create folder and move all emails with this tracking id
public bool CreateFolderAndMoveEmails(string trackingId)
{
try
{
Outlook.Folder inboxFolder =
Outlook.Folder? inboxFolder =
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null)
{
MessageBox.Show("Inbox folder is null", "Debug");
return false;
}
Outlook.Folder casesFolder = GetOrCreateFolder(inboxFolder, "Cases");
Outlook.Folder activeFolder = GetOrCreateFolder(casesFolder, "Active");
@@ -62,51 +94,78 @@ namespace OutlookCaseHelper
MoveEmailsWithTrackingId(inboxFolder, trackingId, trackingFolder);
Outlook.Folder sentFolder =
Outlook.Folder? sentFolder =
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
if (sentFolder != null)
MoveEmailsWithTrackingId(sentFolder, trackingId, trackingFolder);
activeRules.Add(trackingId);
SaveRules();
MessageBox.Show($"Rules file: {rulesFilePath}\nRules count: {activeRules.Count}", "Debug");
return true;
}
catch
catch (Exception ex)
{
MessageBox.Show($"Error in CreateFolderAndMoveEmails:\n{ex.Message}\n\n{ex.StackTrace}", "Debug Error");
return false;
}
}
// Remove rule: move folder from Active to Closed
public bool RemoveRuleAndMoveToClosed(string trackingId)
{
try
{
Outlook.Folder inboxFolder =
Outlook.Folder? inboxFolder =
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
if (inboxFolder == null) return false;
Outlook.Folder casesFolder = GetFolder(inboxFolder, "Cases");
Outlook.Folder? casesFolder = GetFolder(inboxFolder, "Cases");
if (casesFolder == null) return false;
Outlook.Folder activeFolder = GetFolder(casesFolder, "Active");
Outlook.Folder? activeFolder = GetFolder(casesFolder, "Active");
if (activeFolder == null) return false;
Outlook.Folder trackingFolder = GetFolder(activeFolder, trackingId);
Outlook.Folder? trackingFolder = GetFolder(activeFolder, trackingId);
if (trackingFolder == null) return false;
Outlook.Folder closedFolder = GetOrCreateFolder(casesFolder, "Closed");
MoveAllItemsFromFolder(trackingFolder, closedFolder);
trackingFolder.MoveTo(closedFolder);
try
{
activeFolder.Folders.Remove(trackingId);
}
catch { }
activeRules.Remove(trackingId);
SaveRules();
return true;
}
catch
catch { return false; }
}
public void ProcessActiveRules()
{
if (activeRules.Count == 0) return;
try
{
return false;
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 trackingId in activeRules)
{
Outlook.Folder trackingFolder = GetOrCreateFolder(activeFolder, trackingId);
MoveEmailsWithTrackingId(inboxFolder, trackingId, trackingFolder);
if (sentFolder != null)
MoveEmailsWithTrackingId(sentFolder, trackingId, trackingFolder);
}
}
catch { }
}
private Outlook.Folder GetOrCreateFolder(Outlook.Folder parent, string name)
@@ -116,8 +175,7 @@ namespace OutlookCaseHelper
if (folder.Name == name)
return folder;
}
return parent.Folders.Add(name) as Outlook.Folder;
return (Outlook.Folder)parent.Folders.Add(name);
}
private Outlook.Folder? GetFolder(Outlook.Folder parent, string name)
@@ -136,23 +194,8 @@ namespace OutlookCaseHelper
foreach (object item in source.Items)
{
Outlook.MailItem mail = item as Outlook.MailItem;
if (mail != null && mail.Subject.Contains($"TrackingID{trackingId}"))
toMove.Add(mail);
}
foreach (var mail in toMove)
mail.Move(dest);
}
private void MoveAllItemsFromFolder(Outlook.Folder source, Outlook.Folder dest)
{
var toMove = new List<Outlook.MailItem>();
foreach (object item in source.Items)
{
Outlook.MailItem mail = item as Outlook.MailItem;
if (mail != null)
Outlook.MailItem? mail = item as Outlook.MailItem;
if (mail != null && mail.Subject != null && mail.Subject.Contains($"TrackingID#{trackingId}"))
toMove.Add(mail);
}
@@ -160,4 +203,4 @@ namespace OutlookCaseHelper
mail.Move(dest);
}
}
}
}