Утилитарные функции
Отправка сообщения с вариантом голосования
Microsoft Outlook позволяет пользователям создавать опрос при составлении нового сообщения. Это делается путем включения вариантов голосования, таких как Да, Нет, Может быть и т.д. Класс FollowUpOptions, предлагаемый Aspose.Email, предоставляет свойство VotingButtons, которое может быть использовано для установки или получения значения вариантов голосования. Эта статья предоставляет детальный пример создания MapiMessage с вариантами голосования для создания опроса, а затем отправки сообщения с использованием клиента Exchange Web Service (EWS).
Создание и отправка сообщения с вариантами голосования
Следующий кодовый фрагмент показывает, как создать новое сообщение, а затем отправить его с вариантами голосования.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
string address = "firstname.lastname@aspose.com"; | |
IEWSClient client = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain"); | |
MailMessage message = CreateTestMessage(address); | |
// Set FollowUpOptions Buttons | |
FollowUpOptions options = new FollowUpOptions(); | |
options.VotingButtons = "Yes;No;Maybe;Exactly!"; | |
client.Send(message, options); |
Пример методов, используемых в примерах
Следующий кодовый фрагмент показывает, как использовать методы, использованные в приведенном выше примере.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
private static MailMessage CreateTestMessage(string address) | |
{ | |
MailMessage eml = new MailMessage( | |
address, | |
address, | |
"Flagged message", | |
"Make it nice and short, but descriptive. The description may appear in search engines' search results pages..."); | |
return eml; | |
} |
Игнорирование или обход недействительных или просроченных SSL сертификатов
Aspose.Email может обрабатывать SSL сертификаты на Exchange Server, используя как ExchangeClient, так и EWSClient классы. Если SSL сертификат истек или стал недействительным, Aspose.Email генерирует исключение из-за недействительного SSL сертификата. Избегайте таких ошибок SSL сертификатов, игнорируя их с помощью метода, используемого в коде ниже. Зарегистрируйте обработчик обратного вызова в вашем методе main() или init() и добавьте метод ниже как член класса.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
public static void Run() | |
{ | |
// Register callback method for SSL validation event | |
ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidationHandler; | |
} | |
// This event handler is called when SSL certificate is verified | |
private static bool RemoteCertificateValidationHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) | |
{ | |
return true; //Ignore the checks and go ahead | |
} |
Создание сообщений RE и FW из файлов MSG
IEWSClient позволяет разработчикам создавать сообщения RE (Ответ/Ответить всем) и FW (Переслать) из исходного сообщения. Исходное сообщение определяется выбором определенного ExchangeMessageInfo из ExchangeMessageInfoCollection, полученного с помощью IEWSClient.ListMessages(). Другим аргументом является фактическое MailMessage, которое будет отправлено в качестве сообщения RE или FW. Следующий кодовый фрагмент показывает, как создать образец учетной записи, который используется для отправки сообщения, а затем демонстрируются функции ответа и пересылки на этом образце сообщения. Для выполнения этой задачи:
- Инициализируйте объект IEWSClient с действительными учетными данными.
- Отправьте несколько образцовых сообщений.
- Вызовите функции IEWSClient.Reply(), IEWSClient.ReplyAll() и IEWSClient.Forward() для отправки сообщений.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
string dataDir = RunExamples.GetDataDir_Exchange(); | |
const string mailboxUri = "https://exchange.domain.com/ews/Exchange.asmx"; | |
const string domain = @""; | |
const string username = @"username"; | |
const string password = @"password"; | |
NetworkCredential credential = new NetworkCredential(username, password, domain); | |
IEWSClient client = EWSClient.GetEWSClient(mailboxUri, credential); | |
try | |
{ | |
MailMessage message = new MailMessage("user@domain.com", "user@domain.com", "TestMailRefw - " + Guid.NewGuid().ToString(), | |
"TestMailRefw Implement ability to create RE and FW messages from source MSG file"); | |
client.Send(message); | |
ExchangeMessageInfoCollection messageInfoCol = client.ListMessages(client.MailboxInfo.InboxUri); | |
if (messageInfoCol.Count == 1) | |
Console.WriteLine("1 message in Inbox"); | |
else | |
Console.WriteLine("Error! No message in Inbox"); | |
MailMessage message1 = new MailMessage("user@domain.com", "user@domain.com", "TestMailRefw - " + Guid.NewGuid().ToString(), | |
"TestMailRefw Implement ability to create RE and FW messages from source MSG file"); | |
client.Send(message1); | |
messageInfoCol = client.ListMessages(client.MailboxInfo.InboxUri); | |
if (messageInfoCol.Count == 2) | |
Console.WriteLine("2 messages in Inbox"); | |
else | |
Console.WriteLine("Error! No new message in Inbox"); | |
MailMessage message2 = new MailMessage("user@domain.com", "user@domain.com", "TestMailRefw - " + Guid.NewGuid().ToString(), | |
"TestMailRefw Implement ability to create RE and FW messages from source MSG file"); | |
message2.Attachments.Add(Attachment.CreateAttachmentFromString("Test attachment 1", "Attachment Name 1")); | |
message2.Attachments.Add(Attachment.CreateAttachmentFromString("Test attachment 2", "Attachment Name 2")); | |
// Reply, Replay All and forward Message | |
client.Reply(message2, messageInfoCol[0]); | |
client.ReplyAll(message2, messageInfoCol[0]); | |
client.Forward(message2, messageInfoCol[0]); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine("Error in program"+ex.Message); | |
} |
Поддержка отслеживания электронной почты
API Aspose.Email предоставляет поддержку отслеживания электронной почты с использованием Уведомления о распределении сообщения (MDN). Это достигается путем запроса квитанций о прочтении и создания необходимой информации. Свойство MailMessage.ReadReceiptTo получает или устанавливает адрес для квитанций о прочтении. Методы CreateReadReceipt и ReadReceiptRequested используются для создания и получения информации о том, запрашиваются ли квитанции о прочтении. Следующий кодовый фрагмент показывает, как отслеживать электронную почту с использованием API Aspose.Email.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Send message with the requested read receipt | |
MailMessage mailMessage = new MailMessage("fromAddress", "toAddress", "test MDN","This is a test message with read receipt requested"); | |
// request the read receipt | |
mailMessage.ReadReceiptTo = "fromAddress"; | |
SendMessage(mailMessage, SendMethod.SMTP); | |
// Add multiple ReadReceiptTo addresses. Send message with the requested read receipt. | |
mailMessage = new MailMessage("fromAddress", "toAddress", "test MDN","This is a test message with read receipt requested"); | |
var addressCollection = new Aspose.Email.Mail.MailAddressCollection(); | |
addressCollection.Add("fromAddress"); | |
addressCollection.Add(anotherAddress); | |
mailMessage.ReadReceiptTo = addressCollection; | |
SendMessage(mailMessage, SendMethod.SMTP); | |
// Send message by Exchange | |
mailMessage = new MailMessage("fromAddress", "toAddress", "test MDN","This is a test message with read receipt requested"); | |
mailMessage.ReadReceiptTo = "fromAddress"; | |
SendMessage(mailMessage, SendMethod.Exchange); | |
// Check the request, create and send read receipt. | |
MailMessage emlMDN = FetchMessage(); | |
if (emlMDN.ReadReceiptTo.Count > 0) | |
{ | |
SendMessage(emlMDN.CreateReadReceipt("toAddress", null), SendMethod.SMTP); | |
} | |
// Create the MapiMessage with requested read receipt | |
MapiMessage mapiMessage = new MapiMessage("fromAddress", "toAddress", "test MDN", "This is a read requested mapiMessage", OutlookMessageFormat.Unicode); | |
mapiMessage.ReadReceiptRequested = true; | |
// Create the MailMessage with requested read receipt and convert it to MapiMessage | |
mailMessage = new MailMessage("fromAddress", "toAddress", "test MDN","This is a test message with read receipt requested"); | |
mailMessage.ReadReceiptTo = "fromAddress"; | |
mapiMessage = MapiMessage.FromMailMessage(mailMessage, MapiConversionOptions.UnicodeFormat); | |
mapiMessage = new MapiMessage("dmitry.samodurov@aspose.com", "dmitry.samodurov@aspose.com", "test MDN", "This is a read requested mapiMessage", OutlookMessageFormat.Unicode); | |
mapiMessage.ReadReceiptRequested = true; | |
var getData = MailMessageInterpretorFactory.Instance.GetIntepretor(mapiMessage.MessageClass); | |
var getMessage = mi.Interpret(mapiMessage); |
Поддержка ведения журнала в клиентах Exchange
API Aspose.Email предоставляет возможность предоставлять средства ведения журнала для клиента Exchange Web Service. Это можно достичь, настроив файл App.config.
Ведение журнала для EWS клиента
<?xml version="1.0" encoding="utf-8" ?> | |
<configuration> | |
<configSections> | |
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > | |
<section name="Aspose.Email.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> | |
</sectionGroup> | |
</configSections> | |
<applicationSettings> | |
<Aspose.Email.Properties.Settings> | |
<setting name="EWSDiagnosticLog" serializeAs="String"> | |
<value>..\..\..\Log\Aspose.Email.EWS.log</value> | |
</setting> | |
<setting name="EWSDiagnosticLog_UseDate" serializeAs="String"> | |
<value>True</value> | |
</setting> | |
</Aspose.Email.Properties.Settings> | |
</applicationSettings> | |
</configuration> |
Добавление заголовков в EWS запросы
API Aspose.Email позволяет добавлять заголовки в запросы Exchange. Это можно использовать для добавления заголовков в запросы EWS для различных заголовков, которые могут использоваться для разных целей. Одним из таких примеров может быть добавление заголовка X-AnchorMailbox, который используется для управления проблемами с ограничением на сервере Exchange. Метод AddHeader класса IEWSClient используется для добавления заголовков в запросы EWS, как показано в следующем кодовом фрагменте.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
using (IEWSClient client = EWSClient.GetEWSClient("exchange.domain.com/ews/Exchange.asmx", "username", "password", "")) | |
{ | |
client.AddHeader("X-AnchorMailbox", "username@domain.com"); | |
ExchangeMessageInfoCollection messageInfoCol = client.ListMessages(client.MailboxInfo.InboxUri); | |
} |
Работа с унифицированным сообщением
Aspose.Email может извлекать информацию о унифицированном сообщении из Exchange Server 2010. Поддерживается унифицированное сообщение, такое как получение конфигурационной информации, инициирование исходящего вызова, получение информации о телефонном звонке по идентификатору вызова и отключение телефонного звонка по идентификатору. Следующий образец кода показывает, как извлечь информацию о конфигурации унифицированного сообщения из Microsoft Exchange Server 2010.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
IEWSClient client = EWSClient.GetEWSClient(mailboxUri, credential); | |
UnifiedMessagingConfiguration umConf = client.GetUMConfiguration(); |
Получение советов по электронной почте
Microsoft Exchange Server добавил несколько новых функций с Exchange Server 2010 и 2013. Одна из них позволяет пользователям получать советы по электронной почте при составлении сообщения электронной почты. Эти советы очень полезны, поскольку они предоставляют информацию перед отправкой электронной почты. Например, если адрес электронной почты неверен в списке получателей, отображается совет, чтобы сообщить вам, что адрес электронной почты недействителен. Советы по электронной почте также позволяют вам видеть автоматические ответы “вне офиса” перед отправкой электронной почты: Exchange Server (2010 и 2013) отправляет совет по электронной почте, когда сообщение составляется, если один или несколько получателей настроили автоматические ответы “вне офиса”. Для всех функций, продемонстрированных в этой статье, требуется Microsoft Exchange Server 2010 Service Pack 1. Следующий кодовый фрагмент показывает, как использовать класс EWSClient, который использует Exchange Web Services, доступные в Microsoft Exchange Server 2007 и более поздних версиях.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Create instance of EWSClient class by giving credentials | |
IEWSClient client = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain"); | |
Console.WriteLine("Connected to Exchange server..."); | |
// Provide mail tips options | |
MailAddressCollection addrColl = new MailAddressCollection(); | |
addrColl.Add(new MailAddress("test.exchange@ex2010.local", true)); | |
addrColl.Add(new MailAddress("invalid.recipient@ex2010.local", true)); | |
GetMailTipsOptions options = new GetMailTipsOptions("administrator@ex2010.local", addrColl, MailTipsType.All); | |
// Get Mail Tips | |
MailTips[] tips = client.GetMailTips(options); | |
// Display information about each Mail Tip | |
foreach (MailTips tip in tips) | |
{ | |
// Display Out of office message, if present | |
if (tip.OutOfOffice != null) | |
{ | |
Console.WriteLine("Out of office: " + tip.OutOfOffice.ReplyBody.Message); | |
} | |
// Display the invalid email address in recipient, if present | |
if (tip.InvalidRecipient == true) | |
{ | |
Console.WriteLine("The recipient address is invalid: " + tip.RecipientAddress); | |
} | |
} |
Имитация Exchange
Имитация Exchange позволяет кому-то выдавать себя за другую учетную запись и выполнять задачи и операции, используя разрешения учетной записи, за которую он выдает себя, вместо своих собственных. В то время как делегирование позволяет пользователям действовать от имени других пользователей, имитация позволяет им действовать как другие пользователи. Aspose.Email поддерживает имитацию Exchange. Класс EWSClient предоставляет методы ImpersonateUser и ResetImpersonation для облегчения этой функции.
Для выполнения этой задачи:
- Инициализируйте ExchangeWebServiceClient для пользователя 1.
- Инициализируйте ExchangeWebServiceClient для пользователя 2.
- Добавьте тестовые сообщения к учетным записям.
- Включите имитацию.
- Сбросьте имитацию.
Следующий кодовый фрагмент показывает, как использовать класс EWSClient для реализации функции имитации.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Create instance's of EWSClient class by giving credentials | |
IEWSClient client1 = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser1", "pwd", "domain"); | |
IEWSClient client2 = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser2", "pwd", "domain"); | |
{ | |
string folder = "Drafts"; | |
try | |
{ | |
foreach (ExchangeMessageInfo messageInfo in client1.ListMessages(folder)) | |
client1.DeleteItem(messageInfo.UniqueUri, DeletionOptions.DeletePermanently); | |
string subj1 = string.Format("NETWORKNET_33354 {0} {1}", "User", "User1"); | |
client1.AppendMessage(folder, new MailMessage("User1@exchange.conholdate.local", "To@aspsoe.com", subj1, "")); | |
foreach (ExchangeMessageInfo messageInfo in client2.ListMessages(folder)) | |
client2.DeleteItem(messageInfo.UniqueUri, DeletionOptions.DeletePermanently); | |
string subj2 = string.Format("NETWORKNET_33354 {0} {1}", "User", "User2"); | |
client2.AppendMessage(folder, new MailMessage("User2@exchange.conholdate.local", "To@aspose.com", subj2, "")); | |
ExchangeMessageInfoCollection messInfoColl = client1.ListMessages(folder); | |
//Assert.AreEqual(1, messInfoColl.Count); | |
//Assert.AreEqual(subj1, messInfoColl[0].Subject); | |
client1.ImpersonateUser(ItemChoice.PrimarySmtpAddress, "User2@exchange.conholdate.local"); | |
ExchangeMessageInfoCollection messInfoColl1 = client1.ListMessages(folder); | |
//Assert.AreEqual(1, messInfoColl1.Count); | |
//Assert.AreEqual(subj2, messInfoColl1[0].Subject); | |
client1.ResetImpersonation(); | |
ExchangeMessageInfoCollection messInfoColl2 = client1.ListMessages(folder); | |
//Assert.AreEqual(1, messInfoColl2.Count); | |
//Assert.AreEqual(subj1, messInfoColl2[0].Subject); | |
} | |
finally | |
{ | |
try | |
{ | |
foreach (ExchangeMessageInfo messageInfo in client1.ListMessages(folder)) | |
client1.DeleteItem(messageInfo.UniqueUri, DeletionOptions.DeletePermanently); | |
foreach (ExchangeMessageInfo messageInfo in client2.ListMessages(folder)) | |
client2.DeleteItem(messageInfo.UniqueUri, DeletionOptions.DeletePermanently); | |
} | |
catch { } | |
} | |
} |
Функция автопоиск с использованием EWS
API Aspose.Email позволяет вам узнать настройки Exchange Server с помощью клиента EWS.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
string email = "asposeemail.test3@aspose.com"; | |
string password = "Aspose@2017"; | |
AutodiscoverService svc = new AutodiscoverService(); | |
svc.Credentials = new NetworkCredential(email, password); | |
IDictionary<UserSettingName, object> userSettings = svc.GetUserSettings(email, UserSettingName.ExternalEwsUrl).Settings; | |
string ewsUrl = (string)userSettings[UserSettingName.ExternalEwsUrl]; | |
Console.WriteLine("Auto discovered EWS Url: " + ewsUrl); |
Прерывание операции восстановления PST на сервер Exchange
API Aspose.Email позволяет вам восстановить файл PST на сервер Exchange. Однако, если операция занимает много времени из-за большого размера файла PST, может потребоваться указать критерий для прерывания операции. Это можно реализовать с помощью API, как показано в следующем образце кода.
Примечание: В примере необходимо также добавить следующий класс.
public class CustomAbortRestoreException : Exception { }
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
using (IEWSClient client = EWSClient.GetEWSClient("https://exchange.office365.com/ews/exchange.asmx", "username", "password")) | |
{ | |
DateTime startTime = DateTime.Now; | |
TimeSpan maxRestoreTime = TimeSpan.FromSeconds(15); | |
int processedItems = 0; | |
BeforeItemCallback callback = delegate | |
{ | |
if (DateTime.Now >= startTime.Add(maxRestoreTime)) | |
{ | |
throw new CustomAbortRestoreException(); | |
} | |
processedItems++; | |
}; | |
try | |
{ | |
//create a test pst and add some test messages to it | |
var pst = PersonalStorage.Create(new MemoryStream(), FileFormatVersion.Unicode); | |
var folder = pst.RootFolder.AddSubFolder("My test folder"); | |
for (int i = 0; i < 20; i++) | |
{ | |
var message = new MapiMessage("from@gmail.com", "to@gmail.com", "subj", new string('a', 10000)); | |
folder.AddMessage(message); | |
} | |
//now restore the PST with callback | |
client.Restore(pst, new Aspose.Email.Clients.Exchange.WebService.RestoreSettings | |
{ | |
BeforeItemCallback = callback | |
}); | |
Console.WriteLine("Success!"); | |
} | |
catch (CustomAbortRestoreException) | |
{ | |
Console.WriteLine($"Timeout! {processedItems}"); | |
} |