Gerenciando mensagens do Outlook

Salvar Emails como HTML

O Aspose.Email permite salvar recursos de email com caminhos relativos ao exportar mensagens para o formato HTML. Esse recurso oferece mais flexibilidade na forma como os recursos são vinculados no arquivo HTML de saída, facilitando o compartilhamento e a exibição de emails salvos em diferentes sistemas. Para salvar recursos com caminhos relativos, use HtmlSaveOptions.UseRelativePathToResources propriedade. O valor padrão da propriedade é false (os recursos são salvos com caminhos absolutos). Quando definido como true, os recursos são salvos com caminhos relativos.

Arquivos HTML com caminhos relativos são mais portáveis e podem ser visualizados corretamente independentemente da estrutura de arquivos do ambiente de hospedagem. Você pode escolher entre caminhos absolutos e relativos conforme os requisitos. É possível definir caminhos personalizados para recursos usando o ResourceHtmlRendering evento.

O exemplo de código a seguir demonstra como salvar um email com caminho relativo padrão para recursos:

var msg = MapiMessage.Load(sourceFileName);

var htmlSaveOptions = new HtmlSaveOptions
{
    ResourceRenderingMode = ResourceRenderingMode.SaveToFile,
    UseRelativePathToResources = true
};

msg.Save(Path.Combine("target_files"), htmlSaveOptions);

Neste caso, os recursos serão salvos na pasta [nome do arquivo html]_files, no mesmo caminho do arquivo .html, e o HTML referenciará os recursos via caminhos relativos.

O exemplo de código abaixo demonstra como salvar com caminho absoluto para recursos:

var msg = MapiMessage.Load(sourceFileName);

var htmlSaveOptions = new HtmlSaveOptions
{
    ResourceRenderingMode = ResourceRenderingMode.SaveToFile,
    UseRelativePathToResources = false
};

msg.Save(Path.Combine("target_files"), htmlSaveOptions);

Como no primeiro caso, os recursos serão salvos na pasta [nome do arquivo html]_files por padrão, mas o HTML referenciará os recursos usando caminhos absolutos.

Usando o ResourceHtmlRendering evento, você pode definir caminhos relativos ou absolutos personalizados para os recursos. Ao personalizar caminhos com o ResourceHtmlRendering manipulador de evento, e como UseRelativePathToResources está definido como true, você deve atribuir um caminho relativo ao PathToResourceFile propriedade para garantir referências corretas.

O exemplo de código a seguir demonstra como personalizar o caminho relativo usando o evento ResourceHtmlRendering

var msg = MapiMessage.Load(sourceFileName);

var htmlSaveOptions = new HtmlSaveOptions
{
    ResourceRenderingMode = ResourceRenderingMode.SaveToFile,
    UseRelativePathToResources = true
};

htmlSaveOptions.ResourceHtmlRendering += (o, args) =>
{
    if (o is AttachmentBase attachment)
    {
	    // Since UseRelativePathToResources = true, you should assign a relative path to the PathToResourceFile property.
        args.PathToResourceFile = $@"images\{attachment.ContentType.Name}";
    }
};

msg.Save(Path.Combine(targetPath, "A Day in the Park.html"), htmlSaveOptions);

Converter MSG para Mensagens MIME

A API Aspose.Email oferece a capacidade de converter arquivos MSG em mensagens MIME usando o ToMailMessage método.

MapiMessage msg = new MapiMessage("sender@test.com","recipient1@test.com; recipient2@test.com","Test Subject","This is a body of message.");
var options = new MailConversionOptions();
options.ConvertAsTnef = true;
MailMessage mail = msg.ToMailMessage(options);

Definir Tempos Limite para Conversão e Carregamento de Mensagens

Os recursos a seguir permitirão definir o tempo limite em milissegundos para o processo de conversão e carregamento:

O exemplo de código abaixo mostrará como definir o tempo limite ao converter uma mensagem:

var options = new MailConversionOptions();
// Set the timeout to 5 seconds
options.Timeout = 5000;

options.TimeoutReached += (object sender, EventArgs args) =>
{
    string subj = (sender as MailMessage).Subject;
	 // Set a flag indicating the timeout was reached
    isTimedOut = true;
};

var mailMessage = mapiMessage.ToMailMessage(options);

Conversão de MSG para EML Preservando o Corpo RTF

A conversão de um arquivo MSG para EML preservando o corpo RTF pode ser feita de duas maneiras:

Ambas as propriedades obtêm ou definem um valor que indica se o corpo rtf deve ser mantido no MailMessage.

Os trechos de código a seguir mostram como converter um arquivo MSG para EML e preservar o corpo RTF:

var loadOptions = new MsgLoadOptions
{
    PreserveRtfContent = true
};

var eml = MailMessage.Load("my.msg", loadOptions);
var conversionOptions = new MailConversionOptions
{
    PreserveRtfContent = true
};

var msg = MapiMessage.Load("my.msg");

var eml = msg.ToMailMessage(conversionOptions);

Manipulação de Arquivos de Modelo do Outlook (.OFT)

Os modelos do Outlook são muito úteis quando você deseja enviar uma mensagem de email semelhante repetidamente. Em vez de preparar a mensagem do zero a cada vez, primeiro prepare a mensagem no Outlook e salve‑a como um Modelo do Outlook (OFT). Depois, sempre que precisar enviar a mensagem, você pode criá‑la a partir do modelo, economizando tempo ao escrever o mesmo texto no corpo ou no assunto, definir formatação etc. O Aspose.Email MailMessage classe pode ser usada para carregar e ler um arquivo de modelo Outlook (OFT). Uma vez que o modelo Outlook é carregado em uma instância da MailMessage classe, você pode atualizar o remetente, destinatário, corpo, assunto e outras propriedades. Após atualizar as propriedades:

  • Enviar o e‑mail usando o SmtpClient classe ou
  • Salvar a mensagem como MSG e fazer atualizações/validações adicionais usando o Microsoft Outlook.

Nos exemplos de código abaixo, nós:

  1. Carregue o modelo usando o MailMessage classe.
  2. Atualizar algumas das propriedades.
  3. Salvar a mensagem no formato MSG.

O trecho de código a seguir mostra como carregar o arquivo OFT, atualizar a mensagem e salvá‑la no formato MSG.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

// Load the Outlook template (OFT) file in MailMessage's instance
MailMessage message = MailMessage.Load(dataDir + "sample.oft", new MsgLoadOptions());

// Set the sender and recipients information
string senderDisplayName = "John";
string senderEmailAddress = "john@abc.com";
string recipientDisplayName = "William";
string recipientEmailAddress = "william@xzy.com";

message.Sender = new MailAddress(senderEmailAddress, senderDisplayName);
message.To.Add(new MailAddress(recipientEmailAddress, recipientDisplayName));
message.HtmlBody = message.HtmlBody.Replace("DisplayName", "<b>" + recipientDisplayName + "</b>");

// Set the name, location and time in email body
string meetingLocation = "<u>" + "Hall 1, Convention Center, New York, USA" + "</u>";
string meetingTime = "<u>" + "Monday, June 28, 2010" + "</u>";
message.HtmlBody = message.HtmlBody.Replace("MeetingPlace", meetingLocation);
message.HtmlBody = message.HtmlBody.Replace("MeetingTime", meetingTime);

// Save the message in MSG format and open in Office Outlook
MapiMessage msg = MapiMessage.FromMailMessage(message);
msg.SetMessageFlags(MapiMessageFlags.MSGFLAG_UNSENT);
msg.Save(dataDir + "ReadAndWritingOutlookTemplateFile_out.msg");

Salvar Arquivos MSG como Modelos

O snippet de código a seguir mostra como salvar o arquivo Outlook MSG como um modelo.

using (MapiMessage mapi = new MapiMessage("test@from.to", "test@to.to", "template subject", "Template body"))
{
    string oftMapiFileName = "mapiToOft.oft";
    mapi.SaveAsTemplate(oftMapiFileName);
}            

Determinar Tipo de Mensagem MAPI (OFT ou MSG)

Ao carregar um objeto MapiMessage a partir de um arquivo, pode ser necessário determinar se a mensagem carregada é um arquivo de modelo ou um e‑mail normal. Usando o IsTemplate propriedade do MapiMessage classe, você pode detectar com precisão se um e‑mail é um modelo ou não. Essa funcionalidade pode ser valiosa ao lidar e processar vários tipos de arquivos de e‑mail dentro de aplicações e sistemas.

O exemplo de código abaixo demonstra como determinar se um MapiMessage é OFT ou MSG:

var msg = MapiMessage.Load("message.msg");
var isOft = msg.IsTemplate; // returns false

var oft = MapiMessage.Load("message.oft");
var isOftTemplate = oft.IsTemplate; // returns true

Salvar MapiMessage ou MailMessage no formato OFT

O SaveOptions classe permite especificar opções adicionais ao salvar um MailMessage ou MapiMessage em um formato específico.

O exemplo de código a seguir demonstra como salvar uma mensagem no formato OFT:

// Save the MailMessage to OFT format
using (var eml = MailMessage.Load("message.eml"))
{
    eml.Save("message.oft", SaveOptions.DefaultOft);
	
	// or alternative way #2
	var saveOptions = new MsgSaveOptions(MailMessageSaveType.OutlookTemplateFormat);
    eml.Save("message.oft", saveOptions);
	
	// or alternative  way #3
	saveOptions = SaveOptions.CreateSaveOptions(MailMessageSaveType.OutlookTemplateFormat);
    eml.Save("message.oft", saveOptions);

}

// Save the MapiMessage to OFT format
using (var msg = MapiMessage.Load("message.msg"))
{
    msg.Save("message.oft", SaveOptions.DefaultOft);
	
	// or alternative way #2
	var saveOptions = new MsgSaveOptions(MailMessageSaveType.OutlookTemplateFormat);
    msg.Save("message.oft", saveOptions);
	
	// or alternative  way #3
	saveOptions = SaveOptions.CreateSaveOptions(MailMessageSaveType.OutlookTemplateFormat);
    msg.Save("message.oft", saveOptions);
}

Gerenciando Mensagens Assinadas Digitalmente

O Aspose.Email implementa o algoritmo completo de objeto de email S/MIME. Isso confere à API total capacidade de preservar assinaturas digitais ao converter mensagens entre formatos.

Preservar Assinatura durante a Conversão de EML para MSG

Aspose.Email preserva a assinatura digital ao converter de EML para MSG. O snippet de código a seguir mostra como converter de EML para MSG.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

// Load mail message
MailMessage message = MailMessage.Load(dataDir + "Message.eml", new EmlLoadOptions());
// Save as MSG
message.Save(dataDir + "ConvertEMLToMSG_out.msg", SaveOptions.DefaultMsgUnicode);

Converter mensagens S/MIME de MSG para EML

Aspose.Email preserva a assinatura digital ao converter de MSG para EML, conforme mostrado no snippet de código a seguir.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

// Load the MSG file
MailMessage msg = MailMessage.Load(dataDir + "message.msg", new MsgLoadOptions());

// Save as EML
msg.Save(dataDir + "ConvertMIMEMessagesFromMSGToEML_out.eml", SaveOptions.DefaultEml);

Verificar Assinaturas de E‑mails Seguros

Os recursos a seguir estão disponíveis para verificar a assinatura de objetos MapiMessage.

O exemplo de código abaixo mostra como implementar os recursos no seu projeto:

Verifique a assinatura de uma mensagem sem fornecer um certificado:

var msg = MapiMessage.Load(fileName);
var result = new SecureEmailManager().CheckSignature(msg);

Verifique a assinatura de uma mensagem criptografada fornecendo o certificado para descriptografia e o repositório que contém os certificados usados para a verificação:

var certFileName = "cert.pfx";
var cert = new X509Certificate2(certFileName, "pass");
var msg = MapiMessage.Load(fileName);

var store = new X509Store();
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();

var result = new SecureEmailManager().CheckSignature(msg, cert, store);

Remover Assinaturas de MapiMessages

Para melhor compatibilidade, o MapiMessage.RemoveSignature método e MapiMessage.IsSigned propriedades são usadas para remover uma assinatura digital de uma mensagem.

O trecho de código a seguir mostra como implementar esses recursos em seu projeto:

var msg = MapiMessage.Load(fileName);

if (msg.IsSigned)
{
    var unsignedMsg = msg.RemoveSignature();
}

Descriptografar MapiMessages com Certificados

Se você tem mensagens MAPI criptografadas e precisa descriptografá‑las usando a chave privada armazenada em um certificado, os recursos a seguir da Aspose.Email podem ser úteis:

O snippet de código a seguir mostra como trabalhar com mensagens MAPI criptografadas:

var privateCert = new X509Certificate2(privateCertFile, "password");
var msg = MapiMessage.Load("encrypted.msg");

if (msg.IsEncrypted)
{
    var decryptedMsg = msg.Decrypt(privateCert);
}

Definir Categorias de Cor para Arquivos MSG

Uma categoria de cor marca uma mensagem de e‑mail para algum tipo de importância ou classificação. O Microsoft Outlook permite que os usuários atribuam categorias de cor para diferenciar e‑mails. Para manipular a categoria de cor, use o FollowUpManager. Contém funções como AddCategory, RemoveCategory, ClearCategories e GetCategories.

  • AddCategory recebe MapiMessage e a string da categoria de cor, por exemplo, "Categoria Roxa" ou "Categoria Vermelha" como argumentos.
  • RemoveCategory recebe MapiMessage e a string da categoria de cor a ser removida da mensagem.
  • ClearCategories é usado para remover todas as categorias de cor da mensagem.
  • GetCategories é usado para recuperar todas as categorias de cor de uma mensagem específica.

O exemplo a seguir executa as tarefas descritas abaixo:

  1. Adicionar uma categoria de cor.
  2. Adicionar outra categoria de cor.
  3. Recuperar a lista de todas as categorias.
  4. Remover todas as categorias.
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

MapiMessage msg = MapiMessage.FromFile(dataDir + "message1.msg");

// Add Two category
FollowUpManager.AddCategory(msg, "Purple Category");
FollowUpManager.AddCategory(msg, "Red Category");

// Retrieve the list of available categories
IList<string> categories = FollowUpManager.GetCategories(msg);

// Remove the specified category and then Clear all categories
FollowUpManager.RemoveCategory(msg, "Red Category");
FollowUpManager.ClearCategories(msg);

Acessar Informações de Acompanhamento em Arquivos MSG

A API Aspose.Email oferece a capacidade de acessar as informações de acompanhamento de uma mensagem enviada ou recebida. Ela pode recuperar as informações de Recibo de Leitura, Recibo de Entrega e resultados de votação de um arquivo de mensagem.

Recuperar Informações de Recebimento e Confirmação de Leitura

O snippet de código a seguir mostra como recuperar informações de recibo de leitura e de entrega.

MapiMessage msg = MapiMessage.FromFile(dataDir + @"TestMessage.msg");
foreach (MapiRecipient recipient in msg.Recipients)
{
    Console.WriteLine(string.Format("Recipient: {0}", recipient.DisplayName));

    // Get the PR_RECIPIENT_TRACKSTATUS_TIME_DELIVERY property
    Console.WriteLine(string.Format("Delivery time: {0}", recipient.Properties[MapiPropertyTag.PR_RECIPIENT_TRACKSTATUS_TIME_DELIVERY].GetDateTime()));

    // Get the PR_RECIPIENT_TRACKSTATUS_TIME_READ property
    Console.WriteLine(string.Format("Read time: {0}", recipient.Properties[MapiPropertyTag.PR_RECIPIENT_TRACKSTATUS_TIME_READ].GetDateTime()));

    Console.WriteLine();
}

Criar Mensagens Encaminhadas e de Resposta

A API Aspose.Email fornece a capacidade de criar e formatar mensagens encaminhadas e de resposta. O ReplyMessageBuilder e ForwardMessageBuilder as classes da API são usadas para criar as mensagens Reply e Forward, respectivamente. Uma mensagem Reply ou Forward pode ser especificada para ser criada usando qualquer um dos modos de OriginalMessageAdditionMode enum. Este enum tem os seguintes valores:

  • OriginalMessageAdditionMode.None - A mensagem original não é incluída na mensagem de resposta.
  • OriginalMessageAdditionMode.Attachment - A mensagem original é incluída como anexo na mensagem de resposta
  • OriginalMessageAdditionMode.Textpart - A mensagem original é incluída como texto no corpo da mensagem de resposta

Criar Mensagens de Resposta

O trecho de código a seguir mostra como criar uma mensagem de resposta.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

MapiMessage originalMsg = MapiMessage.FromFile(dataDir + "message1.msg");
ReplyMessageBuilder builder = new ReplyMessageBuilder();

// Set ReplyMessageBuilder Properties
builder.ReplyAll = true;
builder.AdditionMode = OriginalMessageAdditionMode.Textpart;
builder.ResponseText = "<p><b>Dear Friend,</b></p> I want to do is introduce my co-author and co-teacher. <p><a href=\"www.google.com\">This is a first link</a></p><p><a href=\"www.google.com\">This is a second link</a></p>";
            
MapiMessage replyMsg = builder.BuildResponse(originalMsg);
replyMsg.Save(dataDir+ "reply_out.msg");

Criar Mensagens Encaminhadas

O trecho de código a seguir mostra como criar uma mensagem encaminhada.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

MapiMessage originalMsg = MapiMessage.FromFile(dataDir +"message1.msg");
ForwardMessageBuilder builder = new ForwardMessageBuilder();
builder.AdditionMode = OriginalMessageAdditionMode.Textpart;
MapiMessage forwardMsg = builder.BuildResponse(originalMsg);
forwardMsg.Save(dataDir + "forward_out.msg");