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:
- Crear un nuevo mensaje o cargar uno existente
- Encriptar el mensaje utilizando el archivo de certificado
- Enviar el mensaje o guardarlo
- 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:
- public MailMessage attachSignature(X509Certificate2 certificate, boolean detached) - Crea un mensaje firmado.
- public MailMessage attachSignature(X509Certificate2 certificate) - Crea un mensaje firmado.
- public X509Certificate2[] checkSignatureCert() - Verifica si hay firma en el MailMessage existente.
- public MailMessage decrypt(X509Certificate2 certificate)
- public MailMessage encrypt(X509Certificate2 certificate)
- public MailMessage encrypt(X509Certificate2[] certificates)
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:
- getLocale() - Devuelve la localización predeterminada para Aspose.Email.
- setLocale(Locale locale) y setLocale(String localeName) - Establecen la localización predeterminada relacionada con Aspose.Email.
- clear() - Limpia la localización predeterminada para Aspose.Email. Se utilizará la localización predeterminada para Java.
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:
- setPreamble(String value) - Obtiene o establece un texto de preámbulo.
- setEpilogue(String value) - Obtiene o establece un texto de epílogo.
// Obtiene o establece un texto de preámbulo.
public String getPreamble, setPreamble
// Obtiene o establece un texto de epílogo.
public String getEpilogue, setEpilogue