В настоящее время я разрабатываю надстройку для MS Outlook 2010 с использованием VS 2013. Я использую обработчик событий NewMailEx, чтобы получить EntryID нового поступающего сообщения электронной почты.

Получение EntryIDCollection не проблема (и я удостоверяюсь, что это единственный EntryID, прежде чем двигаться дальше), но я не могу использовать данный идентификатор для поиска фактического объекта электронной почты (с помощью GetItemFromID ()), чтобы я мог получить доступ к телу нового письма . Вместо этого я просто получаю пустой объект MailItem после вызова GetItemFromID ().

public static Outlook.NameSpace olNameSpace;
...
//EVENT: Item Received (new email arrival)
    private static void outLookApp_NewMailEx(string EntryIDCollection)
    {
        try
        {
            //THIS part is failing \/ and returning nothing
            object item = olNameSpace.GetItemFromID(EntryIDCollection, Type.Missing);
            Outlook.MailItem mailItem = item as Outlook.MailItem;

            if (mailItem != null)
            {                    
                //access email object
            }
        }
        catch (Exception e)
        {
            MessageBox.Show("Receive mail exception: " + e);
        }
    }

Нужно ли мне указывать папку для GetItemFromID (), даже если это необязательно?

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

Спасибо всем.

0
B-Witty 26 Фев 2015 в 11:49

4 ответа

Лучший ответ

Спасибо всем за вашу помощь.

В конце концов, я не смог заставить метод GetItemFromID работать согласованно вместе с NewMailEx.

Тем не менее, я рекомендую выполнить рекомендацию Юджина здесь:

https://www.add-in-express.com/creating-addins-blog/2011/11/10/outlook-newmail-custom-solution/

Это последовательное сканирование папок работает довольно хорошо (со 100% надежностью в моих экспериментах). Однако, если у вас возникли какие-либо задержки при использовании этого с Outlook, я рекомендую увеличить время задержки синхронизации и, возможно, использовать обработчики событий, такие как Folder.Items.ItemAdd и Folders.FolderAdd/FolderChange/FolderRemove, для проверки между синхронизациями.

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

Еще раз спасибо, ~ B-Witty

0
Irshad 23 Июн 2015 в 10:40

Проблема в том, что объект olNameSpace не инициализирован. Попробуй это:

private void outLookApp_NewMailEx(string EntryIDCollection)
    {
        olNameSpace = this.Application.GetNamespace("MAPI");
        try
        {
            //THIS part is failing \/ and returning nothing
            object item = olNameSpace.GetItemFromID(EntryIDCollection, Type.Missing);

            Outlook.MailItem mailItem = item as Outlook.MailItem;



            if (mailItem != null)
            {
                mailItem.Display();
            }
        }
        catch (Exception e)
        {
            MessageBox.Show("" + e);
        }
    }
0
stefano 25 Июл 2016 в 21:05

Вы уверены, что GetItemFromID возвращает null? Если есть проблема, он вызовет исключение, а не вернет null. Скорее всего, это следующая строка (Outlook.MailItem mailItem = item as Outlook.MailItem), которая возвращает null, когда вы приводите возвращенный объект к MailItem.

Убедитесь, что вы не имеете дело с объектами ReportItem или MeetingItem.

0
Irshad 23 Июн 2015 в 10:32