Recursos de Utilidade

Enviando uma Mensagem com Opção de Votação

Microsoft Outlook permite que os usuários criem uma enquete ao compor uma nova mensagem. Isso é feito incluindo opções de votação como Sim, Não, Talvez, etc. A classe FollowUpOptions oferecida pelo Aspose.Email, fornece a propriedade VotingButtons que pode ser usada para definir ou obter o valor das opções de votação. Este artigo fornece um exemplo detalhado de como criar um MapiMessage com opções de votação para criar uma enquete e, em seguida, enviar a mensagem utilizando o cliente Exchange Web Service (EWS).

Criando e Enviando uma Mensagem com Opções de Votação

O seguinte trecho de código mostra como criar uma nova mensagem e, em seguida, enviá-la com opções de votação.

// 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);

Métodos de Exemplo Usados nos Exemplos

O seguinte trecho de código mostra como usar os métodos utilizados no exemplo acima.

// 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;
}

Ignorar ou Contornar Certificado SSL Inválido ou Expirado

Aspose.Email pode lidar com certificados SSL no Exchange Server usando tanto as classes ExchangeClient quanto EWSClient. Se o certificado SSL estiver expirado ou se tornar inválido, Aspose.Email lança uma exceção devido ao certificado SSL inválido. Evite tais erros de certificado SSL ignorando-os usando o método utilizado no código abaixo. Registre o manipulador de callback em seu método main() ou init() e adicione o método abaixo como membro da classe.

// 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
}

Criando Mensagens RE e FW a partir de arquivos MSG

IEWSClient permite que os desenvolvedores criem mensagens RE (Responder/Responder a Todos) e FW (Encaminhar) a partir de uma mensagem fonte. A mensagem fonte é identificada selecionando uma ExchangeMessageInfo específica da ExchangeMessageInfoCollection obtida por IEWSClient.ListMessages(). O outro argumento é o MailMessage que deve ser enviado como mensagem RE ou FW. O seguinte trecho de código mostra como criar uma conta de exemplo que é usada para enviar uma mensagem e, em seguida, as funcionalidades de Responder e Encaminhar são demonstradas contra essa mensagem de exemplo. Para realizar esta tarefa:

  1. Inicialize o objeto IEWSClient fornecendo credenciais válidas.
  2. Envie algumas mensagens de exemplo.
  3. Chame as funções IEWSClient.Reply(), IEWSClient.ReplyAll() e IEWSClient.Forward() para enviar mensagens.
// 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);
}

Suporte para Rastreamento de Email

A API Aspose.Email fornece suporte para rastreamento de email usando Notificação de Disposição de Mensagem (MDN). Isso é alcançado ao solicitar os recibos de leitura e criar as informações necessárias. A propriedade MailMessage.ReadReceiptTo obtém ou define o endereço do recibo de leitura configurado. Os métodos CreateReadReceipt e ReadReceiptRequested são usados para criar e recuperar informações sobre se os recibos de leitura foram solicitados. O seguinte trecho de código mostra como rastrear emails usando a 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);

Suporte para Registro em Clientes Exchange

A API Aspose.Email fornece a capacidade de fornecer um recurso de registro para o cliente do Exchange Web Service. Isso pode ser alcançado configurando o arquivo App.config.

Registro para Cliente 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>

Adicionando Cabeçalhos em Solicitações EWS

A API Aspose.Email permite adicionar cabeçalhos às solicitações do Exchange. Isso pode ser usado para adicionar cabeçalhos às solicitações EWS para diferentes cabeçalhos que podem ser usados para diferentes fins. Um exemplo poderia ser adicionar o cabeçalho X-AnchorMailbox que é usado para gerenciar problemas de limitação no servidor Exchange. O método AddHeader da classe IEWSClient é usado para adicionar cabeçalhos às solicitações EWS, conforme mostrado no seguinte trecho de código.

// 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);
}

Trabalhando com Mensagens Unificadas

Aspose.Email pode recuperar informações de mensagens unificadas do Exchange Server 2010. Mensagens unificadas como obter informações de configuração, iniciar uma chamada externa, recuperar informações de chamada telefonando pelo ID e desconectar uma chamada telefônica pelo ID são suportadas atualmente. O seguinte exemplo de código mostra como recuperar informações de configuração de mensagens unificadas do 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();

Obtendo Dicas de Email

O Microsoft Exchange Server adicionou vários novos recursos com o Exchange Server 2010 e 2013. Um deles permite que os usuários obtenham dicas de email ao compor uma mensagem de email. Essas dicas são muito úteis, pois fornecem informações antes que o email seja enviado. Por exemplo, se um endereço de email estiver errado na lista de destinatários, uma dica é exibida para informar que o endereço de email é inválido. As dicas de email também permitem que você veja respostas de fora do escritório antes de enviar um email: o Exchange Server (2010 e 2013) envia a dica de email quando o email está sendo composto se um ou mais dos destinatários tiverem configurado respostas de fora do escritório. O Microsoft Exchange Server 2010 Service Pack 1 é necessário para todos os recursos demonstrados neste artigo. O seguinte trecho de código mostra como usar a classe EWSClient que usa os Serviços Web do Exchange, disponíveis no Microsoft Exchange Server 2007 e versões posteriores.

// 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);
}
}

Impersonação do Exchange

A impersonação do Exchange permite que alguém impersonifique outra conta e realize tarefas e operações usando as permissões da conta impersonificada em vez de suas próprias. Enquanto a delegação permite que os usuários atuem em nome de outros usuários, a impersonação permite que eles atuem como outros usuários. Aspose.Email suporta a impersonação do Exchange. A classe EWSClient fornece os métodos ImpersonateUser e ResetImpersonation para facilitar esse recurso.

Para realizar esta tarefa:

  1. Inicialize o ExchangeWebServiceClient para o usuário 1.
  2. Inicialize o ExchangeWebServiceClient para o usuário 2.
  3. Anexe mensagens de teste às contas.
  4. Habilite a Impersonação.
  5. Redefina a Impersonação.

O seguinte trecho de código mostra como usar a classe EWSClient para implementar o recurso de Impersonação.

// 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 { }
}
}

Recurso de Descoberta Automática usando EWS

A API Aspose.Email permite descobrir as configurações do Exchange Server usando o Cliente 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);

Abortar Restauração de PST para a Operação do Exchange Server

A API Aspose.Email permite restaurar um arquivo PST para o Exchange Server. No entanto, se a operação estiver demorando muito devido ao tamanho grande do arquivo PST, pode ser necessário especificar critérios para abortar a operação. Isso pode ser alcançado usando a API conforme mostrado no seguinte exemplo de código.

Nota: O exemplo precisa que a seguinte classe seja adicionada também.

 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}");
}