Работа с почтовыми ящиками Exchange и сообщениями с помощью WebDav

Получение информации о почтовом ящике с помощью WebDav

Класс ExchangeClient имеет методы, которые можно использовать для получения информации о почтовом ящике с сервера Exchange, вызывая метод ExchangeClient.GetMailboxInfo(). Он возвращает экземпляр типа ExchangeMailboxInfo. Получите информацию о почтовом ящике из таких свойств, как MailboxUri, InboxUri и DraftsUri. В этой статье показано, как получить информацию о почтовом ящике непосредственно с сервера Exchange.

Чтобы получить информацию о почтовом ящике Exchange:

  1. Создайте экземпляр класса ExchangeClient.
  2. Укажите сервер Exchange, имя пользователя, пароль и домен в конструкторе ExchangeClient.
  3. Вызовите метод ExchangeClient.GetMailboxSize() для получения размера почтового ящика.
  4. Вызовите метод ExchangeClient.GetMailboxInfo() для получения экземпляра класса ExchangeMailboxInfo.
  5. Получите информацию о почтовом ящике, используя различные свойства класса ExchangeMailboxInfo.

Следующий фрагмент кода демонстрирует, как получить информацию о почтовом ящике Exchange.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("https://MachineName/exchange/Username", "Username", "password", "domain");
// Get mailbox size, exchange mailbox info, Mailbox, Inbox folder, Sent Items folder URI , Drafts folder URI
Console.WriteLine("Mailbox size: " + client.GetMailboxSize() + " bytes");
ExchangeMailboxInfo mailboxInfo = client.GetMailboxInfo();
Console.WriteLine("Mailbox URI: " + mailboxInfo.MailboxUri);
Console.WriteLine("Inbox folder URI: " + mailboxInfo.InboxUri);
Console.WriteLine("Sent Items URI: " + mailboxInfo.SentItemsUri);
Console.WriteLine("Drafts folder URI: " + mailboxInfo.DraftsUri);

Отправка электронных сообщений

Вы можете отправлять электронные сообщения с помощью сервера Exchange с помощью инструментов Aspose.Email.Exchange. Метод ExchangeClient.Send() принимает экземпляр MailMessage в качестве параметра и отправляет электронное письмо. В этой статье объясняется, как отправлять электронные сообщения с использованием сервера Exchange.

Отправка электронных сообщений с помощью сервера Exchange

Чтобы отправить электронные письма с использованием сервера Exchange:

  1. Создайте экземпляр класса ExchangeClient.
  2. Укажите имя сервера, имя пользователя, пароль и домен.
  3. Создайте экземпляр класса MailMessage.
  4. Укажите свойства от, до, тему и другие свойства MailMessage.
  5. Вызовите метод ExchangeClient.Send() для отправки электронной почты.

Следующий фрагмент кода демонстрирует, как отправлять электронные сообщения с использованием сервера Exchange.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("https://MachineName/exchange/username", "username", "password", "domain");
// Create instance of type MailMessage
MailMessage msg = new MailMessage();
msg.From = "sender@domain.com";
msg.To = "recipient@ domain.com ";
msg.Subject = "Sending message from exchange server";
msg.HtmlBody = "<h3>sending message from exchange server</h3>";
// Send the message
client.Send(msg);

Чтение электронных писем из почтового ящика другого пользователя

Некоторые учетные записи на серверах Exchange имеют право доступа к нескольким почтовым ящикам, и некоторые пользователи имеют несколько учетных записей электронной почты на одном сервере Exchange. В обоих случаях пользователи могут получить доступ к почтовым ящикам других пользователей с помощью Aspose.Email для .NET. Этот API предоставляет механизм для доступа к папкам и электронным письмам из других почтовых ящиков с помощью класса ExchangeClient. Эта функциональность может быть достигнута с помощью перегруженного метода GetMailboxInfo() и предоставления адреса электронной почты пользователя в качестве параметра.

Следующий фрагмент кода демонстрирует, как использовать класс ExchangeClient для доступа к другому почтовому ящику.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("http://MachineName/exchange/Username","Username", "password", "domain");
// Get Exchange mailbox info of other email account
ExchangeMailboxInfo mailboxInfo = client.GetMailboxInfo("otherUser@domain.com");

Перечисление сообщений

Список электронных сообщений в почтовом ящике Exchange можно получить, вызвав метод ExchangeClient.ListMessages. Получите основную информацию о сообщениях, такую как тема, от, до и идентификатор сообщения, с помощью метода ListMessages.

Простое перечисление сообщений

Чтобы перечислить сообщения в почтовом ящике Exchange:

  1. Создайте экземпляр класса ExchangeClient.
  2. Вызовите метод ListMessages и создайте коллекцию сообщений.
  3. Пройдите по коллекции и отобразите информацию о сообщении.

Следующий фрагмент кода демонстрирует, как подключиться к почтовому ящику Exchange и получить список сообщений из папки “Входящие”.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("https://MachineName/exchange/Username", "username", "password", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.ListMessages(client.MailboxInfo.InboxUri);
// Loop through the collection to display the basic information
foreach (ExchangeMessageInfo msgInfo in msgCollection)
{
Console.WriteLine("Subject: " + msgInfo.Subject);
Console.WriteLine("From: " + msgInfo.From.ToString());
Console.WriteLine("To: " + msgInfo.To.ToString());
Console.WriteLine("Sent Date: " + msgInfo.Date.ToString());
Console.WriteLine("Read?: " + msgInfo.IsRead.ToString());
Console.WriteLine("Message ID: " + msgInfo.MessageId);
Console.WriteLine("Unique URI: " + msgInfo.UniqueUri);
}

Перечисление сообщений из разных папок

В приведенных выше фрагментах кода перечислены все сообщения в папке “Входящие”. Также можно получить список сообщений из других папок. Метод ExchangeClient.ListMessages() принимает URI папки в качестве параметра. Пока URI папки действителен, вы можете получить список сообщений из этой папки. Используйте свойство ExchangeClient.MailboxInfo.xxxFolderUri, чтобы получить URI различных папок. Остальная часть кода такая же, как для получения списка сообщений. Следующий фрагмент кода демонстрирует, как перечислить сообщения из разных папок, используя ExchangeClient.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("https://MachineName/exchange/Username", "username", "password", "domain");
// Get folder URI
string strFolderURI = string.Empty;
strFolderURI = client.MailboxInfo.InboxUri;
strFolderURI = client.MailboxInfo.DeletedItemsUri;
strFolderURI = client.MailboxInfo.DraftsUri;
strFolderURI = client.MailboxInfo.SentItemsUri;
// get list of messages from the specified folder
ExchangeMessageInfoCollection msgCollection = client.ListMessages(strFolderURI);

Перечисление сообщений по ID

В приведенном выше фрагменте кода использован метод ListMessages для перечисления всех сообщений в указанной папке почтового ящика сервера Exchange. Если вы заранее знаете идентификатор сообщения, вы можете получить сообщение, используя метод ListMessagesbyId(). Чтобы получить сообщение, передайте URI папки и идентификатор сообщения. Этот сценарий полезен, когда вы уже знаете идентификатор сообщения, например, когда идентификаторы сообщений сохранены в базе данных. Следующий фрагмент кода демонстрирует, как перечислить сообщения по ID.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("https://MachineName/exchange/Username", "username", "password", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.ListMessagesById(client.MailboxInfo.InboxUri, "23A747F0C7A5DB4BAB299C2BE2383FD556E630DD@machinename.local");
// Loop through the collection to display the basic information
foreach (ExchangeMessageInfo msgInfo in msgCollection)
{
Console.WriteLine("Subject: " + msgInfo.Subject);
Console.WriteLine("From: " + msgInfo.From.ToString());
Console.WriteLine("To: " + msgInfo.To.ToString());
Console.WriteLine("Message ID: " + msgInfo.MessageId);
Console.WriteLine("Unique URI: " + msgInfo.UniqueUri);
Console.WriteLine("==================================");
}

Сохранение сообщений

Эта тема показывает, как получить сообщения из почтового ящика сервера Exchange и сохранить их на диск в форматах EML и MSG:

  • Сохранить в формате EML на диск.
  • Сохранить в поток памяти.
  • Сохранить в формате MSG.

Сохранение сообщений в формате EML

Чтобы получить сообщения и сохранить в формате EML:

  1. Создайте экземпляр класса ExchangeClient.
  2. Укажите имя сервера, имя пользователя, пароль и домен.
  3. Вызовите метод ExchangeClient.ListMessages(), чтобы получить экземпляр коллекции ExchangeMessagesInfoCollection.
  4. Пройдите по коллекции ExchangeMessagesInfoCollection, чтобы получить уникальный URI для каждого сообщения.
  5. Вызовите метод ExchangeClient.SaveMessage() и передайте уникальный URI в качестве параметра.
  6. Передайте методу SaveMessage() путь, по которому вы хотите сохранить файл.

Следующий фрагмент кода демонстрирует, как сохранить сообщения в формате EML.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
string dataDir = RunExamples.GetDataDir_Exchange();
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("https://Servername/exchange/username", "username", "password", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.ListMessages(client.MailboxInfo.InboxUri);
// Loop through the collection to get Message URI
foreach (ExchangeMessageInfo msgInfo in msgCollection)
{
string strMessageURI = msgInfo.UniqueUri;
// Now save the message in disk
client.SaveMessage(strMessageURI, dataDir + msgInfo.MessageId + ".eml");
}

Сохранение сообщений в поток памяти

Вместо того чтобы сохранять файлы EML на диск, можно сохранить их в поток памяти. Это полезно, когда вы хотите сохранить поток в какое-то место хранения, например, в базе данных. После того как поток был сохранен в базе данных, вы можете повторно загрузить файл EML в класс MailMessage. Следующий фрагмент кода демонстрирует, как сохранить сообщения из почтового ящика сервера Exchange в поток памяти.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
string dataDir = RunExamples.GetDataDir_Exchange();
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("https://Ex07sp1/exchange/Administrator", "user", "pwd",
"domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.ListMessages(client.MailboxInfo.InboxUri);
// Loop through the collection to get Message URI
foreach (ExchangeMessageInfo msgInfo in msgCollection)
{
string strMessageURI = msgInfo.UniqueUri;
// Now save the message in memory stream
MemoryStream stream = new MemoryStream();
client.SaveMessage(strMessageURI, stream);
}

Сохранение сообщений в формате MSG

Метод ExchangeClient.SaveMessage() может напрямую сохранить сообщение в формате EML. Чтобы сохранить сообщения в формате MSG, сначала вызовите метод ExchangeClient.fetchMessage(), который возвращает экземпляр класса MailMessage. Затем вызовите метод MailMessage.Save(), чтобы сохранить сообщение в формате MSG. Следующий фрагмент кода показывает, как получить сообщения из почтового ящика сервера Exchange и сохранить их в формате MSG.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("http://ex07sp1/exchange/Administrator", "user", "pwd", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.ListMessages(client.MailboxInfo.InboxUri);
int count = 0;
// Loop through the collection to get Message URI
foreach (ExchangeMessageInfo msgInfo in msgCollection)
{
string strMessageURI = msgInfo.UniqueUri;
// Now get the message details using FetchMessage() and Save message as msg
MailMessage message = client.FetchMessage(strMessageURI);
message.Save(dataDir + (count++) + "_out.msg", SaveOptions.DefaultMsgUnicode);
}

Получение сообщений из почтового ящика сервера Exchange

Метод ListMessages использовался для получения списка сообщений из почтового ящика сервера Exchange. Метод ListMessages получает основную информацию о сообщениях, например, тему, идентификатор сообщения, от и до. Чтобы получить полные детали сообщения, Aspose.Email.Exchange предоставляет метод ExchangeClient.FetchMessage(). Этот метод принимает URI сообщения в качестве параметра и возвращает экземпляр класса MailMessage. Класс MailMessage затем предоставляет такие детали сообщения, как тело, заголовки иAttachments. Чтобы получить сообщения из почтового ящика сервера Exchange:

  1. Создайте экземпляр типа ExchangeClient.
  2. Укажите mailboxUri, имя пользователя, пароль и домен.
  3. Вызовите ListMessages, чтобы получить ExchangeMessagesInfoCollection.
  4. Пройдите по коллекции ExchangeMessagesInfoCollection, чтобы получить значения ExchangeMessageInfo.UniqueURI.
  5. Вызовите ExchangeClient.FetchMessage() и передайте ExchangeMessageInfo.UniqueURI в качестве параметра.

Следующий фрагмент кода показывает, как подключиться к почтовому ящику сервера Exchange и получить все сообщения.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("http://ex07sp1/exchange/Administrator", "user", "pwd", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.ListMessages(client.GetMailboxInfo().InboxUri);
// Loop through the collection to get Message URI
foreach (ExchangeMessageInfo msgInfo in msgCollection)
{
string strMessageURI = msgInfo.UniqueUri;
// Now get the message details using FetchMessage()
MailMessage msg = client.FetchMessage(strMessageURI);
foreach (Attachment att in msg.Attachments)
{
Console.WriteLine("Attachment Name: " + att.Name);
}
}

Предварительное получение размера сообщения

Microsoft Outlook InterOp предоставляет возможность извлекать размер сообщения до фактической выборки полного сообщения с сервера. В случае API Aspose.Email сводная информация, полученная с сервера Exchange, представлена классом ExchangeMessageInfo. Он предоставляет ту же функцию получения размера сообщения с помощью свойства Size. Для получения размера сообщения используется стандартный вызов метода ListMessages класса ExchangeClient, который получает коллекцию ExchangeMessageInfo. Следующий фрагмент кода показывает, как отобразить размер сообщения с помощью класса ExchangeMessageInfo.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of ExchangeClient class by giving credentials
ExchangeClient client = new ExchangeClient("http://ex07sp1/exchange/Administrator", "user", "pwd", "domain");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.ListMessages(client.MailboxInfo.InboxUri);
// Loop through the collection to display the basic information
foreach (ExchangeMessageInfo msgInfo in msgCollection)
{
Console.WriteLine("Subject: " + msgInfo.Subject);
Console.WriteLine("From: " + msgInfo.From.ToString());
Console.WriteLine("To: " + msgInfo.To.ToString());
Console.WriteLine("Message Size: " + msgInfo.Size);
Console.WriteLine("==================================");
}

Перемещение сообщений

Вы можете перемещать электронные сообщения из одной папки в другую с помощью метода класса ExchangeClient MoveItems. Он принимает параметры:

  • Уникальный URI сообщения, которое нужно переместить.
  • Уникальный URI папки назначения.

Перемещение сообщений между папками

Следующий фрагмент кода демонстрирует, как переместить сообщение в почтовом ящике из папки “Входящие” в папку под названием “Обработано”. В этом примере приложение:

  1. Читает сообщения из папки “Входящие”.
  2. Обрабатывает некоторые сообщения на основе определенных критериев (в этом примере мы находим ключевое слово в теме сообщения).
  3. Перемещает сообщения, которые соответствуют указанному условию, в папку “обработано”.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
string mailboxURI = "https://Ex2003/exchange/administrator"; // WebDAV
string username = "administrator";
string password = "pwd";
string domain = "domain.local";
Console.WriteLine("Connecting to Exchange Server....");
NetworkCredential credential = new NetworkCredential(username, password, domain);
ExchangeClient client = new ExchangeClient(mailboxURI, credential);
ExchangeMailboxInfo mailboxInfo = client.GetMailboxInfo();
// List all messages from Inbox folder
Console.WriteLine("Listing all messages from Inbox....");
ExchangeMessageInfoCollection msgInfoColl = client.ListMessages(mailboxInfo.InboxUri);
foreach (ExchangeMessageInfo msgInfo in msgInfoColl)
{
// Nove message to "Processed" folder, after processing certain messages based on some criteria
if (msgInfo.Subject != null &&
msgInfo.Subject.ToLower().Contains("process this message") == true)
{
client.MoveItems(msgInfo.UniqueUri, client.MailboxInfo.RootUri + "/Processed/" + msgInfo.Subject);
Console.WriteLine("Message moved...." + msgInfo.Subject);
}
else
{
// Do something else
}
}

Удаление сообщений

Вы можете удалить электронные сообщения из папки с помощью метода класса ExchangeClient DeleteMessage. Он принимает уникальный URI сообщения в качестве параметра.

Удаление сообщений с сервера Exchange

Следующий фрагмент кода демонстрирует, как удалить сообщение из папки “Входящие”. Для целей этого примера код:

  1. Читает сообщения из папки “Входящие”.
  2. Обрабатывает сообщения на основе определенных критериев (в этом примере мы находим ключевое слово в теме сообщения).
  3. Удаляет сообщение.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create instance of IEWSClient class by giving credentials
string mailboxURI = "https://Ex2003/exchange/administrator"; // WebDAV
string username = "administrator";
string password = "pwd";
string domain = "domain.local";
Console.WriteLine("Connecting to Exchange Server....");
NetworkCredential credential = new NetworkCredential(username, password, domain);
ExchangeClient client = new ExchangeClient(mailboxURI, credential);
ExchangeMailboxInfo mailboxInfo = client.GetMailboxInfo();
// List all messages from Inbox folder
Console.WriteLine("Listing all messages from Inbox....");
ExchangeMessageInfoCollection msgInfoColl = client.ListMessages(mailboxInfo.InboxUri);
foreach (ExchangeMessageInfo msgInfo in msgInfoColl)
{
// Delete message based on some criteria
if (msgInfo.Subject != null &&
msgInfo.Subject.ToLower().Contains("delete") == true)
{
client.DeleteMessage(msgInfo.UniqueUri);
Console.WriteLine("Message deleted...." + msgInfo.Subject);
}
else
{
// Do something else
}
}