Отслеживание входящих писем в Outlook 2013 в C # и получение тем электронной почты

1

Я ищу, чтобы отслеживать все новые письма из Outlook 2013 и получать тему электронной почты. Прочитав несколько блогов, я понял, что лучший/простой способ - использовать Microsoft.Office.Interop.Outlook с MAPI и ApplicationEvents_11_NewMailExEventHandler.

Я пробовал эту базу в блоге, и я немного изменил:

using System;
using System.Windows.Forms;
using Microsoft.Office.Interop.Outlook;


class EmailMonitoring
{
    static void Main(string[] args)
    {
        // Create an Outlook application object. 
        Microsoft.Office.Interop.Outlook.Application app = null;
        Microsoft.Office.Interop.Outlook._NameSpace ns = null;

        try
        {  
            //Email
            app = new Microsoft.Office.Interop.Outlook.Application();
            ns = app.GetNamespace("MAPI");
            ns.Logon(null, null, false, false);

            // Ring up the new message event.
            app.NewMailEx += new ApplicationEvents_11_NewMailExEventHandler(outLookApp_NewMailEx);
            Console.WriteLine("Please wait for new messages...");
            Console.ReadLine();
        }
        catch (System.Exception e)
        {
            Console.WriteLine("Exception in Main "+e);
        }
        finally
        {
            ns = null;
            app = null;

        }
    }

    private static void outLookApp_NewMailEx(string EntryIDCollection)
    {
        Console.WriteLine("You've got a new mail whose EntryIDCollection is \n" + EntryIDCollection);
        Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
        Microsoft.Office.Interop.Outlook.MailItem item = null;
        Microsoft.Office.Interop.Outlook._NameSpace ns = app.GetNamespace("MAPI");

        try
        {

            ns.Logon(null, null, false, false);

            item = ns.GetItemFromID(EntryIDCollection);
            Console.WriteLine("test" + item.Subject);
        }
        catch(System.Exception e)
        {
            Console.WriteLine("Exception in event Handler "+e);
         }
        finally
        {
            ns = null;
            app = null;

        }
    }

}

Однако, когда у меня есть новое электронное письмо в Outlook, консоль отображает EntryID и тему, но Outlook замораживается для некоторых конкретных писем и выдает это сообщение об ошибке: "Электронная почта перестала работать".

  • Я забыл удалить некоторые объекты?
  • Есть ли более элегантный способ сделать это? Мне не нравится тот факт, что мне нужно определить 2 Outlook.Applications.
  • Вы рекомендуете какие-либо блоги/книги, которые описывают, как это сделать?
Теги:
email
outlook
events

1 ответ

0

Попробуйте это, это не заблокирует ваш файл Outlook в папке, а новые электронные письма будут в очереди

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace Sample
{
    public partial class frmSample : Form
    {
        Outlook.NameSpace outlookNameSpace;
        Outlook.MAPIFolder inbox;
        Outlook.Items items;
        public frmSample()
        {
            InitializeComponent();
        }

        private void frmSample_Load(object sender, EventArgs e)
        {
            Outlook.Application app = new Outlook.Application();
            outlookNameSpace = app.GetNamespace("MAPI");
            inbox = outlookNameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
            items = inbox.Items;
            items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(items_ItemAdd);
        }
        void items_ItemAdd(object Item)
        {
            Outlook.MailItem mail = (Outlook.MailItem)Item;
            if (Item != null)
            {
                string tempvariable = mail.To;
                tempvariable = mail.Subject;
                tempvariable = mail.Body;
                tempvariable = mail.SenderEmailAddress;
                tempvariable = mail.SenderName.ToString();                        
             }
           }
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню