Я изучал это совсем недавно и имею следующее:
Я запускаю консольное приложение, которое настроит потоковое соединение для проверки новых писем, поступающих в почтовый ящик для userOne@myDomain.com
static void Main(string[] args)
{
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
WebCredentials wbcred = new WebCredentials("userone", "password", "mydomain");
service.Credentials = wbcred;
Console.WriteLine("Attempting to autodiscover Url...");
service.AutodiscoverUrl("userone@mydomain.com", RedirectionUrlValidationCallback);
EWSConnection.SetStreamingNotifications(service);
Console.ReadKey();
Environment.Exit(0);
}
Мой EWSConnection
статический класс выглядит примерно так:
public static void SetStreamingNotifications(ExchangeService service)
{
_service = service;
try
{ var subscription = service.SubscribeToStreamingNotifications(
new FolderId[] { WellKnownFolderName.Inbox },
EventType.NewMail);
StreamingSubscriptionConnection connection = new StreamingSubscriptionConnection(service, 5);
connection.AddSubscription(subscription);
connection.OnNotificationEvent += new StreamingSubscriptionConnection.NotificationEventDelegate(OnEvent);
connection.Open();
_subscription = subscription;
_subscriptionConnection = connection;
Console.WriteLine($"Connection Open:{connection.IsOpen}");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
При этом вы можете видеть, что я подписался на OnNotificationEvent
, и, в свою очередь, мой метод OnEvent
будет вызываться при получении нового электронного письма. Когда в этот почтовый ящик приходит новое электронное письмо, у меня возникает требование создать задачу и назначить ее соответствующему лицу на основе свойства ToAddress
.
private static void CreateTask(NotificationEvent notification, RecievedMail recievedMail)
{
try
{
Console.WriteLine("Attempting to create task");
Microsoft.Exchange.WebServices.Data.Task task = new Microsoft.Exchange.WebServices.Data.Task(_service);
task.DueDate = DateTime.Now.AddDays(7);
task.Body = recievedMail.Body;
task.Subject = recievedMail.Subject;
string targetSharedEmailAddress = null;
if (recievedMail.ToAddress.ToString() == "humanresources <SMTP:humanresources@myDomain.com>")
{
targetSharedEmailAddress = "usertwo@mydomain.com";
}
task.Save(new FolderId(WellKnownFolderName.Tasks,targetSharedEmailAddress)); //
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
Сначала вы можете видеть, что я пытался добавить человека, для которого нужно создать задачу, в методе task.Save
, однако, как только я перешел в Outlook для взаимодействия с вновь созданной задачей, владелец все еще был userone
т. е. человек, который использовал учетные данные для подключения к службе, для меня это была проблема, поскольку мне нужно, чтобы владельцем задачи было usertwo
.
Это было достигнуто путем удаления переменной targetSharedEmailAddress
и использования свойства ImpersonatedUserId
объекта ExchangeServer
.
if (recievedMail.ToAddress.ToString() == "humanresources <SMTP:humanresources@mydomain.com>")
{
_service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "usertwo@mydomain.com");
}
https://msdn.microsoft.com/en-us/library/office/dd633680(v=exchg.80).aspx