Получить список надежных отправителей в Outlook 2007 C# Add in

Я создал надстройку Outlook 2007 на C#.NET 4.0.

Я хочу прочитать список надежных отправителей в моем коде С#.

        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);
                }
            }
        }

Таким образом, приведенный выше код перемещает все электронные письма в спам, даже если они присутствуют в списке надежных отправителей. Таким образом, я хочу получить список безопасных отправителей, чтобы избежать проверки на спам.

Может ли кто-нибудь помочь мне в этом?


person Balran Chavan    schedule 06.06.2011    source источник
comment
Что вы пробовали? Что не сработало? Где ты застрял? Можете ли вы опубликовать свой код?   -  person Oded    schedule 06.06.2011
comment
Здесь мы не просто предоставляем код по запросу. Вы должны показать нам усилия, которые вы уже приложили.   -  person Oded    schedule 06.06.2011
comment
Пожалуйста, отредактируйте свой вопрос и добавьте код к вопросу, а не в качестве комментария.   -  person Oded    schedule 06.06.2011


Ответы (3)


Объектная модель Outlook не предоставляет эти списки (по более или менее очевидным причинам). Список надежных отправителей можно прочитать прямо из реестра по адресу:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\[PROFILE NAME]\0a0d020000000000c000000000000046\001f0418

Этот двоичный раздел реестра содержит двухбайтовые символы, разделенные точкой с запятой (;).

Свойство MAPI, сопоставленное с этим разделом реестра, — PR_SPAM_TRUSTED_SENDERS_W, задокументировано здесь.

person Paul-Jan    schedule 06.06.2011

Чаван, я предполагаю, что, поскольку он не обновлялся более 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");
person JohnnyIV    schedule 24.12.2015
comment
Это будет работать только для хранилищ на основе PST или IMAPI4. Exchange хранит эти данные как часть правила на стороне сервера, которое обрабатывает входящие сообщения на стороне сервера. - person Dmitry Streblechenko; 24.12.2015

Хранилища 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
person Dmitry Streblechenko    schedule 24.12.2015