Added button to reload and view rules.
Also added a function to run the rules on demand
This commit is contained in:
+81
-21
@@ -39,7 +39,7 @@ namespace OutlookCaseHelper
|
|||||||
public Form1()
|
public Form1()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.Icon = new Icon(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "casenew.ico")); //adding the icon
|
this.Icon = new Icon(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "casenew.ico"));
|
||||||
this.WindowState = FormWindowState.Minimized;
|
this.WindowState = FormWindowState.Minimized;
|
||||||
this.ShowInTaskbar = false;
|
this.ShowInTaskbar = false;
|
||||||
outlookHelper = new OutlookHelper();
|
outlookHelper = new OutlookHelper();
|
||||||
@@ -47,10 +47,14 @@ namespace OutlookCaseHelper
|
|||||||
InitializeTray();
|
InitializeTray();
|
||||||
InitializeTimer();
|
InitializeTimer();
|
||||||
SetStartupWithWindows(true);
|
SetStartupWithWindows(true);
|
||||||
// Task.Run(() => outlookHelper.ScanInboxOnStartup());
|
|
||||||
trayIcon.ShowBalloonTip(3000, "Outlook Case Manager", "App is running and monitoring your emails.", ToolTipIcon.Info);
|
trayIcon.ShowBalloonTip(3000, "Outlook Case Manager", "App is running and monitoring your emails.", ToolTipIcon.Info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ReloadOutlookRules()
|
||||||
|
{
|
||||||
|
outlookHelper.ReloadRules();
|
||||||
|
}
|
||||||
|
|
||||||
private void SetStartupWithWindows(bool enable)
|
private void SetStartupWithWindows(bool enable)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -155,6 +159,7 @@ namespace OutlookCaseHelper
|
|||||||
trayMenu.Items.Add("Create Rule (Manual ID)", null, CreateRuleManual_Click);
|
trayMenu.Items.Add("Create Rule (Manual ID)", null, CreateRuleManual_Click);
|
||||||
trayMenu.Items.Add("Remove Rule (Selected Email)", null, RemoveRuleFromSelected_Click);
|
trayMenu.Items.Add("Remove Rule (Selected Email)", null, RemoveRuleFromSelected_Click);
|
||||||
trayMenu.Items.Add("Remove Rule (Manual ID)", null, RemoveRule_Click);
|
trayMenu.Items.Add("Remove Rule (Manual ID)", null, RemoveRule_Click);
|
||||||
|
trayMenu.Items.Add("Run All Rules Now", null, RunAllRules_Click);
|
||||||
trayMenu.Items.Add("-");
|
trayMenu.Items.Add("-");
|
||||||
trayMenu.Items.Add("Settings", null, Settings_Click);
|
trayMenu.Items.Add("Settings", null, Settings_Click);
|
||||||
trayMenu.Items.Add("Start with Windows", null, ToggleStartup_Click);
|
trayMenu.Items.Add("Start with Windows", null, ToggleStartup_Click);
|
||||||
@@ -168,12 +173,16 @@ namespace OutlookCaseHelper
|
|||||||
trayIcon.Visible = true;
|
trayIcon.Visible = true;
|
||||||
trayIcon.MouseDoubleClick += TrayIcon_MouseDoubleClick;
|
trayIcon.MouseDoubleClick += TrayIcon_MouseDoubleClick;
|
||||||
|
|
||||||
// Marca o estado atual do startup
|
|
||||||
using var regKey = Registry.CurrentUser.OpenSubKey(
|
using var regKey = Registry.CurrentUser.OpenSubKey(
|
||||||
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false);
|
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false);
|
||||||
var startupItem = trayMenu.Items[6] as ToolStripMenuItem;
|
foreach (ToolStripItem menuItem in trayMenu.Items)
|
||||||
if (startupItem != null)
|
{
|
||||||
startupItem.Checked = regKey?.GetValue("OutlookCaseHelper") != null;
|
if (menuItem is ToolStripMenuItem item && item.Text == "Start with Windows")
|
||||||
|
{
|
||||||
|
item.Checked = regKey?.GetValue("OutlookCaseHelper") != null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ToggleStartup_Click(object? sender, EventArgs e)
|
private void ToggleStartup_Click(object? sender, EventArgs e)
|
||||||
@@ -197,6 +206,7 @@ namespace OutlookCaseHelper
|
|||||||
var form = new HotkeySettingsForm(
|
var form = new HotkeySettingsForm(
|
||||||
hotkeyCreateMod, hotkeyCreateKey,
|
hotkeyCreateMod, hotkeyCreateKey,
|
||||||
hotkeyRemoveMod, hotkeyRemoveKey);
|
hotkeyRemoveMod, hotkeyRemoveKey);
|
||||||
|
form.Owner = this;
|
||||||
|
|
||||||
if (form.ShowDialog() == DialogResult.OK)
|
if (form.ShowDialog() == DialogResult.OK)
|
||||||
{
|
{
|
||||||
@@ -226,6 +236,24 @@ namespace OutlookCaseHelper
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RunAllRules_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
trayIcon.ShowBalloonTip(2000, "Outlook Case Manager", "Running all rules...", ToolTipIcon.Info);
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
outlookHelper.RunAllRules();
|
||||||
|
this.Invoke(() =>
|
||||||
|
trayIcon.ShowBalloonTip(3000, "Outlook Case Manager", "All rules applied successfully!", ToolTipIcon.Info));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show($"Error: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ProcessEmail_Click(object? sender, EventArgs e)
|
private void ProcessEmail_Click(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -426,9 +454,9 @@ namespace OutlookCaseHelper
|
|||||||
public HotkeySettingsForm(uint createMod, uint createKey, uint removeMod, uint removeKey)
|
public HotkeySettingsForm(uint createMod, uint createKey, uint removeMod, uint removeKey)
|
||||||
{
|
{
|
||||||
this.Text = "Hotkey Settings";
|
this.Text = "Hotkey Settings";
|
||||||
this.Size = new Size(400, 300);
|
this.Size = new Size(420, 280);
|
||||||
this.MinimumSize = new Size(400, 300);
|
this.MinimumSize = new Size(420, 280);
|
||||||
this.MaximumSize = new Size(400, 300);
|
this.MaximumSize = new Size(420, 280);
|
||||||
this.FormBorderStyle = FormBorderStyle.FixedDialog;
|
this.FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||||
this.MaximizeBox = false;
|
this.MaximizeBox = false;
|
||||||
this.MinimizeBox = false;
|
this.MinimizeBox = false;
|
||||||
@@ -442,29 +470,61 @@ namespace OutlookCaseHelper
|
|||||||
cmbCreateKey = new ComboBox { Left = 220, Top = 38, Width = 100, DropDownStyle = ComboBoxStyle.DropDownList };
|
cmbCreateKey = new ComboBox { Left = 220, Top = 38, Width = 100, DropDownStyle = ComboBoxStyle.DropDownList };
|
||||||
cmbCreateKey.Items.AddRange(KeyOptions);
|
cmbCreateKey.Items.AddRange(KeyOptions);
|
||||||
|
|
||||||
var lblRemove = new Label { Text = "Remove Rule shortcut:", Left = 20, Top = 85, Width = 350, Height = 20, Font = new Font(Font, FontStyle.Bold) };
|
var lblRemove = new Label { Text = "Remove Rule shortcut:", Left = 20, Top = 80, Width = 350, Height = 20, Font = new Font(Font, FontStyle.Bold) };
|
||||||
chkRemoveAlt = new CheckBox { Text = "Alt", Left = 20, Top = 110, Width = 60, Checked = (removeMod & 0x0001) != 0 };
|
chkRemoveAlt = new CheckBox { Text = "Alt", Left = 20, Top = 105, Width = 60, Checked = (removeMod & 0x0001) != 0 };
|
||||||
chkRemoveCtrl = new CheckBox { Text = "Ctrl", Left = 85, Top = 110, Width = 60, Checked = (removeMod & 0x0002) != 0 };
|
chkRemoveCtrl = new CheckBox { Text = "Ctrl", Left = 85, Top = 105, Width = 60, Checked = (removeMod & 0x0002) != 0 };
|
||||||
chkRemoveShift = new CheckBox { Text = "Shift", Left = 150, Top = 110, Width = 65, Checked = (removeMod & 0x0004) != 0 };
|
chkRemoveShift = new CheckBox { Text = "Shift", Left = 150, Top = 105, Width = 65, Checked = (removeMod & 0x0004) != 0 };
|
||||||
cmbRemoveKey = new ComboBox { Left = 220, Top = 108, Width = 100, DropDownStyle = ComboBoxStyle.DropDownList };
|
cmbRemoveKey = new ComboBox { Left = 220, Top = 103, Width = 100, DropDownStyle = ComboBoxStyle.DropDownList };
|
||||||
cmbRemoveKey.Items.AddRange(KeyOptions);
|
cmbRemoveKey.Items.AddRange(KeyOptions);
|
||||||
|
|
||||||
SelectKey(cmbCreateKey, createKey);
|
SelectKey(cmbCreateKey, createKey);
|
||||||
SelectKey(cmbRemoveKey, removeKey);
|
SelectKey(cmbRemoveKey, removeKey);
|
||||||
|
|
||||||
var btnOk = new Button { Text = "Save", Left = 200, Top = 220, Width = 80, DialogResult = DialogResult.OK };
|
// Todos os botões na mesma linha
|
||||||
var btnCancel = new Button { Text = "Cancel", Left = 290, Top = 220, Width = 80, DialogResult = DialogResult.Cancel };
|
var btnViewRules = new Button { Text = "View Rules", Left = 20, Top = 200, Width = 90 };
|
||||||
|
btnViewRules.Click += (s, e) =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string rulesPath = Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||||
|
"OutlookCaseHelper", "active_rules.json");
|
||||||
|
if (File.Exists(rulesPath))
|
||||||
|
System.Diagnostics.Process.Start("notepad.exe", rulesPath);
|
||||||
|
else
|
||||||
|
MessageBox.Show("No rules file found.", "Info",
|
||||||
|
MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
};
|
||||||
|
|
||||||
|
var btnReloadRules = new Button { Text = "Reload Rules", Left = 118, Top = 200, Width = 90 };
|
||||||
|
btnReloadRules.Click += (s, e) =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (this.Owner is Form1 form1)
|
||||||
|
{
|
||||||
|
form1.ReloadOutlookRules();
|
||||||
|
MessageBox.Show("Rules reloaded successfully!", "Success",
|
||||||
|
MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
};
|
||||||
|
|
||||||
|
var btnOk = new Button { Text = "Save", Left = 216, Top = 200, Width = 80, DialogResult = DialogResult.OK };
|
||||||
|
var btnCancel = new Button { Text = "Cancel", Left = 304, Top = 200, Width = 80, DialogResult = DialogResult.Cancel };
|
||||||
|
|
||||||
this.Controls.AddRange(new Control[] {
|
this.Controls.AddRange(new Control[] {
|
||||||
lblCreate, chkCreateAlt, chkCreateCtrl, chkCreateShift, cmbCreateKey,
|
lblCreate, chkCreateAlt, chkCreateCtrl, chkCreateShift, cmbCreateKey,
|
||||||
lblRemove, chkRemoveAlt, chkRemoveCtrl, chkRemoveShift, cmbRemoveKey,
|
lblRemove, chkRemoveAlt, chkRemoveCtrl, chkRemoveShift, cmbRemoveKey,
|
||||||
btnOk, btnCancel
|
btnViewRules, btnReloadRules, btnOk, btnCancel
|
||||||
});
|
});
|
||||||
|
|
||||||
this.AcceptButton = btnOk;
|
this.AcceptButton = btnOk;
|
||||||
this.CancelButton = btnCancel;
|
this.CancelButton = btnCancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SelectKey(ComboBox cmb, uint keyCode)
|
private void SelectKey(ComboBox cmb, uint keyCode)
|
||||||
{
|
{
|
||||||
var key = (Keys)keyCode;
|
var key = (Keys)keyCode;
|
||||||
|
|||||||
@@ -26,7 +26,65 @@ namespace OutlookCaseHelper
|
|||||||
"active_rules.json");
|
"active_rules.json");
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(rulesFilePath)!);
|
Directory.CreateDirectory(Path.GetDirectoryName(rulesFilePath)!);
|
||||||
LoadRules();
|
LoadRules();
|
||||||
// Não tenta ligar ao Outlook aqui — liga só quando necessário
|
|
||||||
|
}
|
||||||
|
public void RunAllRules()
|
||||||
|
{
|
||||||
|
if (!EnsureOutlookConnected()) return;
|
||||||
|
if (activeRules.Count == 0) 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");
|
||||||
|
|
||||||
|
|
||||||
|
var rootFolder = inboxFolder.Parent as Outlook.Folder;
|
||||||
|
var allFolders = new List<Outlook.Folder>();
|
||||||
|
if (rootFolder != null)
|
||||||
|
GetAllFolders(rootFolder, allFolders, casesFolder.EntryID);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
foreach (var folder in allFolders)
|
||||||
|
{
|
||||||
|
try { MoveFilteredEmails(folder, filter, trackingFolder); } catch { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReloadRules()
|
||||||
|
{
|
||||||
|
activeRules.Clear();
|
||||||
|
LoadRules();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GetAllFolders(Outlook.Folder parent, List<Outlook.Folder> result, string excludeEntryId)
|
||||||
|
{
|
||||||
|
foreach (Outlook.Folder folder in parent.Folders)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (folder.EntryID == excludeEntryId) continue;
|
||||||
|
result.Add(folder);
|
||||||
|
if (folder.Folders.Count > 0)
|
||||||
|
GetAllFolders(folder, result, excludeEntryId);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool EnsureOutlookConnected()
|
private bool EnsureOutlookConnected()
|
||||||
@@ -146,6 +204,26 @@ namespace OutlookCaseHelper
|
|||||||
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; }
|
||||||
|
}*/
|
||||||
|
|
||||||
public bool ExistsInClosed(string trackingId)
|
public bool ExistsInClosed(string trackingId)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -216,6 +294,40 @@ namespace OutlookCaseHelper
|
|||||||
catch { return null; }
|
catch { return null; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* public bool ReopenFromClosed(string trackingId, Outlook.MailItem? triggerEmail = null)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
closedTracking.MoveTo(activeFolder);
|
||||||
|
|
||||||
|
if (triggerEmail != null)
|
||||||
|
{
|
||||||
|
Outlook.Folder? movedFolder = GetFolder(activeFolder, existingName);
|
||||||
|
if (movedFolder != null)
|
||||||
|
triggerEmail.Move(movedFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
activeRules.Add(existingName);
|
||||||
|
SaveRules();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch { return false; }
|
||||||
|
}*/
|
||||||
|
|
||||||
public bool ReopenFromClosed(string trackingId, Outlook.MailItem? triggerEmail = null)
|
public bool ReopenFromClosed(string trackingId, Outlook.MailItem? triggerEmail = null)
|
||||||
{
|
{
|
||||||
if (!EnsureOutlookConnected()) return false;
|
if (!EnsureOutlookConnected()) return false;
|
||||||
@@ -234,22 +346,106 @@ namespace OutlookCaseHelper
|
|||||||
if (closedTracking == null) return false;
|
if (closedTracking == null) return false;
|
||||||
|
|
||||||
string existingName = closedTracking.Name;
|
string existingName = closedTracking.Name;
|
||||||
closedTracking.MoveTo(activeFolder);
|
|
||||||
|
|
||||||
if (triggerEmail != null)
|
// Verifica se já existe pasta com mesmo nome em Active
|
||||||
|
Outlook.Folder? existingActive = GetFolder(activeFolder, existingName);
|
||||||
|
if (existingActive != null)
|
||||||
{
|
{
|
||||||
Outlook.Folder? movedFolder = GetFolder(activeFolder, existingName);
|
var toMove = new List<Outlook.MailItem>();
|
||||||
if (movedFolder != null)
|
foreach (object item in closedTracking.Items)
|
||||||
triggerEmail.Move(movedFolder);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Move o email trigger — usa try/catch separado para não falhar o resto
|
||||||
|
if (triggerEmail != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Outlook.Folder? targetFolder = GetFolder(activeFolder, existingName);
|
||||||
|
if (targetFolder != null)
|
||||||
|
triggerEmail.Move(targetFolder);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adiciona regra — independente do email trigger
|
||||||
activeRules.Add(existingName);
|
activeRules.Add(existingName);
|
||||||
SaveRules();
|
SaveRules();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch { return false; }
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// Se a pasta já foi movida mas a regra não foi adicionada, tenta recuperar
|
||||||
|
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; // pasta estava lá, regra foi adicionada
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* public bool CreateFolderAndMoveEmails(string trackingId, string folderName)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
||||||
|
string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'";
|
||||||
|
|
||||||
|
Outlook.Items restricted = inboxFolder.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(trackingFolder);
|
||||||
|
|
||||||
|
Outlook.Folder? sentFolder =
|
||||||
|
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
|
||||||
|
if (sentFolder != null)
|
||||||
|
{
|
||||||
|
Outlook.Items restrictedSent = sentFolder.Items.Restrict(filter);
|
||||||
|
var toMoveSent = new List<Outlook.MailItem>();
|
||||||
|
foreach (object item in restrictedSent)
|
||||||
|
if (item is Outlook.MailItem mail) toMoveSent.Add(mail);
|
||||||
|
foreach (var mail in toMoveSent)
|
||||||
|
mail.Move(trackingFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
activeRules.Add(folderName);
|
||||||
|
SaveRules();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show($"Error: {ex.Message}", "Error");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
public bool CreateFolderAndMoveEmails(string trackingId, string folderName)
|
public bool CreateFolderAndMoveEmails(string trackingId, string folderName)
|
||||||
{
|
{
|
||||||
if (!EnsureOutlookConnected()) return false;
|
if (!EnsureOutlookConnected()) return false;
|
||||||
@@ -265,23 +461,24 @@ namespace OutlookCaseHelper
|
|||||||
|
|
||||||
string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'";
|
string filter = $"@SQL=\"urn:schemas:httpmail:subject\" LIKE '%TrackingID#{trackingId}%'";
|
||||||
|
|
||||||
Outlook.Items restricted = inboxFolder.Items.Restrict(filter);
|
// Procura em Inbox
|
||||||
var toMove = new List<Outlook.MailItem>();
|
MoveFilteredEmails(inboxFolder, filter, trackingFolder);
|
||||||
foreach (object item in restricted)
|
|
||||||
if (item is Outlook.MailItem mail) toMove.Add(mail);
|
|
||||||
foreach (var mail in toMove)
|
|
||||||
mail.Move(trackingFolder);
|
|
||||||
|
|
||||||
|
// Procura em Sent
|
||||||
Outlook.Folder? sentFolder =
|
Outlook.Folder? sentFolder =
|
||||||
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
|
outlookNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
|
||||||
if (sentFolder != null)
|
if (sentFolder != null)
|
||||||
|
MoveFilteredEmails(sentFolder, filter, trackingFolder);
|
||||||
|
|
||||||
|
// Procura em todas as outras pastas do utilizador
|
||||||
|
foreach (Outlook.Folder folder in inboxFolder.Parent.Folders)
|
||||||
{
|
{
|
||||||
Outlook.Items restrictedSent = sentFolder.Items.Restrict(filter);
|
if (folder.Name != "Cases" &&
|
||||||
var toMoveSent = new List<Outlook.MailItem>();
|
folder.EntryID != inboxFolder.EntryID &&
|
||||||
foreach (object item in restrictedSent)
|
folder.EntryID != sentFolder?.EntryID)
|
||||||
if (item is Outlook.MailItem mail) toMoveSent.Add(mail);
|
{
|
||||||
foreach (var mail in toMoveSent)
|
try { MoveFilteredEmails(folder, filter, trackingFolder); } catch { }
|
||||||
mail.Move(trackingFolder);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
activeRules.Add(folderName);
|
activeRules.Add(folderName);
|
||||||
@@ -295,6 +492,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;
|
||||||
|
|||||||
@@ -6,26 +6,10 @@ namespace OutlookCaseHelper
|
|||||||
internal static class Program
|
internal static class Program
|
||||||
{
|
{
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main(string[] args)
|
static void Main()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (args.Length > 0 && args[0] == "/postinstall")
|
|
||||||
{
|
|
||||||
string exePath = System.Diagnostics.Process.GetCurrentProcess().MainModule!.FileName;
|
|
||||||
|
|
||||||
var psi = new System.Diagnostics.ProcessStartInfo
|
|
||||||
{
|
|
||||||
FileName = exePath,
|
|
||||||
UseShellExecute = true,
|
|
||||||
CreateNoWindow = false
|
|
||||||
};
|
|
||||||
|
|
||||||
System.Threading.Thread.Sleep(12000); // aguarda 12 segundos
|
|
||||||
System.Diagnostics.Process.Start(psi);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
Application.Run(new Form1());
|
Application.Run(new Form1());
|
||||||
@@ -33,4 +17,4 @@ namespace OutlookCaseHelper
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,20 +128,6 @@
|
|||||||
{
|
{
|
||||||
"CustomAction"
|
"CustomAction"
|
||||||
{
|
{
|
||||||
"{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_DD81DF56EF8A4C8E95F2B3F1B9E1759D"
|
|
||||||
{
|
|
||||||
"Name" = "8:OutlookCaseHelper.exe"
|
|
||||||
"Condition" = "8:LAUNCH_APP=\"1\""
|
|
||||||
"Object" = "8:_20E8A2E3188C435B800533011482D2FC"
|
|
||||||
"FileType" = "3:2"
|
|
||||||
"InstallAction" = "3:1"
|
|
||||||
"Arguments" = "8:/postinstall"
|
|
||||||
"EntryPoint" = "8:"
|
|
||||||
"Sequence" = "3:1"
|
|
||||||
"Identifier" = "8:_BB6F4E07_E0B7_4049_9B93_6BD9670746E7"
|
|
||||||
"InstallerClass" = "11:FALSE"
|
|
||||||
"CustomActionData" = "8:"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
"DefaultFeature"
|
"DefaultFeature"
|
||||||
{
|
{
|
||||||
@@ -374,7 +360,7 @@
|
|||||||
"Name" = "8:Microsoft Visual Studio"
|
"Name" = "8:Microsoft Visual Studio"
|
||||||
"ProductName" = "8:Outlook Case Manager"
|
"ProductName" = "8:Outlook Case Manager"
|
||||||
"ProductCode" = "8:{D8A20294-9095-4817-808A-8B9144CD168F}"
|
"ProductCode" = "8:{D8A20294-9095-4817-808A-8B9144CD168F}"
|
||||||
"PackageCode" = "8:{F9F5DDD8-2BB9-40B2-89C9-074DFFBBBC2A}"
|
"PackageCode" = "8:{8F8E7EE2-D7ED-47C6-BD5F-617C4F88BEDA}"
|
||||||
"UpgradeCode" = "8:{AAF43788-D89F-4285-AC74-CA5E1413DADC}"
|
"UpgradeCode" = "8:{AAF43788-D89F-4285-AC74-CA5E1413DADC}"
|
||||||
"AspNetVersion" = "8:2.0.50727.0"
|
"AspNetVersion" = "8:2.0.50727.0"
|
||||||
"RestartWWWService" = "11:FALSE"
|
"RestartWWWService" = "11:FALSE"
|
||||||
@@ -704,262 +690,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7D04F05A2A1149FCB26D59521B1E8172"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:110"
|
|
||||||
"DisplayName" = "8:Checkboxes (A)"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdCustomCheck1Dlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"BannerText"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerText"
|
|
||||||
"DisplayName" = "8:#1014"
|
|
||||||
"Description" = "8:#1114"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:Launch options"
|
|
||||||
"DefaultValue" = "8:#1214"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"BodyText"
|
|
||||||
{
|
|
||||||
"Name" = "8:BodyText"
|
|
||||||
"DisplayName" = "8:#1015"
|
|
||||||
"Description" = "8:#1115"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:Select additional options"
|
|
||||||
"DefaultValue" = "8:#1215"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox1Label"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox1Label"
|
|
||||||
"DisplayName" = "8:#1034"
|
|
||||||
"Description" = "8:#1134"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:Launch Outlook Case Manager after installation"
|
|
||||||
"DefaultValue" = "8:#1234"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox1Property"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox1Property"
|
|
||||||
"DisplayName" = "8:#1030"
|
|
||||||
"Description" = "8:#1130"
|
|
||||||
"Type" = "3:14"
|
|
||||||
"ContextData" = "8:Public"
|
|
||||||
"Attributes" = "3:2"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:LAUNCH_APP"
|
|
||||||
"DefaultValue" = "8:CHECKBOXA1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox1Value"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox1Value"
|
|
||||||
"DisplayName" = "8:#1038"
|
|
||||||
"Description" = "8:#1138"
|
|
||||||
"Type" = "3:2"
|
|
||||||
"ContextData" = "8:Unchecked=;Checked=1"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:1"
|
|
||||||
"DefaultValue" = "8:"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox1Visible"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox1Visible"
|
|
||||||
"DisplayName" = "8:#1026"
|
|
||||||
"Description" = "8:#1126"
|
|
||||||
"Type" = "3:5"
|
|
||||||
"ContextData" = "8:1;True=1;False=0"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:0"
|
|
||||||
"Value" = "3:1"
|
|
||||||
"DefaultValue" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox2Label"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox2Label"
|
|
||||||
"DisplayName" = "8:#1035"
|
|
||||||
"Description" = "8:#1135"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"Value" = "8:#1235"
|
|
||||||
"DefaultValue" = "8:#1235"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox2Property"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox2Property"
|
|
||||||
"DisplayName" = "8:#1031"
|
|
||||||
"Description" = "8:#1131"
|
|
||||||
"Type" = "3:14"
|
|
||||||
"ContextData" = "8:Public"
|
|
||||||
"Attributes" = "3:2"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:CHECKBOXA2"
|
|
||||||
"DefaultValue" = "8:CHECKBOXA2"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox2Value"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox2Value"
|
|
||||||
"DisplayName" = "8:#1039"
|
|
||||||
"Description" = "8:#1139"
|
|
||||||
"Type" = "3:2"
|
|
||||||
"ContextData" = "8:Unchecked=;Checked=1"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:"
|
|
||||||
"DefaultValue" = "8:"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox2Visible"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox2Visible"
|
|
||||||
"DisplayName" = "8:#1027"
|
|
||||||
"Description" = "8:#1127"
|
|
||||||
"Type" = "3:5"
|
|
||||||
"ContextData" = "8:1;True=1;False=0"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:0"
|
|
||||||
"Value" = "3:0"
|
|
||||||
"DefaultValue" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox3Label"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox3Label"
|
|
||||||
"DisplayName" = "8:#1036"
|
|
||||||
"Description" = "8:#1136"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"Value" = "8:#1236"
|
|
||||||
"DefaultValue" = "8:#1236"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox3Property"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox3Property"
|
|
||||||
"DisplayName" = "8:#1032"
|
|
||||||
"Description" = "8:#1132"
|
|
||||||
"Type" = "3:14"
|
|
||||||
"ContextData" = "8:Public"
|
|
||||||
"Attributes" = "3:2"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:CHECKBOXA3"
|
|
||||||
"DefaultValue" = "8:CHECKBOXA3"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox3Value"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox3Value"
|
|
||||||
"DisplayName" = "8:#1040"
|
|
||||||
"Description" = "8:#1140"
|
|
||||||
"Type" = "3:2"
|
|
||||||
"ContextData" = "8:Unchecked=;Checked=1"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:"
|
|
||||||
"DefaultValue" = "8:"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox3Visible"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox3Visible"
|
|
||||||
"DisplayName" = "8:#1028"
|
|
||||||
"Description" = "8:#1128"
|
|
||||||
"Type" = "3:5"
|
|
||||||
"ContextData" = "8:1;True=1;False=0"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:0"
|
|
||||||
"Value" = "3:0"
|
|
||||||
"DefaultValue" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox4Label"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox4Label"
|
|
||||||
"DisplayName" = "8:#1037"
|
|
||||||
"Description" = "8:#1137"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"Value" = "8:#1237"
|
|
||||||
"DefaultValue" = "8:#1237"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox4Property"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox4Property"
|
|
||||||
"DisplayName" = "8:#1033"
|
|
||||||
"Description" = "8:#1133"
|
|
||||||
"Type" = "3:14"
|
|
||||||
"ContextData" = "8:Public"
|
|
||||||
"Attributes" = "3:2"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:CHECKBOXA4"
|
|
||||||
"DefaultValue" = "8:CHECKBOXA4"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox4Value"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox4Value"
|
|
||||||
"DisplayName" = "8:#1041"
|
|
||||||
"Description" = "8:#1141"
|
|
||||||
"Type" = "3:2"
|
|
||||||
"ContextData" = "8:Unchecked=;Checked=1"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:2"
|
|
||||||
"Value" = "8:"
|
|
||||||
"DefaultValue" = "8:"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Checkbox4Visible"
|
|
||||||
{
|
|
||||||
"Name" = "8:Checkbox4Visible"
|
|
||||||
"DisplayName" = "8:#1029"
|
|
||||||
"Description" = "8:#1129"
|
|
||||||
"Type" = "3:5"
|
|
||||||
"ContextData" = "8:1;True=1;False=0"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:0"
|
|
||||||
"Value" = "3:0"
|
|
||||||
"DefaultValue" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_8D58EEEC23E14DBC9F4D9DB32472B784"
|
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_8D58EEEC23E14DBC9F4D9DB32472B784"
|
||||||
{
|
{
|
||||||
"Sequence" = "3:300"
|
"Sequence" = "3:300"
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
|||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
App.config = App.config
|
App.config = App.config
|
||||||
OutlookCaseHelper\bin\Debug\net8.0-windows\casenew.ico = OutlookCaseHelper\bin\Debug\net8.0-windows\casenew.ico
|
OutlookCaseHelper\bin\Debug\net8.0-windows\casenew.ico = OutlookCaseHelper\bin\Debug\net8.0-windows\casenew.ico
|
||||||
|
..\..\..\Downloads\README.md = ..\..\..\Downloads\README.md
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "OutlookCaseHelperSetup", "OutlookCaseHelperSetup\OutlookCaseHelperSetup.vdproj", "{45984EC3-3682-760C-C1F0-4987692FB84A}"
|
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "OutlookCaseHelperSetup", "OutlookCaseHelperSetup\OutlookCaseHelperSetup.vdproj", "{45984EC3-3682-760C-C1F0-4987692FB84A}"
|
||||||
|
|||||||
Reference in New Issue
Block a user