EWS订阅收件箱中的流通知

本文关键字:通知 收件箱 EWS | 更新日期: 2023-09-27 18:06:24

我试图编写一个控制台应用程序,它将使用EWS建立到邮箱的连接,然后每次收到新电子邮件时打印一行。

最终的结果,一旦我有这个工作是把它变成一个服务,并有一个任务创建每次电子邮件到达某个邮箱,但现在我不能让控制台写一行收到。

Console Application Project

Program.cs

class Program
{
    static void Main(string[] args)
    {
         ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
         WebCredentials wbcred = new WebCredentials("myusername", "mypassw0rd");
         service.Credentials = wbcred;
         service.AutodiscoverUrl("myemailaddress@mydomain.com", RedirectionUrlValidationCallback);
         EWSConnection.SetStreamingNotifications(service);
    }
    internal static bool RedirectionUrlValidationCallback(string redirectionUrl)
    {
        //The default for the validation callback is to reject the URL
        bool result = false;
        Uri redirectionUri = new Uri(redirectionUrl);
        if (redirectionUri.Scheme == "https")
        {
            result = true;
        }
        return result;
    } 
}

类库项目

EWSConnection.cs

  public static void SetStreamingNotifications(ExchangeService service)
        {
            StreamingSubscription subscription;
            // Subscribe to streaming notifications in the Inbox. 
            subscription = service.SubscribeToStreamingNotifications(
                new FolderId[] { WellKnownFolderName.Inbox },
                EventType.NewMail);
            // Create a streaming connection to the service object, over which events are returned to the client.
            // Keep the streaming connection open for 30 minutes.
            StreamingSubscriptionConnection connection = new StreamingSubscriptionConnection(service, 30);
            connection.AddSubscription(subscription);
            connection.OnNotificationEvent += OnEvent;
            connection.OnDisconnect += OnDisconnect;
            connection.Open();
            bool status = connection.IsOpen;
            Console.WriteLine($"Connection Open:{status}");
        }

如果需要,我可以添加OnEventOnDisconnect方法。控制台打印

连接打开:True按任意键继续…

然后,当我向该邮箱发送电子邮件时,什么也没有发生,没有触发断点,也没有输出到控制台,这就是这两个方法所做的。

为什么我的OnEvent方法不开火?

Edit - OnEvent &

 public static void OnEvent(object sender, NotificationEventArgs args)
        {
            StreamingSubscription subscription = args.Subscription;
            // Loop through all item-related events. 
            foreach (NotificationEvent notification in args.Events)
            {
                switch (notification.EventType)
                {
                    case EventType.NewMail:
                        Console.WriteLine("'n————-Mail created:————-");
                        break;
                    case EventType.Created:
                        Console.WriteLine("'n————-Item or folder created:————-");
                        break;
                    case EventType.Deleted:
                        Console.WriteLine("'n————-Item or folder deleted:————-");
                        break;
                }
                // Display the notification identifier. 
                if (notification is ItemEvent)
                {
                    // The NotificationEvent for an e-mail message is an ItemEvent. 
                    ItemEvent itemEvent = (ItemEvent)notification;
                    Console.WriteLine("'nItemId: " + itemEvent.ItemId.UniqueId);
                }
                else
                {
                    // The NotificationEvent for a folder is an FolderEvent. 
                    FolderEvent folderEvent = (FolderEvent)notification;
                    Console.WriteLine("'nFolderId: " + folderEvent.FolderId.UniqueId);
                }
            }
        }

public static void OnDisconnect(object sender, SubscriptionErrorEventArgs args)
{
    // Cast the sender as a StreamingSubscriptionConnection object.           
    StreamingSubscriptionConnection connection = (StreamingSubscriptionConnection)sender;
    // Ask the user if they want to reconnect or close the subscription. 
    ConsoleKeyInfo cki;
    Console.WriteLine("The connection to the subscription is disconnected.");
    Console.WriteLine("Do you want to reconnect to the subscription? Y/N");
    while (true)
    {
        cki = Console.ReadKey(true);
        {
            if (cki.Key == ConsoleKey.Y)
            {
                connection.Open();
                Console.WriteLine("Connection open.");
                break;
            }
            else if (cki.Key == ConsoleKey.N)
            {
                // The ReadKey in the Main() consumes the E. 
                Console.WriteLine("'n'nPress E to exit");
                break;
            }
        }
    }
}

EWS订阅收件箱中的流通知

令人恼火的是,我缺少了Console.ReadKey()方法。一旦我添加了这个,它就像预期的那样工作了…

    static void Main(string[] args)
    {
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
        WebCredentials wbcred = new WebCredentials("myusername", "mypassw0rd","myDomain");
        service.Credentials = wbcred;
        service.AutodiscoverUrl("myemailaddress@mydomain.com", RedirectionUrlValidationCallback);
        EWSConnection.SetStreamingNotifications(service);
        Console.ReadKey(); //<-- this was missing
    }

将方法绑定到当前订阅

connection.OnNotificationEvent +=
                new StreamingSubscriptionConnection.NotificationEventDelegate(OnEvent);
connection.OnDisconnect +=
        new StreamingSubscriptionConnection.SubscriptionErrorDelegate(OnDisconnect); 

这里有一个例子