В настоящее время я разрабатываю надстройку для 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, чтобы иметь простой рабочий пример.
Спасибо всем.
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
Проблема в том, что объект 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);
}
}
Вы уверены, что GetItemFromID
возвращает null
? Если есть проблема, он вызовет исключение, а не вернет null
. Скорее всего, это следующая строка (Outlook.MailItem mailItem = item as Outlook.MailItem
), которая возвращает null
, когда вы приводите возвращенный объект к MailItem
.
Убедитесь, что вы не имеете дело с объектами ReportItem
или MeetingItem
.
Остроумный,
Какое фактическое значение передается в GetItemFromID < / a> метод?
Нужно ли мне указывать папку для GetItemFromID (), даже если это необязательно?
Нет, второй параметр указывать не нужно. Это необязательно.
Я предлагаю прочитать следующую серию статей, связанных с обработкой входящих писем в Outlook:
- Обработка событий NewMail, NewMailEx и ItemAdd Outlook в .NET
- Событие Outlook NewMail развязано: проблема (NewMail, NewMailEx, ItemAdd)
- Событие Outlook NewMail: варианты решения
- Событие Outlook NewMail и расширенный MAPI: пример C #
- Выпущен Outlook NewMail: написание рабочего решения (пример C #)
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.