Criando e Salvando Arquivos do Outlook

Aspose.Email oferece suporte à criação de arquivos Outlook message (MSG). Este artigo explica como:

Criar e salvar mensagens do Outlook

O MailMessage classe tem o Save() método que pode salvar arquivos Outlook MSG em disco ou fluxo. Os trechos de código abaixo criam uma instância da MailMessage classe, defina propriedades como from, to, subject e body. O Save() método aceita o nome do arquivo como argumento. Além disso, as Mensagens Outlook podem ser criadas com um corpo RTF comprimido usando o MapiConversionOptions

  1. Crie uma nova instância da MailMessage classe e define as propriedades From, To, Subject e Body.
  2. Chame o MapiMessage classe FromMailMessage método que aceita o objeto da MailMessage tipo. O FromMailMessage método converte o MailMessage em um MapiMessage (MSG).
  3. Chame o MapiMessage.Save() método para salvar o arquivo MSG.

Escreva o código a seguir no evento de clique do controle de botão da aplicação Windows.

// Create an instance of the MailMessage class
MailMessage mailMsg = new MailMessage();

// Set from, to, subject and body properties
mailMsg.From = "sender@domain.com";
mailMsg.To = "receiver@domain.com";
mailMsg.Subject = "This is test message";
mailMsg.Body = "This is test body";

// Create an instance of the MapiMessage class and pass MailMessage as argument
MapiMessage outlookMsg = MapiMessage.FromMailMessage(mailMsg);
            
// Save the message (MSG) file
string strMsgFile = @"CreatingAndSavingOutlookMessages_out.msg";
outlookMsg.Save(dataDir + strMsgFile);

Criar Arquivos MSG com Anexos

No exemplo acima, criamos um arquivo MSG simples. Aspose.Email também oferece suporte à gravação de arquivos de mensagem com anexos. Tudo o que você precisa fazer é adicionar os anexos ao MailMessage instância. Adicione anexos chamando o método Add() no MailMessage.Attachments coleção. Adicione uma listbox ao formulário criado acima e adicione dois botões, um para adicionar e outro para remover anexos. A aplicação que adiciona anexos funciona assim:

  1. Ao clicar no botão Add Attachment, é exibida uma Open File Dialog para ajudar os usuários a navegar e selecionar o anexo.
  2. Quando um arquivo é selecionado, o caminho completo é adicionado a uma lista.
  3. Quando o arquivo MSG é criado, os caminhos dos anexos são obtidos da lista e adicionados ao MailMessage.Attachments coleção.

Escreva o código a seguir no evento de clique do botão Add Attachment.

// Open a file open dialog to select the attachment
OpenFileDialog fd = new OpenFileDialog();
// If user selected the file and clicked OK, add the file name and path to the list
if (fd.ShowDialog() == DialogResult.OK)
{
    lstAttachments.Items.Add(fd.FileName);
}

Quando o botão Remove Attachment for clicado, remova os itens selecionados do listbox. Escreva o código a seguir no evento de clique do botão Remove Attachment.

// Check if the user has selected any item in the attachments listbox
if (lstAttachments.SelectedItems.Count > 0)
{
    // Remove the selected attachment from the listbox
    lstAttachments.Items.RemoveAt(lstAttachments.SelectedIndex);
}

Adicione o código para adicionar os anexos ao MailMessage instância. O código final para a função Write Msg está escrito abaixo.

// File name for output MSG file
string strMsgFile;

// Open a save file dialog for saving the file and Add filter for msg files
SaveFileDialog fd = new SaveFileDialog();
fd.Filter = "Outlook Message files (*.msg)|*.msg|All files (*.*)|*.*";

// If user pressed OK, save the file name + path
if (fd.ShowDialog() == DialogResult.OK)
{
    strMsgFile = fd.FileName;
}
else
{
    // If user did not selected the file, return
    return;
}

// Create an instance of MailMessage class
MailMessage mailMsg = new MailMessage();
// Set from, to, subject and body properties
mailMsg.From = txtFrom.Text;
mailMsg.To = txtTo.Text;
mailMsg.Subject = txtSubject.Text;
mailMsg.Body = txtBody.Text;

// Add the attachments
foreach (string strFileName in lstAttachments.Items)
{
    mailMsg.Attachments.Add(new Attachment(strFileName));
}

// Create an instance of MapiMessage class and pass MailMessage as argument
MapiMessage outlookMsg = MapiMessage.FromMailMessage(mailMsg);
outlookMsg.Save(strMsgFile);

Criar arquivos MSG com corpo RTF

Você também pode criar arquivos Outlook Message (MSG) com corpos em texto rico (RTF) usando Aspose.Email. O corpo RTF oferece suporte à formatação de texto. Crie um definindo o MailMessage.HtmlBody propriedade. Quando você converte um MailMessage instância em um MapiMessage instância, o corpo HTML é convertido em RTF. Dessa forma, a formatação do corpo do e‑mail é preservada.

O exemplo a seguir cria um arquivo MSG com um corpo RTF. Há um título, formatação em negrito e sublinhado aplicada no corpo HTML. Essa formatação é mantida quando o HTML é convertido em RTF.

// Create an instance of the MailMessage class
MailMessage mailMsg = new MailMessage();
            
// Set from, to, subject and body properties
mailMsg.From = "from@domain.com";
mailMsg.To = "to@domain.com";
mailMsg.Subject = "subject";
mailMsg.HtmlBody = "<h3>rtf example</h3><p>creating an <b><u>outlook message (msg)</u></b> file using Aspose.Email.</p>";
            
MapiMessage outlookMsg = MapiMessage.FromMailMessage(mailMsg);
outlookMsg.Save(dataDir + "CreatingMSGFilesWithRTFBody_out.msg");

Compressão RTF para o Corpo da Mensagem MAPI

NOTE: O processo de compressão pode diminuir o desempenho ao criar mensagens. Ao entender esse fato e configurar a bandeira de compressão com base em requisitos específicos e no compromisso entre o tamanho do arquivo e o desempenho, os desenvolvedores podem gerenciar efetivamente a criação de arquivos MSG e PST ao lidar com mensagens de e‑mail.

A compressão RTF tem como objetivo reduzir o tamanho de uma mensagem, bem como dos arquivos PST (Personal Storage Table) resultantes que o Microsoft Outlook usa para armazenar mensagens de e‑mail e outros dados. Ao usar a compressão RTF ao configurar o corpo da mensagem, os desenvolvedores podem reduzir a quantidade de memória necessária para armazenar mensagens de e‑mail ou otimizar a largura de banda da rede ao transmitir mensagens.

Para esse fim, foram projetados dois métodos sobrecarregados:

  • MapiMessageItemBase.SetBodyContent(string content, BodyContentType contentType, bool compression): Este método permite definir o conteúdo do corpo da mensagem usando a string especificada e indicando o contentType do corpo (por exemplo, texto simples, HTML, etc.). O parâmetro opcional compression é um valor que especifica se o conteúdo deve ser comprimido usando compressão RTF. Se o parâmetro compression for true, o conteúdo será comprimido, resultando em um tamanho de mensagem menor.

  • MapiMessageItemBase.SetBodyRtf(string content, bool compression): Este método define especificamente o conteúdo do corpo da mensagem em formato RTF. O parâmetro content é uma string que representa o conteúdo RTF que será definido como corpo da mensagem. Como no método anterior, o parâmetro compression determina se a compressão RTF deve ser aplicada ao conteúdo. Se compression for true, o conteúdo RTF será comprimido para reduzir o tamanho.

O exemplo de código a seguir mostra como definir o corpo HTML e mantê‑lo comprimido:

var htmlBody = "<html><body><h1>This is the body content</h1></body></html>";

var msg = new MapiMessage("from@domain.com", "to@domain.com", "subject", "body");
// set the html body and keep it compressed
// this will reduce the message size
msg.SetBodyContent(htmlBody, BodyContentType.Html, true);

Há também um MapiConversionOptions.UseBodyCompression propriedade. Quando esta propriedade está habilitada, a compressão do corpo RTF é aplicada durante a conversão de MailMessage para MapiMessage, resultando em um tamanho de arquivo MSG menor. É demonstrado no exemplo de código abaixo:

var message = MailMessage.Load(fileName);
var options = new MapiConversionOptions();
options.UseBodyCompression = true;
var msg = MapiMessage.FromMailMessage(message, options);

Salvar Mensagem em Status de Rascunho

Os e‑mails são salvos como rascunhos quando alguém começou a editá‑los, mas deseja retornar a eles para concluir mais tarde. Aspose.Email oferece suporte à gravação de mensagens de e‑mail em status de rascunho definindo uma bandeira de mensagem. A seguir está o código de exemplo para salvar uma mensagem de e‑mail do Outlook (MSG) como rascunho.

// Change properties of an existing MSG file
string strExistingMsg = @"message.msg";
            
// Load the existing file in MailMessage and Change the properties
MailMessage msg = MailMessage.Load(dataDir + strExistingMsg, new MsgLoadOptions());
msg.Subject += "NEW SUBJECT (updated by Aspose.Email)";
msg.HtmlBody += "NEW BODY (updated by Aspose.Email)";
            
// Create an instance of type MapiMessage from MailMessage, Set message flag to un-sent (draft status) and Save it
MapiMessage mapiMsg = MapiMessage.FromMailMessage(msg);
mapiMsg.SetMessageFlags(MapiMessageFlags.MSGFLAG_UNSENT);
mapiMsg.Save(dataDir + "SavingMessageInDraftStatus_out.msg");