Получить список надежных отправителей в Outlook 2007 C # Добавить в - PullRequest
2 голосов
/ 06 июня 2011

Я создал надстройку 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 ]

1 голос
/ 06 июня 2011

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

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

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

Отображение свойства MAPIна этот раздел реестра PR_SPAM_TRUSTED_SENDERS_W, задокументировано здесь .

0 голосов
/ 24 декабря 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
0 голосов
/ 24 декабря 2015

Чаван , я полагаю, поскольку это не обновлялось более 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");
...