Надстройка VSTO Outlook: обнаружение электронной почты в папке по адресу электронной почты через таблицу DASLC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Надстройка VSTO Outlook: обнаружение электронной почты в папке по адресу электронной почты через таблицу DASL

Сообщение Anonymous »

У меня есть следующий код, который берет адрес полученной электронной почты после того, как он был выбран в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»