Trabajar con adjuntos y objetos incrustados
Gestionar adjuntos de correo electrónico
Un adjunto de correo electrónico es un archivo que se envía junto con un mensaje de correo. El archivo puede enviarse como un mensaje separado así como como parte del mensaje al que está adjunto. El Attachment clase se usa con el MailMessage clase. Todos los mensajes incluyen un cuerpo. Además del cuerpo, podría querer enviar archivos adicionales. Estos se envían como adjuntos y se representan como una instancia de la Attachment clase. Puede enviar cualquier número de adjuntos, pero el tamaño del adjunto está limitado por el servidor de correo. Gmail, por ejemplo, no admite archivos de más de 10 MB.
¡Pruébalo!
Agregar o eliminar adjuntos de correo electrónico en línea con la aplicación gratuita Aspose.Email Editor App.
Añadiendo adjunto
Para adjuntar un archivo a un correo electrónico, siga los siguientes pasos:
- Cree una instancia de la MailMessage clase.
- Cree una instancia de la Attachment clase.
- Cargue el adjunto en el Attachment instancia.
- Añada el Attachment instancia en el MailMessage instancia.
El siguiente fragmento de código muestra cómo añadir un adjunto a un correo electrónico.
// Create an instance of MailMessage class
MailMessage message = new MailMessage();
message.setFrom(new MailAddress("sender@from.com"));
message.getTo().add("receiver@to.com");
message.setSubject("This is message");
message.setBody("This is body");
// Load an attachment
Attachment attachment = new Attachment("1.txt");
// Add Multiple Attachment in instance of MailMessage class and Save message to disk
message.getAttachments().addItem(attachment);
message.addAttachment(new Attachment("1.jpg"));
message.addAttachment(new Attachment("1.doc"));
message.addAttachment(new Attachment("1.rar"));
message.addAttachment(new Attachment("1.pdf"));
message.save("AddAttachments.eml");
Arriba describimos cómo añadir adjuntos a su mensaje de correo electrónico con Aspose.Email. Lo que sigue muestra cómo eliminar adjuntos y mostrar información sobre ellos en la pantalla.
Eliminando un adjunto
Para eliminar un adjunto, siga los pasos que se indican a continuación:
- Cree una instancia de Attachment clase.
- Cargue el adjunto en la instancia de Attachment clase.
- Añada el adjunto a la instancia de MailMessage clase.
- Elimine los adjuntos de la instancia de Attachment clase usando el MailMessage instancia de clase.
El siguiente fragmento de código muestra cómo eliminar un adjunto.
// Create an instance of MailMessage class
MailMessage eml = new MailMessage();
eml.setFrom(new MailAddress("sender@from.com"));
eml.getTo().add("receiver@to.com");
// Load an attachment
Attachment attachment = new Attachment("1.txt");
eml.getAttachments().addItem(attachment);
// Remove attachment from your MailMessage
eml.getAttachments().removeItem(attachment);
Mostrando el nombre de archivo del adjunto
Para mostrar el nombre de archivo del adjunto, siga estos pasos:
- Recorra los adjuntos en el mensaje de correo electrónico y
- Guarde cada adjunto.
- Muestre cada nombre de adjunto en la pantalla.
El siguiente fragmento de código muestra cómo mostrar el nombre de archivo de un adjunto en la pantalla.
MailMessage eml = MailMessage.load("Attachments.eml");
for (Attachment attachment : eml.getAttachments()) {
// Display the attachment file name
System.out.println(attachment.getName());
}
Extrayendo adjuntos de correo electrónico
Este tema explica cómo extraer un adjunto de un archivo de correo electrónico. Un adjunto de correo es un archivo que se envía junto con un mensaje de correo. El archivo puede enviarse como un mensaje separado o como parte del mensaje al que está adjunto. Todos los mensajes de correo electrónico incluyen la opción de enviar archivos adicionales. Estos se envían como adjuntos y se representan como instancias de la Attachment clase. El Attachment clase se usa con el MailMessage clase para trabajar con adjuntos. Para extraer adjuntos de un mensaje de correo electrónico, siga estos pasos:
- Cree una instancia de la MailMessage clase.
- Cargue un archivo de correo electrónico en el MailMessage instancia.
- Cree una instancia de la Attachment clase y úsela en un bucle para extraer todos los adjuntos.
- Guarde el adjunto y muéstrelo en la pantalla.
|Adjuntos extraídos en el correo| | :- | |
| El siguiente fragmento de código muestra cómo extraer adjuntos de correo electrónico.
MailMessage eml = MailMessage.load("Message.eml", new MsgLoadOptions());
for (Attachment attachment : eml.getAttachments()) {
attachment.save("MessageEmbedded_out.eml");
System.out.println(attachment.getName());
}
Recuperando Content-Description del adjunto
La API Aspose.Email proporciona la capacidad de leer la Content-Description del adjunto desde el encabezado del adjunto. El siguiente fragmento de código muestra cómo recuperar la descripción del contenido del adjunto.
MailMessage eml = MailMessage.load("EmailWithAttachEmbedded.eml");
System.out.println(eml.getAttachments().get_Item(0).getHeaders().get_Item("Content-Description"));
Determinar si un adjunto es un mensaje incrustado
El siguiente fragmento de código demuestra cómo determinar si el adjunto es un mensaje incrustado o no.
MailMessage eml = MailMessage.load("EmailWithAttachEmbedded.eml");
System.out.println(eml.getAttachments().get_Item(0).isEmbeddedMessage()
? "Attachment is an embedded message."
: "Attachment isn't an embedded message.");
Determinar adjuntos con formato TNEF
El Attachment.isTnef propiedad de la API Java de Aspose.Email que indica si el adjunto del mensaje está formateado como TNEF.
El siguiente fragmento de código demuestra cómo determinar si un adjunto está formateado como TNEF:
MailMessage eml = MailMessage.load(fileName);
for (Attachment attachment : eml.getAttachments()) {
System.out.println("Is Attachment TNEF?: " + attachment.isTnef());
}
Cargar y guardar adjuntos TNEF
Aspose.Email for Java proporciona métodos en el MapiAttachment clase para realizar las siguientes operaciones:
Cargar desde TNEF
-
static MapiAttachment loadFromTnef(String fileName)– Carga un adjunto desde un archivo TNEF. -
static MapiAttachment loadFromTnef(InputStream stream)– Carga un adjunto desde un flujo TNEF.
Guardar en TNEF
-
void saveToTnef(String fileName)– Guarda un adjunto en un archivo TNEF. -
void saveToTnef(OutputStream stream)– Guarda un adjunto en un flujo TNEF.
El siguiente ejemplo de código muestra cómo extraer un adjunto TNEF de un mensaje, guardarlo en un flujo o archivo, y luego cargarlo de nuevo en el mensaje como un MapiAttachment:
// Load message containing a TNEF attachment (winmail.dat)
MapiMessage msg = MapiMessage.load("message.eml");
// Save the first attachment to a TNEF stream
ByteArrayOutputStream bos = new ByteArrayOutputStream();
msg.getAttachments().get(0).saveToTnef(bos);
// Load attachment back from the TNEF stream
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
MapiAttachment fromtnefAttachment = MapiAttachment.loadFromTnef(bis);
msg.getAttachments().addMapiAttachment(fromtnefAttachment);
// Load TNEF attachment directly from a file
fromtnefAttachment = MapiAttachment.loadFromTnef("winmail.dat");
msg.getAttachments().addMapiAttachment(fromtnefAttachment);
Extrayendo URI del adjunto si el adjunto es un URI‑adjunto
El siguiente fragmento de código demuestra cómo extraer el URI del adjunto.
MailMessage eml = MailMessage.load("fileName");
Attachment attachment = eml.getAttachments().get_Item(0);
if (attachment.isUri()) {
InputStream inputStream = attachment.getContentStream();
String uri = new String(IOUtils.toByteArray(inputStream), Charset.forName("utf-8"));
System.out.println("Attachment URI: " + uri);
}
Añadiendo adjuntos de referencia
Un adjunto de referencia es una alternativa al adjunto de archivo local. En algunos casos, los adjuntos de referencia pueden ser preferibles, por ejemplo, si desea gestionar su acceso. Las clases a continuación se utilizan para gestionar y manipular mensajes de correo electrónico y sus adjuntos:
- ReferenceAttachment - Representa un adjunto de referencia.
- AttachmentPermissionType - Los datos del tipo de permiso asociados con un adjunto de referencia web.
- AttachmentProviderType - El tipo de servicio web que manipula el adjunto.
El siguiente ejemplo de código demuestra cómo cargar un mensaje de correo electrónico desde un archivo, crear un adjunto de referencia con propiedades específicas y añadir el adjunto al mensaje de correo electrónico:
MailMessage eml = MailMessage.load("fileName");
ReferenceAttachment refAttach = new ReferenceAttachment("https://[attach_uri]")
refAttach.setName("Document.docx");
refAttach.setProviderType(AttachmentProviderType.OneDrivePro);
refAttach.setPermissionType(AttachmentPermissionType.AnyoneCanEdit);
eml.getAttachments().addItem(refAttach);
Trabajando con objetos incrustados
Un objeto incrustado es un objeto que se creó con una aplicación y se incluyó dentro de un documento o archivo creado por otra aplicación. Por ejemplo, una hoja de cálculo de Microsoft Excel puede incrustarse en un informe de Microsoft Word, o un archivo de video puede incrustarse en una presentación de Microsoft PowerPoint. Cuando un archivo está incrustado, en lugar de insertarse o pegarse en otro documento, conserva su formato original. El documento incrustado puede abrirse en la aplicación original y modificarse.
Incrustar objetos en un correo electrónico
El LinkedResource clase se usa con el MailMessage clase para incrustar objetos en sus mensajes de correo electrónico. Para añadir un objeto incrustado, siga estos pasos
- Cree una instancia de la MailMessage clase.
- Especifique los valores de remitente, destinatario y asunto en MailMessage instancia.
- Cree una instancia de la AlternateView clase.
- Cree una instancia de la LinkedResource clase.
- Cargue un objeto incrustado en el LinkedResourceCollection.
- Añada el objeto incrustado cargado al MailMessage instancia de clase.
- Añada el AlternateView instancia al MailMessage instancia de clase.
Los fragmentos de código a continuación generan un mensaje de correo electrónico con cuerpos de texto plano y HTML, y una imagen incrustada en el HTML
|Imagen incrustada en el correo| | :- | |
| Puede enviar cualquier número de objetos incrustados. El tamaño del adjunto está limitado por el servidor de correo. Gmail, por ejemplo, no admite archivos de más de 10 MB. Los fragmentos de código a continuación demuestran cómo incrustar objetos en un correo electrónico.
// Create an instance of the MailMessage class and Set the addresses and Set the content
MailMessage mail = new MailMessage();
mail.setFrom(new MailAddress("sender@from.com"));
mail.getTo().add("receiver@to.com");
mail.setSubject("This is an email");
// Create the plain text part It is viewable by those clients that don't support HTML
AlternateView plainView = AlternateView.createAlternateViewFromString("This is my plain text content", null, "text/plain");
// Create the HTML part.To embed images, we need to use the prefix 'cid' in the img src value.
// The cid value will map to the Content-Id of a Linked resource.
// Thus <img src='cid:barcode'> will map to a LinkedResource with a ContentId of //'barcode'.
AlternateView htmlView = AlternateView.createAlternateViewFromString("Here is an embedded image.<img src=cid:barcode>", null, "text/html");
// Create the LinkedResource (embedded image) and Add the LinkedResource to the appropriate view
LinkedResource barcode = new LinkedResource("1.jpg", MediaTypeNames.Image.JPEG);
barcode.setContentId("barcode");
mail.getLinkedResources().addItem(barcode);
mail.getAlternateViews().addItem(plainView);
mail.getAlternateViews().addItem(htmlView);
mail.save("EmbeddedImage_out.msg", SaveOptions.getDefaultMsgUnicode());
Eliminando objetos incrustados del correo electrónico
LinkedResourceCollection accedido a través de MailMessage.LinkedResources propiedad. El LinkedResourceCollection la colección proporciona un método para eliminar completamente los objetos incrustados añadidos a un mensaje de correo electrónico. Utilice la versión sobrecargada de LinkedResourceCollection.removeAt método para eliminar todos los rastros de un objeto incrustado de un mensaje de correo electrónico.
El código de ejemplo a continuación muestra cómo eliminar objetos incrustados de un mensaje de correo electrónico.
// Load the test message with Linked Resources
MailMessage msg = MailMessage.load("EmlWithLinkedResources.eml");
// Remove a LinkedResource
msg.getLinkedResources().removeAt(0, true);
// Now clear the Alternate View for linked Resources
msg.getAlternateViews().get_Item(0).getLinkedResources().clear(true);
Extrayendo objetos incrustados
Este tema explica cómo extraer objetos incrustados de un archivo de correo electrónico. Un objeto incrustado es un objeto que se creó con una aplicación y se incluyó dentro de un documento o archivo creado por otra aplicación. Por ejemplo, una hoja de cálculo de Microsoft Excel puede incrustarse en un informe de Microsoft Word, o un archivo de video puede incrustarse en una presentación de Microsoft PowerPoint. Cuando un archivo está incrustado, en lugar de insertarse o pegarse en otro documento, conserva su formato original. El documento incrustado puede abrirse en la aplicación original y modificarse. Para extraer un objeto incrustado de un mensaje de correo electrónico, siga estos pasos:
- Cree una instancia de la MailMessage clase.
- Cargue un archivo de correo electrónico en el MailMessage instancia.
- Cree un bucle y cree una instancia de la Attachment clase en ella.
- Guarde el adjunto y muéstrelo en pantalla.
- Especifique la dirección del remitente y del destinatario en el MailMessage instancia.
- Enviar correo electrónico usando el SmtpClient clase.
El fragmento de código a continuación extrae objetos incrustados de un correo electrónico.
|Objetos incrustados extraídos en el correo| | :- | |
| El siguiente fragmento de código muestra cómo extraer objetos incrustados.
MailMessage mailMsg = MailMessage.load("Message.msg", new MsgLoadOptions());
for (Attachment attachment : mailMsg.getAttachments()) {
attachment.save("MessageEmbedded_out.msg");
System.out.println(attachment.getName());
}
Identificar y extraer un adjunto incrustado de MSG formateado como RTF
El siguiente código se puede usar para mensajes formateados como RTF para diferenciar y extraer adjuntos que son Inline o aparecen como ícono en el cuerpo del mensaje. El siguiente fragmento de código muestra cómo identificar y extraer un adjunto incrustado de un MSG formateado como RTF.
public static void extractInlineAttachments() {
MapiMessage message = MapiMessage.load("MSG file with RTF Formatting.msg");
for (MapiAttachment attachment : message.getAttachments()) {
if (isAttachmentInline(attachment)) {
try {
saveAttachment(attachment, UUID.randomUUID().toString());
} catch (Exception ex) {
System.err.println(ex);
}
}
}
}
static boolean isAttachmentInline(MapiAttachment attachment) {
for (MapiProperty property : attachment.getObjectData().getProperties().get_Values()) {
if ("\u0003ObjInfo".equals(property.getName())) {
byte[] data = property.getData();
int odtPersist1 = data[1] << 8 | data[0];
return (odtPersist1 & 0x40) == 0;
}
}
return false;
}
static void saveAttachment(MapiAttachment attachment, String fileName) throws IOException {
for (MapiProperty property : attachment.getObjectData().getProperties().get_Values()) {
if ("Package".equals(property.getName())) {
try (FileOutputStream fs = new FileOutputStream(fileName)) {
fs.write(property.getData(), 0, property.getData().length);
}
}
}
}
Recuperar adjuntos de correo firmado
Los correos firmados contienen un solo adjunto smime.p7m. Esto significa que el correo está encriptado por SMIME. El formato de archivo smime.p7m es la firma digital. Para ver el contenido de este correo use el RemoveSignature método. El método devuelve un MailMessage objeto sin firma digital.
MailMessage signedEml = MailMessage.load("signed.eml");
if (signedEml.isSigned()) {
for (int i = 0; i < signedEml.getAttachments().size(); i++) {
System.out.println("Signed email attachment" + i + ": " + signedEml.getAttachments().get_Item(i).getName());
}
// The email is signed. Remove a signature.
MailMessage eml = signedEml.removeSignature();
System.out.println("Signature removed.");
for (int i = 0; i < eml.getAttachments().size(); i++) {
System.out.println("Email attachment" + i + ": " + eml.getAttachments().get_Item(i).getName());
}
}
Trabajar con Content-Type y Content-Disposition
La API de Aspose.Email brinda la capacidad de trabajar con el adjunto Content-Type y Content-Disposition del encabezado del adjunto. El siguiente fragmento de código muestra cómo obtener y cambiar la descripción del contenido del adjunto.
Mostrar los parámetros Content-Type y Content-Disposition
El siguiente fragmento de código muestra cómo mostrar los parámetros Content-Type y Content-Disposition en la pantalla:
void run(MailMessage message) {
// Attachments
for (Attachment attachment : message.getAttachments()) {
ContentDisposition contentDisposition = attachment.getContentDisposition();
printContentDisposition(contentDisposition);
ContentType contentType = attachment.getContentType();
printContentType(contentType);
}
// Linked Resources
for (LinkedResource attachment : message.getLinkedResources()) {
ContentDisposition contentDisposition = attachment.getContentDisposition();
printContentDisposition(contentDisposition);
ContentType contentType = attachment.getContentType();
printContentType(contentType);
}
}
void printContentType(ContentType contentType) {
System.out.println("media-type: " + contentType.getMediaType());
System.out.println("charset: " + contentType.getCharSet());
System.out.println("name: " + contentType.getName());
}
void printContentDisposition(ContentDisposition contentDisposition) {
System.out.println("disposition-type: " + contentDisposition.getDispositionType());
System.out.println("is-inline: " + contentDisposition.getInline());
System.out.println("filename: " + contentDisposition.getFileName());
System.out.println("creation-date: " + contentDisposition.getCreationDate());
System.out.println("modification-date: " + contentDisposition.getModificationDate());
System.out.println("read-date: " + contentDisposition.getReadDate());
System.out.println("size: " + contentDisposition.getSize());
}
Uso de los parámetros Content-Type y Content-Disposition con adjuntos
El siguiente fragmento de código muestra cómo usar los parámetros Content-Type y Content-Disposition con un adjunto:
MailMessage eml = MailMessage.load(fileName);
Attachment attachment = new Attachment(pdfFileName, new ContentType("application/octet-stream"));
attachment.getContentDisposition().setDispositionType("attachment");
attachment.getContentDisposition().setFileName(fileName);
eml.addAttachment(attachment);