Carregando e Salvando Mensagens

Carregando e Salvando Mensagens de Email

Detectar um Formato de Arquivo

A API Aspose.Email fornece a capacidade de detectar o formato do arquivo da mensagem fornecida. O método DetectFileFormat da classe FileFormatUtil pode ser usado para alcançar isso. As seguintes classes e métodos podem ser usados para detectar o formato de arquivo carregado.

O seguinte trecho de código mostra como detectar formatos de arquivos.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the resource directory.
String dataDir = Utils.getSharedDataDir(DetectingFileFormat.class) + "email/";
//Detect file format
FileFormatInfo info = FileFormatUtil.detectFileFormat(dataDir + "Message.msg");
//Gets the detected load format
System.out.println("The message format is: " + info.getFileFormatType());

Carregar uma Mensagem de Email

Para carregar uma mensagem com opções de carregamento específicas, a Aspose.Email fornece a classe LoadOptions que pode ser usada da seguinte forma:

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Loading with default options
// Load from eml
MailMessage eml = MailMessage.load("test.eml", new EmlLoadOptions());
// Load from html
MailMessage html = MailMessage.load("test.html", new HtmlLoadOptions());
// load from mhtml
MailMessage mhtml = MailMessage.load("test.mhtml", new MhtmlLoadOptions());
// load from msg
MailMessage msg = MailMessage.load("test.msg", new MsgLoadOptions());
// load from thef fomat
MailMessage thef = MailMessage.load("winmail.dat", new TnefLoadOptions());
// Loading with custom options
EmlLoadOptions opt = new EmlLoadOptions();
opt.setPreserveTnefAttachments(true);
MailMessage emlMailMessage = MailMessage.load("test.html", opt);
HtmlLoadOptions htmlOpt = new HtmlLoadOptions();
htmlOpt.shouldAddPlainTextView(true);
MailMessage htmlMailMessage = MailMessage.load("test.html", htmlOpt);

Preservar o Formato da Mensagem Embutida Durante o Carregamento

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
String dataDir = Utils.getSharedDataDir(DisplayEmailInformation.class) + "email/";
EmlLoadOptions options = new EmlLoadOptions();
options.setPreserveEmbeddedMessageFormat(true);
MailMessage mail = MailMessage.load(dataDir + "tnefWithMsgInside.eml", options);
int fileFormat = FileFormatUtil.detectFileFormat(mail.getAttachments().get_Item(0).getContentStream()).getFileFormatType();
System.out.println("Embedded message file format: " + fileFormat);

Salvar e Converter Mensagens de Email

A Aspose.Email facilita a conversão de qualquer tipo de mensagem para outro formato. Para demonstrar esse recurso, o código deste artigo carrega três tipos de mensagens do disco e as salva novamente em outros formatos. A classe base SaveOptions e as classes EmlSaveOptions, MsgSaveOptions, MhtSaveOptions, HtmlSaveOptions para configurações adicionais ao salvar MailMessage podem ser usadas para salvar mensagens em outros formatos. O artigo mostra como usar essas classes para salvar um email de exemplo como:

  • Formato EML.
  • Outlook MSG.
  • Formato MHTML.
  • Formato HTML.

Carregar e Salvar uma Mensagem de Email

O seguinte trecho de código mostra como carregar uma mensagem EML e salvá-la no disco no mesmo formato.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage msg = MailMessage.load(dataDir + "test.eml", new EmlLoadOptions());
// Save the Email message to disk by using the SaveOptions
msg.save(dataDir + "LoadAndSaveFileAsEML_out.eml", SaveOptions.getDefaultEml());

Carregar e Salvar uma Mensagem de Email Preservando as Fronteiras Originais

O seguinte trecho de código mostra como carregar EML e salvar como EML preservando as fronteiras originais.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage eml = MailMessage.load(dataDir + "test.eml");
// Save as eml with preserved original boundares
EmlSaveOptions emlSaveOptions = new EmlSaveOptions(MailMessageSaveType.getEmlFormat());
emlSaveOptions.setPreserveOriginalBoundaries(true);
eml.save(dataDir + "PreserveOriginalBoundaries_out.eml", emlSaveOptions);

Salvar como EML Preservando Anexos TNEF

O seguinte trecho de código mostra como salvar como EML preservando anexos TNEF.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage eml = MailMessage.load(dataDir + "PreserveOriginalBoundaries.eml");
// Save as eml with preserved thef attachment
EmlSaveOptions emlSaveOptions = new EmlSaveOptions(MailMessageSaveType.getEmlFormat());
emlSaveOptions.setFileCompatibilityMode(FileCompatibilityMode.PreserveTnefAttachments);
eml.save(dataDir + "PreserveTNEFAttachment_out.eml", emlSaveOptions);

Salvar EML como MSG

O seguinte trecho de código mostra como carregar uma mensagem EML e convertê-la para MSG usando a opção apropriada da SaveOptions.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Initialize and Load an existing EML file by specifying the MessageFormat
MailMessage eml = MailMessage.load(dataDir + "test.eml");
//Save the Email message to disk in Unicode format
eml.save(dataDir + "LoadingEMLSavingToMSG_out.msg", SaveOptions.getDefaultMsgUnicode());

Salvar EML como MSG com Datas Preservadas

A classe MsgSaveOptions permite salvar a mensagem fonte como um arquivo de Mensagem do Outlook (MSG) preservando datas. O seguinte trecho de código mostra como salvar como MSG com datas preservadas.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage eml = MailMessage.load(dataDir + "test.eml");
// Save as msg with preserved dates
MsgSaveOptions msgSaveOptions = new MsgSaveOptions(MailMessageSaveType.getOutlookMessageFormatUnicode());
msgSaveOptions.setPreserveOriginalDates(true);
eml.save(dataDir + "SavingAsMSGWithPreservedDates_out.msg", msgSaveOptions);

Salvar EML como MHTML

Diferentes opções de MHTML podem ser usadas para obter os resultados desejados. O seguinte trecho de código mostra como carregar uma mensagem EML em MailMessage e convertê-la para MHTML com uma data da mensagem no sistema UTC.

// Definir opções para saída MHTML
MhtSaveOptions saveOptions = SaveOptions.getDefaultMhtml();
// salvar a data de uma mensagem como data UTC
saveOptions.setPreserveOriginalDate(false);

// Inicializar e carregar um arquivo EML existente
try (MailMessage mailMessage = MailMessage.load(dataDir + "Message.eml")) {
    mailMessage.save(outDir + "Message_out.mhtml", saveOptions);
}

Formatar Cabeçalhos MHT Globalmente ao Salvar de EML

Com Aspose.Email, você pode usar as opções de formatação global para o cabeçalho Mht. As opções globais definem a formatação comum de um cabeçalho Mht para todas as instâncias de MhtSaveOptions. Este recurso é projetado para evitar a configuração de formatação para cada instância de MhtSaveOptions.

Use os seguintes métodos da classe GlobalFormattingOptions e o exemplo de código abaixo para definir a formatação de um cabeçalho Mht:

// saveOptions1 e saveOptions2 têm a mesma formatação de cabeçalho mht
MhtSaveOptions saveOptions1 = new MhtSaveOptions();
MhtSaveOptions saveOptions2 = new MhtSaveOptions();

Converter EML para MHTML com Configurações Opcionais

A classe MhtSaveOptions fornece opções adicionais para salvar mensagens de email em formato MHTML. O enumerador MhtFormatOptions possibilita escrever informações adicionais de email no MHTML de saída. Os seguintes campos adicionais podem ser escritos:

  • WriteHeader - escreve o cabeçalho do email no arquivo de saída.
  • WriteOutlineAttachments - escreve anexos de esboço no arquivo de saída.
  • WriteCompleteEmailAddress - escreve o endereço de email completo no arquivo de saída.
  • NoEncodeCharacters - nenhuma codificação de transferência de caracteres deve ser usada.
  • HideExtraPrintHeader - oculta o cabeçalho de impressão extra do topo do arquivo de saída.
  • WriteCompleteToEmailAddress - escreve o endereço de email completo do destinatário no arquivo de saída.
  • WriteCompleteFromEmailAddress - escreve o endereço de email completo do remetente no arquivo de saída.
  • WriteCompleteCcEmailAddress - escreve os endereços de email completos de qualquer destinatário em cópia no arquivo de saída.
  • WriteCompleteBccEmailAddress - escreve o endereço de email completo de qualquer destinatário em cópia oculta no arquivo de saída.
  • RenderCalendarEvent - escreve texto do evento de calendário no arquivo de saída.
  • SkipByteOrderMarkInBody - escreve os bytes do Byte Order Mark(BOM) no arquivo de saída.
  • RenderVCardInfo - escreve texto do VCard AlternativeView no arquivo de saída.
  • DisplayAsOutlook - exibe o cabeçalho From.
  • RenderTaskFields - escreve campos de Tarefa específicos no arquivo de saída.
  • None - Nenhuma configuração especificada.

O seguinte trecho de código mostra como converter arquivos EML para MHTML com configurações opcionais.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage eml = MailMessage.load(dataDir + "test.eml");
// Save as Mht with header
MhtSaveOptions mhtSaveOptions = new MhtSaveOptions();
int iSaveOptions = MhtFormatOptions.WriteHeader | MhtFormatOptions.HideExtraPrintHeader;
mhtSaveOptions.setMhtFormatOptions(iSaveOptions);
eml.save(dataDir + "ConvertingToMHTMLWithOptionalSettings_out.mht", mhtSaveOptions);

Renderizar Eventos de Calendário ao Converter para MHTML

O MhtFormatOptions.RenderCalendarEvent renderiza os eventos do Calendário no MTHML de saída. O seguinte trecho de código mostra como renderizar eventos de calendário ao converter para MHTML.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
String dataDir = Utils.getSharedDataDir(RenderingCalendarEvents.class) + "email/";
MailMessage msg = MailMessage.load(dataDir + "Meeting with Recurring Occurrences.msg");
MhtSaveOptions options = new MhtSaveOptions();
{
options.setMhtFormatOptions(MhtFormatOptions.WriteHeader | MhtFormatOptions.RenderCalendarEvent);
//Format the output details if required - optional
//Set the display for Start Property
if (options.getFormatTemplates().containsKey(MhtTemplateName.START))
options.getFormatTemplates().set_Item(MhtTemplateName.START,"<span class='headerLineTitle'>Start:</span><span class='headerLineText'>{0}</span><br/>");
else
options.getFormatTemplates().add(MhtTemplateName.START, "<span class='headerLineTitle'>Start:</span><span class='headerLineText'>{0}</span><br/>");
//Set the display for End Property
if (options.getFormatTemplates().containsKey(MhtTemplateName.END))
options.getFormatTemplates().set_Item(MhtTemplateName.END, "<span class='headerLineTitle'>End:</span><span class='headerLineText'>{0}</span><br/>");
else
options.getFormatTemplates().add(MhtTemplateName.END, "<span class='headerLineTitle'>End:</span><span class='headerLineText'>{0}</span><br/>");
//Set the display for Recurrence Property
if (options.getFormatTemplates().containsKey(MhtTemplateName.RECURRENCE))
options.getFormatTemplates().set_Item(MhtTemplateName.RECURRENCE,"<span class='headerLineTitle'>Recurrence:</span><span class='headerLineText'>{0}</span><br/>");
else
options.getFormatTemplates().add(MhtTemplateName.RECURRENCE, "<span class='headerLineTitle'>Recurrence:</span><span class='headerLineText'>{0}</span><br/>");
//Set the display for RecurrencePattern Property
if (options.getFormatTemplates().containsKey(MhtTemplateName.RECURRENCE_PATTERN))
options.getFormatTemplates().set_Item(MhtTemplateName.RECURRENCE_PATTERN, "<span class='headerLineTitle'>RecurrencePattern:</span><span class='headerLineText'>{0}</span><br/>");
else
options.getFormatTemplates().add(MhtTemplateName.RECURRENCE_PATTERN, "<span class='headerLineTitle'>RecurrencePattern:</span><span class='headerLineText'>{0}</span><br/>");
//Set the display for Organizer Property
if (options.getFormatTemplates().containsKey(MhtTemplateName.ORGANIZER))
options.getFormatTemplates().set_Item(MhtTemplateName.ORGANIZER, "<span class='headerLineTitle'>Organizer:</span><span class='headerLineText'>{0}</span><br/>");
else
options.getFormatTemplates().add(MhtTemplateName.ORGANIZER, "<span class='headerLineTitle'>Organizer:</span><span class='headerLineText'>{0}</span><br/>");
//Set the display for RequiredAttendees Property
if (options.getFormatTemplates().containsKey(MhtTemplateName.REQUIRED_ATTENDEES))
options.getFormatTemplates().set_Item(MhtTemplateName.REQUIRED_ATTENDEES, "<span class='headerLineTitle'>RequiredAttendees:</span><span class='headerLineText'>{0}</span><br/>");
else
options.getFormatTemplates().add(MhtTemplateName.REQUIRED_ATTENDEES, "<span class='headerLineTitle'>RequiredAttendees:</span><span class='headerLineText'>{0}</span><br/>");
};
msg.save(dataDir + "Meeting with Recurring Occurrences_out.mhtml", options);

Exportar Email para MHT sem Imagens Inline

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage eml = MailMessage.load(dataDir + "Message.msg", new MsgLoadOptions());
MhtSaveOptions mhtSaveOptions = new MhtSaveOptions();
mhtSaveOptions.setSkipInlineImages(true);
eml.save(dataDir + "EmlToMhtmlWithoutInlineImages_out.mht", mhtSaveOptions);

Exportar Email para MHT com Fuso Horário Personalizado

A classe MailMessage fornece a propriedade setTimeZoneOffset para definir um fuso horário personalizado ao exportar para MHT. O seguinte trecho de código mostra como exportar email para MHT com um fuso horário personalizado.

MailMessage msg = MailMessage.load(filename, new MsgLoadOptions());
msg.setDate(new Date());

// Definir o deslocamento do fuso horário em milissegundos
msg.setTimeZoneOffset(5*60*60*1000);

MhtSaveOptions mhtOptions = new MhtSaveOptions();
mhtOptions.setMhtFormatOptions(MhtFormatOptions.WriteHeader);
msg.save(dataDir + "ExportToMHTWithCustomTimezone_out.mhtml", mhtOptions);

Exportando Email para EML

O seguinte trecho de código mostra como exportar emails para EML.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
eml.save(dataDir + "testEml_out.eml", SaveOptions.getDefaultEml());

Salvar Email como HTML

A classe HtmlSaveOptions permite exportar o corpo da mensagem para HTML. O seguinte trecho de código mostra como salvar uma mensagem como HTML.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage msg = MailMessage.load(dataDir + "Message.msg");
msg.save(dataDir + "SavingMessageAsHTML_out1.html", SaveOptions.getDefaultHtml());
//or
MailMessage eml = MailMessage.load(dataDir + "test.eml");
HtmlSaveOptions options = SaveOptions.getDefaultHtml();
options.setEmbedResources(false);
options.setHtmlFormatOptions(HtmlFormatOptions.WriteHeader | HtmlFormatOptions.WriteCompleteEmailAddress);
eml.save(dataDir + "SavingMessageAsHTML_out2.html", options);

Salvar Mensagem de Email como HTML com Caminho Relativo para Recursos

Ao exportar mensagens de email para o formato HTML, é possível escolher salvar recursos de email com caminhos relativos. Este recurso proporciona mais flexibilidade em como os recursos são vinculados no arquivo HTML de saída, tornando mais fácil compartilhar e exibir emails salvos em diferentes sistemas. A propriedade HtmlSaveOptions.UseRelativePathToResources fornece a capacidade de salvar recursos com caminhos relativos. O valor padrão da propriedade é falso (os recursos são salvos com caminhos absolutos). Quando definido como verdadeiro, os recursos são salvos com caminhos relativos. Arquivos HTML com caminhos relativos são mais portáteis e podem ser visualizados corretamente, independentemente da estrutura de arquivos do ambiente de hospedagem. Você pode escolher entre caminhos absolutos e relativos, dependendo dos requisitos. Você pode definir caminhos personalizados para recursos usando o evento ResourceHtmlRenderingHandler.

Salvar com Caminho Relativo Padrão para Recursos

MapiMessage msg = MapiMessage.load(sourceFileName);

HtmlSaveOptions htmlSaveOptions = new HtmlSaveOptions();
htmlSaveOptions.setResourceRenderingMode(ResourceRenderingMode.SaveToFile);
htmlSaveOptions.setUseRelativePathToResources(true);

msg.save("target.html", htmlSaveOptions);

Neste caso, os recursos serão salvos na pasta [nome do arquivo html].files, no mesmo caminho que o arquivo .html e o HTML fará referência aos recursos via caminhos relativos.

Salvar com Caminho Absoluto para Recursos

MapiMessage msg = MapiMessage.load(sourceFileName);

HtmlSaveOptions htmlSaveOptions = new HtmlSaveOptions();
htmlSaveOptions.setResourceRenderingMode(ResourceRenderingMode.SaveToFile);
htmlSaveOptions.setUseRelativePathToResources(false);

msg.save("target.html", htmlSaveOptions);

Como no primeiro caso, os recursos serão salvos na pasta [nome do arquivo html].files por padrão, mas o HTML fará referência aos recursos usando caminhos absolutos.

Caminho Relativo Personalizado usando o Evento ResourceHtmlRenderingHandler

MapiMessage msg = MapiMessage.load(sourceFileName);

HtmlSaveOptions htmlSaveOptions = new HtmlSaveOptions();
htmlSaveOptions.setResourceRenderingMode(ResourceRenderingMode.SaveToFile);
htmlSaveOptions.setUseRelativePathToResources(false);

htmlSaveOptions.setResourceHtmlRenderingHandler(new ResourceHtmlRenderingHandler() {
    @Override
    public void invoke(Object sender, ResourceHtmlRenderingEventArgs args) {
        if (sender instanceof AttachmentBase) {
            AttachmentBase attachment = (AttachmentBase) sender;
            // Como UseRelativePathToResources = true, você deve atribuir um caminho relativo à propriedade PathToResourceFile.
            args.setPathToResourceFile("images\\" + attachment.getContentType().getName());
        }
    }
});

msg.save(targetPath + "A Day in the Park.html", htmlSaveOptions);

Ao usar o evento ResourceHtmlRenderingHandler você pode definir caminhos relativos ou absolutos personalizados para recursos. Ao personalizar caminhos com o evento ResourceHtmlRenderingHandler e, uma vez que UseRelativePathToResources está definido como verdadeiro, você deve atribuir um caminho relativo à propriedade PathToResourceFile para garantir a referência correta.

Preservar Ícones Personalizados em uma Mensagem ao Converter para HTML

Às vezes, a mensagem contém anexos em linha, que são exibidos como imagens de ícones no corpo da mensagem. Esse tipo de mensagem pode criar problemas ao convertê-las para HTML, uma vez que os ícones das imagens são perdidos. Isso ocorre porque os ícones dos anexos não estão mantidos diretamente na mensagem.

O usuário da Aspose.Email pode personalizar os ícones para anexos ao converter a mensagem para HTML. Para isso, o evento HtmlSaveOptions.ResourceHtmlRendering é utilizado para personalizar a renderização de arquivos de recurso (como anexos) ao salvar uma mensagem de email como um arquivo HTML. No exemplo de código abaixo, o manipulador de eventos é usado para definir dinamicamente o caminho para os arquivos de recurso (ícones) com base no tipo de conteúdo do anexo. Isso permite a renderização personalizada de recursos na saída HTML com base em seu tipo de arquivo.


 HtmlSaveOptions options = new HtmlSaveOptions();

options.setResourceHtmlRenderingHandler(new ResourceHtmlRenderingHandler() {

   @Override

   public void invoke(Object sender, ResourceHtmlRenderingEventArgs e) {

        AttachmentBase attachment = (AttachmentBase) sender;

        e.setCaption(attachment.getContentType().getName());

       if (attachment.getContentType().getName().endsWith(".pdf")) {

            e.setPathToResourceFile("pdf_icon.png");

       } else if (attachment.getContentType().getName().endsWith(".docx")) {

            e.setPathToResourceFile("word_icon.jpg");

       } else if (attachment.getContentType().getName().endsWith(".jpg")) {

            e.setPathToResourceFile("jpeg_icon.png");

       } else {

            e.setPathToResourceFile("not_found_icon.png");

       }

   }

});

options.setResourceRenderingMode(ResourceRenderingMode.SubstituteFromFile);

String fileName = "message.msg";

MailMessage mailMessage = MailMessage.load(fileName);

mailMessage.save("fileName.html", options);

Definir Hora e Fuso Horário ao Salvar EML como HTML

Os usuários da Aspose.Email podem definir os formatos de exibição de hora e fuso horário em HtmlSaveOptions. A classe HeadersFormattingOptions permite especificar opções de formatação de cabeçalhos ao salvar MailMessage em formato Mhtml ou Html. Os seguintes métodos da classe HtmlFormatOptions especificam os campos a serem exibidos no arquivo de saída:

  • RenderCalendarEvent - Indica que o texto do evento de calendário deve ser escrito no mhtml de saída.
  • RenderVCardInfo - Indica que o texto do VCard AlternativeView deve ser escrito no html de saída.

O seguinte exemplo de código mostra como definir a hora e o fuso horário ao salvar EML como HTML:

MailMessage msg = MailMessage.load("fileName");
HtmlSaveOptions options = new HtmlSaveOptions();
options.setHtmlFormatOptions(HtmlFormatOptions.WriteHeader);
options.getFormatTemplates().set_Item("DateTime", "MM d yyyy HH:mm tt");

Salvar como HTML sem Embutir Recursos

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
String fileName = dataDir + "EmailWithAttandEmbedded.eml";
MailMessage eml = MailMessage.load(fileName);
//final String outDir = "out path";
String outFileName = "EmailWithAttandEmbedded_out.html";
HtmlSaveOptions options = new HtmlSaveOptions();
options.setEmbedResources(false);
options.setSaveResourceHandler(new SaveResourceHandler() {
@Override
public void invoke(AttachmentBase attachment, String[] resourcePath) {
String dataDir = Utils.getSharedDataDir(ConvertEmailMessages.class) + "email/";
attachment.save(dataDir + attachment.getContentId());
resourcePath[0] = dataDir + attachment.getContentId();
}
});
eml.save(dataDir + outFileName, options);

Salvar uma Mensagem como um arquivo de Modelo do Outlook (.oft)

O seguinte trecho de código mostra como salvar uma mensagem como um arquivo de modelo do outlook (.oft).

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage eml = new MailMessage("test@from.to", "test@to.to", "template subject", "Template body");
String oftEmlFileName = "EmlAsOft_out.oft";
MsgSaveOptions options = SaveOptions.getDefaultMsgUnicode();
options.setSaveAsTemplate(true);
eml.save(dataDir + oftEmlFileName, options);