Características de Utilidad - MailMessage

Encriptación y Desencriptación de Mensajes

Aspose.Email proporciona la posibilidad de encriptar y desencriptar mensajes de correo electrónico. Este tema muestra cómo se puede cargar y encriptar un mensaje existente o nuevo utilizando MailMessage. Los métodos encrypt() y decrypt() devuelven el objeto MailMessage para los efectos aplicados y se debe tener en cuenta al encriptar/desencriptar mensajes. Encriptar y desencriptar mensajes implica los siguientes pasos:

  1. Crear un nuevo mensaje o cargar uno existente
  2. Encriptar el mensaje utilizando el archivo de certificado
  3. Enviar el mensaje o guardarlo
  4. Desencriptar el mensaje según sea necesario

El siguiente fragmento de código muestra cómo encriptar y desencriptar mensajes.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
String publicCertFileName = dataDir + "MyKey.cer";
String privateCertFileName = dataDir + "MyPFX.pfx";
Path publicCertFilePath = Paths.get(publicCertFileName);
Path privateCertFilePath = Paths.get(privateCertFileName);
// Create a message
MailMessage msg = new MailMessage("atneostthaecrcount@gmail.com", "atneostthaecrcount@gmail.com", "Test subject", "Test Body");
// Encrypt the message
MailMessage eMsg = null;
try {
eMsg = msg.encrypt(Files.readAllBytes(publicCertFilePath), "");
if (eMsg.isEncrypted() == true)
System.out.println("Its encrypted");
else
System.out.println("Its NOT encrypted");
} catch (IOException e) {
e.printStackTrace();
}
// Decrypt the message
MailMessage dMsg = null;
try {
dMsg = eMsg.decrypt(Files.readAllBytes(privateCertFilePath), "password");
if (dMsg.isEncrypted() == true)
System.out.println("Its encrypted");
else
System.out.println("Its NOT encrypted");
} catch (IOException e) {
e.printStackTrace();
}

Verificando un Mensaje para Encriptación

La clase Aspose.Email MailMessage permite verificar si un mensaje está encriptado o no. La propiedad isEncrypted de MailMessage permite comprobar esto como se muestra en el siguiente ejemplo de código.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Create a message
MailMessage originalMsg = MailMessage.load(dataDir + "Message.msg", new MsgLoadOptions());
if (originalMsg.isEncrypted() == true)
System.out.println("Its encrypted");
else
System.out.println("Its NOT encrypted");
// Encrypt the message
MailMessage mailMsg = null;
try {
mailMsg = originalMsg.encrypt(Files.readAllBytes(publicCertFilePath), "");
if (mailMsg.isEncrypted() == true)
System.out.println("Its encrypted");
else
System.out.println("Its NOT encrypted");
} catch (IOException e) {
e.printStackTrace();
}
// Decrypt the message
try {
mailMsg = mailMsg.decrypt(Files.readAllBytes(privateCertFilePath), "password");
if (mailMsg.isEncrypted() == true)
System.out.println("Its encrypted");
else
System.out.println("Its NOT encrypted");
} catch (IOException e) {
e.printStackTrace();
}

Encriptación de Mensajes con X509Certificate

Aspose.Email proporciona la API para trabajar con Mensajes Encriptados con X509Certificate:

La clase MailMessage tiene los siguientes métodos para trabajar con la encriptación de mensajes:

Configurar Opciones de Localización para Aspose.Email

Puedes usar la clase LocaleOptions en caso de que la localización predeterminada no sea reconocida y establecer la localización más apropiada para la biblioteca de Aspose Email. Ofrece los siguientes métodos para realizar la tarea:

El siguiente ejemplo de código demuestra cómo cargar un mensaje de correo desde un archivo utilizando la configuración de localización especificada:

final Locale locale = new Locale("es", "ES");
Locale.setDefault(locale);

// establecer localización para la biblioteca Aspose Email
LocaleOptions.setLocale("es-ES");
// o
//LocaleOptions.setLocale(new Locale("es", "ES"));

MailMessage.load("document.msg");

Este código asegura que la aplicación y la biblioteca Aspose.Email usen las localizaciones especificadas para manejar el idioma, el país y las convenciones culturales.

MailMessages que contienen archivos adjuntos TNEF

El Formato de Encapsulación Neutral de Transporte (TNEF) es un formato de archivo adjunto de correo electrónico propietario utilizado por Microsoft Outlook y Microsoft Exchange Server. La API de Aspose.Email permite leer mensajes de correo electrónico que tienen archivos adjuntos TNEF y modificar su contenido. El correo electrónico puede guardarse luego como un correo electrónico normal o en el mismo formato, preservando los archivos adjuntos TNEF. Este artículo muestra diferentes ejemplos de código para trabajar con mensajes que contienen archivos adjuntos TNEF.

Leer un Mensaje Preservando Archivos Adjuntos TNEF

El siguiente fragmento de código muestra cómo leer un mensaje preservando archivos adjuntos TNEF.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
EmlLoadOptions options = new EmlLoadOptions();
// This will Preserve the TNEF attachment as it is, file contains the TNEF attachment
options.setPreserveTnefAttachments(true);
MailMessage eml = MailMessage.load(dataDir + "tnefEml.eml", options);
for (Attachment attachment : eml.getAttachments())
{
System.out.println(attachment.getName());
}

Actualizar Recursos en un Archivo Adjunto TNEF y Preservar el Formato TNEF

El siguiente fragmento de código muestra cómo actualizar recursos en un archivo adjunto TNEF y preservar el formato TNEF.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void TestUpdateResources(String dataDir)
{
String fileName = dataDir + "tnefEMl1.eml";
String imgFileName = dataDir + "Untitled.jpg";
String outFileName = dataDir + "01_SAVE_Preserve_out.eml";
MailMessage originalMailMessage = MailMessage.load(fileName);
EmlLoadOptions emlOp = new EmlLoadOptions();
UpdateResources(originalMailMessage, imgFileName);
EmlSaveOptions emlSo = new EmlSaveOptions(MailMessageSaveType.getEmlFormat());
emlSo.setFileCompatibilityMode(FileCompatibilityMode.PreserveTnefAttachments);
originalMailMessage.save(outFileName, emlSo);
}
private static void UpdateResources(MailMessage msg, String imgFileName)
{
for (int i = 0; i < msg.getAttachments().size(); i++)
{
if (msg.getAttachments().get_Item(i).getContentType().getName().endsWith("jpg"))
{
try {
File attFile = new File(imgFileName);
msg.getAttachments().get_Item(i).setContentStream(new FileInputStream(attFile));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
else if (msg.getAttachments().get_Item(i).getContentType().getName().endsWith("eml"))
{
ByteArrayOutputStream ms = new ByteArrayOutputStream();
msg.getAttachments().get_Item(i).save(ms);
//ms.reset();
ByteArrayInputStream ims = new ByteArrayInputStream(ms.toByteArray());
MailMessage embeddedMessage = MailMessage.load(ims);
UpdateResources(embeddedMessage, imgFileName);
ByteArrayOutputStream outProcessedEmbedded = new ByteArrayOutputStream();
embeddedMessage.save(outProcessedEmbedded, SaveOptions.getDefaultMsgUnicode());
//outProcessedEmbedded.reset();
ByteArrayInputStream inProcessedEmbedded = new ByteArrayInputStream(outProcessedEmbedded.toByteArray());
msg.getAttachments().get_Item(i).setContentStream(inProcessedEmbedded);
}
}
for (LinkedResource att : msg.getLinkedResources())
{
if (att.getContentType().getMediaType() == "image/jpg")
{
try {
File embeddedFile = new File(imgFileName);
FileInputStream es = null;
es = new FileInputStream(embeddedFile);
att.setContentStream(es );
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}

Agregar Nuevos Archivos Adjuntos al Mensaje Principal que Contiene TNEF

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
String fileName = "MainMessage.eml";
String attachName = "barcode.png";
String outFileName = "test_out.eml";
FileInputStream fi = new FileInputStream(dataDir + attachName);
MailMessage eml = MailMessage.load(dataDir + fileName);
eml.getAttachments().addItem(new Attachment(fi, "barcode.png", "image/png"));
eml.save(dataDir + outFileName);

Crear TNEF EML desde MSG

Los MSG de Outlook a veces contienen información como tablas y estilos de texto que pueden verse alterados si se convierten a EML. Crear mensajes TNEF a partir de tales archivos MSG nos permite mantener el formato e incluso enviar tales mensajes a través de clientes de correo electrónico conservando el formato.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MapiMessage msg = MapiMessage.fromFile(dataDir + "Message.msg");
MailConversionOptions options = new MailConversionOptions();
options.setConvertAsTnef (true);
MailMessage mail = msg.toMailMessage(options);

Para crear el TNEF, se puede utilizar el siguiente código de ejemplo.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MsgLoadOptions msgLoadOptions = new MsgLoadOptions();
// The PreserveTnefAttachments option with MessageFormat.Msg will create the TNEF eml.
msgLoadOptions.setPreserveTnefAttachments(true);
MailMessage eml = MailMessage.load(dataDir + "test.eml", msgLoadOptions);

Detectar si un Mensaje es TNEF

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage mail = MailMessage.load(dataDir + "test.eml");
boolean isTnef = mail.getOriginalIsTnef();
System.out.println("isTnef: " + isTnef);

Procesar Mensajes Rebotados

Es muy común que un mensaje enviado a un destinatario pueda rebotar por cualquier razón, como una dirección de destinatario no válida. La API de Aspose.Email tiene la capacidad de procesar tal mensaje para verificar si es un correo electrónico rebotado o un mensaje de correo electrónico regular. El método CheckBounced de la clase MailMessage devuelve un resultado válido si el mensaje de correo electrónico es un correo electrónico rebotado.

Este artículo muestra el uso de la clase BounceResult que proporciona la capacidad de verificar si un mensaje es un correo electrónico rebotado. Además, ofrece información detallada sobre los destinatarios, la acción tomada y la razón de la notificación.

// 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(ProcessBouncedMessages.class) + "email/";
String fileName = "failed.msg";
MailMessage mail = MailMessage.load(dataDir + fileName);
BounceResult result = mail.checkBounced();
System.out.println(fileName);
System.out.println("IsBounced : " + result.isBounced());
System.out.println("Action : " + result.getAction());
System.out.println("Recipient : " + result.getRecipient());
System.out.println();
fileName = "failed1.msg";
mail = MailMessage.load(dataDir + fileName);
result = mail.checkBounced();
System.out.println(fileName);
System.out.println("IsBounced : " + result.isBounced());
System.out.println("Action : " + result.getAction());
System.out.println("Recipient : " + result.getRecipient());
System.out.println("Reason : " + result.getReason());
System.out.println("Status : " + result.getStatus());
System.out.println("OriginalMessage ToAddress 1: " + result.getOriginalMessage().getTo().get_Item(0).getAddress());
System.out.println();
fileName = "test.eml";
mail = MailMessage.load(dataDir + fileName);
result = mail.checkBounced();
System.out.println(fileName);
System.out.println("IsBounced : " + result.isBounced());
System.out.println("Action : " + result.getAction());
System.out.println("Recipient : " + result.getRecipient());

Ignorar excepciones

La biblioteca ofrece una clase ExceptionManager para implementar la capacidad de ignorar excepciones en la funcionalidad de tu aplicación. El siguiente fragmento de código demuestra cómo establecer un callback para manejar excepciones:

 ExceptionManager.setIgnoreExceptionsHandler( new IgnoreExceptionsCallback() {

   //ruta de la excepción: {Módulo}\{Método}\{Acción}\{GUID}

   //ejemplo: MailMessage\Load\DecodeTnefAttachment\64149867-679e-4645-9af0-d46566cae598

   public boolean invoke(AsposeException ex, String path) {

       //Ignorar todas las excepciones en MailMessage.Load

       return path.equals("MailMessage\\Load");

   }

});

O utilizar una alternativa:

 ExceptionManager.setIgnoreAll(true);

Además, puedes establecer un callback para el registro de excepciones ignoradas:

ExceptionManager.setIgnoreExceptionsLogHandler( new IgnoreExceptionsLogCallback() {

   public void invoke(String message) {

        System.out.println("=== EXCEPCIÓN IGNORADA === " + message);

   }

});

Se notificará al usuario que la excepción puede ser ignorada mediante un mensaje de error. Por ejemplo:

Excepción en el mensaje:

AsposeArgumentException: las propiedades no deben estar vacías.

Si deseas ignorar una excepción y continuar, puedes usar:

ExceptionManager.getIgnoreList().add("MailMessage\\Load\\DecodeTnefAttachment\\64149867-679e-4645-9af0-d46566cae598")

El archivo adjunto TNEF no válido se interpretará como un archivo adjunto regular.

Analizador de Spam Bayesiano

Aspose.Email proporciona la facilidad de filtrado de correos electrónicos utilizando el analizador de spam Bayesiano. Proporciona la clase SpamAnalyzer para este propósito. Este artículo muestra cómo entrenar el filtro para distinguir entre spam y correos electrónicos regulares basados en la base de datos de palabras.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void main(String[] args) {
// The path to the resource directory.
String dataDir = Utils.getSharedDataDir(BayesianSpamAnalyzer.class) + "email/";
SpamFilterTest(dataDir);
}
public static void SpamFilterTest(String dataDir) {
String hamFolder = dataDir + "ham";
String spamFolder = dataDir + "spam";
String testFolder = dataDir + "test";
String dataBaseFile = dataDir + "SpamFilterDatabase.txt";
teachAndCreateDatabase(hamFolder, spamFolder, dataBaseFile);
java.io.File folder = new java.io.File(testFolder);
java.io.File[] testFiles = folder.listFiles();
SpamAnalyzer analyzer = new SpamAnalyzer(dataBaseFile);
for (int i = 0; i < testFiles.length; i++) {
MailMessage msg = MailMessage.load(testFiles[i].getAbsolutePath());
System.out.println(msg.getSubject());
double probability = analyzer.test(msg);
printResult(probability);
}
}
private static void teachAndCreateDatabase(String hamFolder, String spamFolder, String dataBaseFile) {
java.io.File folder = new java.io.File(hamFolder);
java.io.File[] hamFiles = folder.listFiles();
folder = new java.io.File(spamFolder);
java.io.File[] spamFiles = folder.listFiles();
SpamAnalyzer analyzer = new SpamAnalyzer();
for (int i = 0; i < hamFiles.length; i++) {
MailMessage hamMailMessage;
try {
hamMailMessage = MailMessage.load(hamFiles[i].getAbsolutePath());
} catch (Exception e) {
continue;
}
System.out.println(i);
analyzer.trainFilter(hamMailMessage, false);
}
for (int i = 0; i < spamFiles.length; i++) {
MailMessage spamMailMessage;
try {
spamMailMessage = MailMessage.load(spamFiles[i].getAbsolutePath());
} catch (Exception e) {
continue;
}
System.out.println(i);
analyzer.trainFilter(spamMailMessage, true);
}
analyzer.saveDatabase(dataBaseFile);
}
private static void printResult(double probability) {
if (probability < 0.05)
System.out.println("This is ham)");
else if (probability > 0.95)
System.out.println("This is spam)");
else
System.out.println("Maybe spam)");
}

Obteniendo Preamble y Epilogue de Mensajes EML

En el formato MIME, el preamble es el texto que aparece después de los encabezados y antes del primer límite de múltiples partes. El epilogue es el texto que aparece después del último límite y antes del final del mensaje. Este texto generalmente no es visible para los usuarios en los lectores de correo, pero algunas implementaciones MIME pueden usarlo para insertar notas para los destinatarios que leen el mensaje usando programas no conformes a MIME.

El siguiente fragmento de código muestra cómo obtener el preámbulo y el epílogo de un mensaje EML, lo que se puede lograr con los métodos correspondientes de la clase MailMessage:

// Obtiene o establece un texto de preámbulo.
public String getPreamble, setPreamble

// Obtiene o establece un texto de epílogo.
public String getEpilogue, setEpilogue