Получить список надежных отправителей в Outlook 2007 C# Добавить в
Я создал надстройку Outlook 2007 в C#.NET 4.0.
Я хочу прочитать список безопасных отправителей в моем коде C#.
if (oBoxItem is Outlook.MailItem)
{
Outlook.MailItem miEmail = (Outlook.MailItem)oBoxItem;
OlDefaultFolders f = Outlook.OlDefaultFolders.olFolderContacts;
if (miEmail != null)
{
string body = miEmail.Body;
double score = spamFilterObject.CalculateSpamScore(body);
if (score <= 0.9)
{
miEmail.Move(mfJunkEmail);
}
}
}
Таким образом, приведенный выше код перемещает все электронные письма в спам, даже если они присутствуют в списке надежных отправителей. Поэтому я хочу получить список надежных отправителей, чтобы избежать проверки на спам.
Может ли кто-нибудь помочь мне в этом?
3 ответа
Объектная модель Outlook не предоставляет эти списки (по более или менее очевидным причинам). Список надежных отправителей можно прочитать прямо из реестра по адресу:
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\[PROFILE NAME]\0a0d020000000000c000000000000046\001f0418
Этот двоичный раздел реестра содержит двухбайтовые символы, разделенные точкой с запятой (;).
Свойство MAPI, сопоставляемое с этим разделом реестра, PR_SPAM_TRUSTED_SENDERS_W, задокументировано здесь.
Chavan, я полагаю, поскольку это не обновлялось более 4 лет, вам больше не нужна информация, но этот вопрос и ответ помогли мне найти то, что я искал (было очень трудно найти) и позволили мне написать приведенный ниже код, который может помочь, если вы все еще ищете ответ.
Этот код выполняется в LINQPad, поэтому, если вы не являетесь пользователем LINQPad, удалите методы.Dump() и замените их на Console.WriteLine или Debug.WriteLine.
Ура!
const string valueNameBlocked = "001f0426";
const string valueNameSafe = "001f0418";
// Note: I'm using Office 2013 (15.0) and my profile name is "Outlook"
// You may need to replace the 15.0 or the "Outlook" at the end of your string as needed.
string keyPath = @"Software\Microsoft\Office\15.0\Outlook\Profiles\Outlook";
string subKey = null;
var emptyBytes = new byte[] { };
var semi = new[] { ';' };
string blocked = null, safe = null;
// I found that my subkey under the profile was not the same on different machines,
// so I wrote this block to look for it.
using (var key = Registry.CurrentUser.OpenSubKey(keyPath))
{
var match =
// Get the subkeys and all of their value names
key.GetSubKeyNames().SelectMany(sk =>
{
using (var subkey = key.OpenSubKey(sk))
return subkey.GetValueNames().Select(valueName => new { subkey = sk, valueName });
})
// But only the one that matches Blocked Senders
.FirstOrDefault(sk => valueNameBlocked == sk.valueName);
// If we got one, get the data from the values
if (match != null)
{
// Simultaneously setting subKey string for later while opening the registry key
using (var subkey = key.OpenSubKey(subKey = match.subkey))
{
blocked = Encoding.Unicode.GetString((byte[])subkey.GetValue(valueNameBlocked, emptyBytes));
safe = Encoding.Unicode.GetString((byte[])subkey.GetValue(valueNameSafe, emptyBytes));
}
}
}
// Remove empty items and the null-terminator (sometimes there is one, but not always)
Func<string, List<string>> cleanList = s => s.Split(semi, StringSplitOptions.RemoveEmptyEntries).Where(e => e != "\0").ToList();
// Convert strings to lists (dictionaries might be preferred)
var blockedList = cleanList(blocked).Dump("Blocked Senders");
var safeList = cleanList(safe).Dump("Safe Senders");
byte[] bytes;
// To convert a modified list back to a string for saving:
blocked = string.Join(";", blockedList) + ";\0";
bytes = Encoding.Unicode.GetBytes(blocked);
// Write to the registry
using (var key = Registry.CurrentUser.OpenSubKey(keyPath + '\\' + subKey, true))
key.SetValue(valueNameBlocked, bytes, RegistryValueKind.Binary);
// In LINQPad, this is what I used to view my binary data
string.Join("", bytes.Select(b => b.ToString("x2"))).Dump("Blocked Senders: binary data");
safe = string.Join(";", safeList) + ";\0"; bytes = Encoding.Unicode.GetBytes(safe);
string.Join("", bytes.Select(b => b.ToString("x2"))).Dump("Safe Senders: binary data");
PST и IMAP4 (ost) хранят список в разделе профиля в реестре. Гид раздела профиля {00020D0A-0000-0000-C000-000000000046}
, Чтобы получить прямой доступ к данным, вам необходимо знать версию Outlook и имя профиля.
Хранилище Exchange хранит эти данные как часть правила на стороне сервера, которое обрабатывает входящие сообщения на стороне сервера. Вы можете просмотреть данные правила в OutlookSpy - перейдите в папку "Входящие", вкладку "Связанное содержимое", найдите запись с именем (PR_RuleMsgName) == "Правило нежелательной почты", дважды щелкните по ней, посмотрите на свойство PR_EXTENDED_RULE_CONDITION,
Объектная модель Outlook не отображает параметры нежелательной почты. Если использование Redemption является опцией, оно предоставляет коллекцию RDOJunkEmailOptions.TrustedSenders (работает как для хранилищ PST, так и для хранилищ Exchange):
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Store = Session.Stores.DefaultStore
set TrustedSenders = Store.JunkEmailOptions.TrustedSenders
for each v in TrustedSenders
debug.print v
next