Aspose.Email for .NET のユーティリティ機能
統合メッセージングの操作
Aspose.Emailは、Exchange Server 2010から統合メッセージング情報を取得できます。現在、構成情報の取得、発信通話の開始、通話IDによる電話情報の取得、IDによる通話切断などの統合メッセージングがサポートされています。以下のコードサンプルは、Microsoft Exchange Server 2010から統合メッセージング構成情報を取得する方法を示しています。
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 Microsoft Exchange Server 2007以降で利用可能なExchange Web Servicesを使用するクラスです。
// 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 class は以下を提供します ImpersonateUser および ResetImpersonation メソッドはこの機能を促進します。
このタスクを実行するには:
- ユーザー1用にExchangeWebServiceClientを初期化。
- ユーザー2用にExchangeWebServiceClientを初期化。
- アカウントにテストメッセージを追加。
- インパーソネーションを有効化。
- インパーソネーションをリセット。
以下のコードスニペットは、使用方法を示しています。 EWSClient インパーソネーション機能を実装するクラス。
// 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による自動検出機能
Aspose.Email APIを使用すると、EWSクライアントでExchangeサーバーの設定を検出できます。
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);
ExchangeサーバーへのPST復元操作を中止
Aspose.Email APIを使用すると、PSTファイルをExchangeサーバーに復元できます。ただし、PSTファイルが大きいため操作に時間がかかる場合、操作を中止する基準を指定する必要があります。これは、以下のサンプルコードのようにAPIを使用して実現できます。
注: この例では以下のクラスも追加する必要があります。
public class CustomAbortRestoreException : Exception { }
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}");
}