У меня есть следующий код, который берет адрес полученной электронной почты после того, как он был выбран в Outlook Explorer, и пытается найти другие электронные письма, полученные с этого адреса.
(У меня была историческая причина передать оба адреса электронной почты и Outlook.MailItem для этой функции)
` public (bool, int, bool) SearchAccountForEmail(string emailAddress, MailItem receivedEmail)
{
using (Log.VerboseCall())
{
bool found = false;
int count = 0;
bool domainNotSeen = false;
Outlook.Account emailAccount = null;
Outlook.Store store = null;
Outlook.Folder rootFolder = null;
try
{
emailAccount = receivedEmail.SendUsingAccount;
Log.Verbose($"Finding {emailAddress} in account: {emailAccount}");
if (emailAccount != null)
{
// Get the root folder of the delivery store
store = emailAccount.DeliveryStore;
rootFolder = store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
byte[] mailItemEntryIdBytes = (byte[])mSelectedMailItem.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0FFF0102");
string entryId = BitConverter.ToString(mailItemEntryIdBytes).Replace("-", "");
// Search folders in this account
(found, count) = IsEmailInFolder(rootFolder, emailAddress, entryId);
Log.Verbose($"Found Total: {count} emails, in folder {rootFolder.Name} for account {emailAccount.DisplayName}");
domainNotSeen = !IsDomainInFolder(rootFolder, emailAddress);
Log.Verbose($"Did not find additional domain in folder {rootFolder.Name} in account {emailAccount.DisplayName}: {domainNotSeen.ToString()}");
}
else
{
Log.Verbose("Account not found.");
}
}
catch(Exception ex)
{
Log.Verbose(ex);
}
finally
{
if (store != null) Marshal.ReleaseComObject(store);
if (rootFolder != null) Marshal.ReleaseComObject(rootFolder);
if (emailAccount != null) Marshal .ReleaseComObject(emailAccount);
}
return (found, count, domainNotSeen);
}
}
public (bool, int) IsEmailInFolder(Outlook.Folder folder, string emailAddress, string entryId)
{
using(Log.VerboseCall())
{
string filter = $"@SQL=\"urn:schemas:httpmail:fromemail\" = '{emailAddress}'";
string PR_LONGTERM_ENTRYID_FROM_TABLE = "http://schemas.microsoft.com/mapi/proptag/0x66700102";
Table table = null;
int rowCount = 0;
QueryResponse qm = new QueryResponse();
try
{
// Why to create Table every time we are searching for email instead of once:
// - it is different for every folder
// - the content change as new email arrive
//
// Try to retrieve a table of email items filtered by sender's email address
table = folder.GetTable(filter, OlTableContents.olUserItems);
if (table != null)
{
table.Columns.Add("SenderEmailAddress");
table.Columns.Add("http://schemas.microsoft.com/mapi/proptag/0x66700102");
rowCount = table.GetRowCount();
Log.Verbose($"Found {rowCount} number of rows in table of in {folder.Name} folder, matching email {emailAddress} .");
while (!table.EndOfTable)
{
Row row = table.GetNextRow();
if (row != null)
{
string senderEmail = row["SenderEmailAddress"].ToString();
if (String.Compare(senderEmail, emailAddress, true) == 0)
{
string hexEntryId = row.BinaryToString(PR_LONGTERM_ENTRYID_FROM_TABLE);
if (row != null)
Marshal.ReleaseComObject(row);
if (String.Compare(entryId, hexEntryId, StringComparison.OrdinalIgnoreCase) != 0)
{
Log.Verbose($"Folder: {folder.Name} - Found email with the same address {emailAddress} and different EntryID");
break;
}
}
if (row != null)
Marshal.ReleaseComObject(row);
}
}
}
}
catch (Exception ex)
{
Log.Verbose(ex);
}
finally
{
if (table != null) Marshal.ReleaseComObject(table);
}
// Reduce the count - we don't count for the message itself, only for extra once found
if (rowCount > 0)
rowCount--;
bool found = (rowCount > 0) ? true : false;
if (found == true)
{
Log.Verbose($"Folder: {folder.Name} - {rowCount} emails found with the same address {emailAddress} and differnt EntryID");
return (true, rowCount);
}
foreach (Folder subFolder in folder.Folders)
{
Log.Verbose($"Checking subFolder {subFolder.Name} for email address {emailAddress}");
(bool ret, int count) = IsEmailInFolder(subFolder, emailAddress, entryId);
if (ret == true)
{
rowCount += count;
}
}
Log.Verbose($"Folder: {folder.Name} - {rowCount} emails found with the same address {emailAddress} and differnt EntryID");
return (rowCount > 0) ? (true, rowCount) : (false, 0);
}
}
`
Как видите, работа выполняется в функции IsEmailInFolder с использованием таблицы DASL.
И вот в чем проблема:
Для некоторых адресов электронной почты он находит дополнительные электронные письма с тем же адресом «Кому», а для некоторых писем (50%) — нет, и я понятия не имею, почему это выдает мне такие базарные результаты. Может быть, DASL не так надежен, как я думал?
Очевидно, что должен быть хотя бы один адрес электронной почты с входным адресом — сам адрес электронной почты, и поэтому я использую EntryID, чтобы убедиться, что я Я не принимаю во внимание саму электронную почту. Это происходит рекурсивно, когда я просматриваю папку «Входящие» и все ее подпапки для определенной учетной записи.
Я пробовал разные схемы и отладку — на моей машине работает, но на клиентской машине находит только 50%.
РЕДАКТИРОВАНИЕ: 12.05.2024
Думаю, я предоставил слишком много кода. Итак, вот суть. Следующий код приводит к результату «rowCount» 1, несмотря на то, что в этой папке находятся электронные письма от того же адреса отправителя (в дополнение к полученному электронному письму, которое приводит к подсчету 1). Этот код работает на моем компьютере, но не на клиентском компьютере, поэтому я знаю, что строка свойства DASL верна. По сути, я хочу знать, есть ли в папке электронной почты дополнительные электронные письма от того же отправителя.
table = folder.GetTable(filter, OlTableContents.olUserItems);
if (table != null)
{
table.Columns.Add("SenderEmailAddress");
table.Columns.Add("http://schemas.microsoft.com/mapi/proptag/0x66700102");
rowCount = table.GetRowCount();
Log.Verbose($"Found {rowCount} number of rows in table of in {folder.Name} folder, matching email {emailAddress} .");
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... ugh-dasl-t
Надстройка VSTO Outlook: обнаружение электронной почты в папке по адресу электронной почты через таблицу DASL ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Надстройка взаимодействия с C# Outlook, отслеживание удаления электронной почты VSTO
Anonymous » » в форуме C# - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-