Работа с прикачени файлове и вложени обекти

Contents
[ ]

Управление на имейл прикачени файлове

Имейл прикаченият файл е файл, изпратен заедно с имейл съобщение. Файлът може да бъде изпратен като отделно съобщение, както и като част от съобщението, към което е прикачен. Attachment клас се използва с MailMessage клас. Всички съобщения включват тяло. В допълнение към тялото, може да искате да изпратите допълнителни файлове. Те се изпращат като прикачени файлове и се представят като екземпляр на Attachment клас. Можете да изпращате произволен брой прикачени файлове, но размерът им е ограничен от пощенския сървър. Gmail, например, не поддържа файлове по-големи от 10 MB.

Добавяне на прикачване

За да прикачите файл към имейл, моля следвайте тези стъпки:

  1. Създайте инстанция на MailMessage клас.
  2. Създайте инстанция на Attachment клас.
  3. Заредете прикачване в Attachment екземпляр.
  4. Добавете Attachment екземпляр в MailMessage екземпляр.

Следният кодов откъс ви показва как да добавите прикачване към имейл.

// 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");

Горе описахме как да добавяте прикачвания към вашето имейл съобщение с Aspose.Email. По-долу се показва как да премахвате прикачвания и да показвате информация за тях на екрана.

Премахване на прикачване

За да премахнете прикачване, следвайте стъпките по-долу:

  • Създайте инстанция на Attachment клас.
  • Заредете прикачване в екземпляра на Attachment клас.
  • Добавете прикачването към екземпляра на MailMessage клас.
  • Премахнете прикачванията от екземпляра на Attachment клас, използвайки MailMessage инстанция на класа.

Следният кодов откъс ви показва как да премахнете прикачване.

// 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);

Показване на името на файла на прикачване

За да покажете името на файла на прикачване, следвайте тези стъпки:

  1. Обхождайте прикачванията в имейл съобщението и
    1. Запазете всяко прикачване.
    2. Покажете името на всяко прикачване на екрана.

Следният кодов откъс ви показва как да покажете името на файл на прикачване на екрана.

MailMessage eml = MailMessage.load("Attachments.eml");

for (Attachment attachment : eml.getAttachments()) {
    // Display the attachment file name
    System.out.println(attachment.getName());
}

Извличане на имейл прикачвания

Тази тема обяснява как да извлечете прикачване от имейл файл. Прикачване към имейл е файл, изпратен заедно с имейл съобщение. Файлът може да бъде изпратен като отделно съобщение, както и част от съобщението, към което е прикрепен. Всички имейл съобщения включват опция за изпращане на допълнителни файлове. Те се изпращат като прикачвания и се представят като екземпляри на Attachment клас. Този Attachment клас се използва с MailMessage клас за работа с прикачвания. За да извлечете прикачвания от имейл съобщение, следвайте тези стъпки:

  • Създайте инстанция на MailMessage клас.
  • Заредете имейл файл в MailMessage екземпляр.
  • Създайте инстанция на Attachment клас и използвайте го в цикъл за извличане на всички прикачвания.
  • Запазете прикачването и го покажете на екрана.

|Извлечени прикачвания в имейл| | :- | |todo:image_alt_text| Следният кодов откъс ви показва как да извлечете имейл прикачвания.

MailMessage eml = MailMessage.load("Message.eml", new MsgLoadOptions());

for (Attachment attachment : eml.getAttachments()) {
    attachment.save("MessageEmbedded_out.eml");
    System.out.println(attachment.getName());
}

Извличане на Content-Description от прикачване

Aspose.Email API предоставя възможността за четене на Content-Description от заглавката на прикачване. Следният кодов откъс ви показва как да извлечете описанието на съдържанието от прикачването.

MailMessage eml = MailMessage.load("EmailWithAttachEmbedded.eml");
System.out.println(eml.getAttachments().get_Item(0).getHeaders().get_Item("Content-Description"));

Определяне дали прикачване е вградено съобщение

Следният кодов откъс демонстрира как да се определи дали прикачването е вградено съобщение или не.

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.");

Определяне на TNEF форматирани прикачвания

Този Attachment.isTnef свойство на Aspose.Email Java API, което показва дали прикачването към съобщението е форматирано като TNEF.

Следният кодов откъс демонстрира как да се определи дали прикачването е форматирано като TNEF:

MailMessage eml = MailMessage.load(fileName);

for (Attachment attachment : eml.getAttachments()) {
    System.out.println("Is Attachment TNEF?: " + attachment.isTnef());
}

Зареждане и записване на TNEF прикачвания

Aspose.Email for Java предоставя методи в MapiAttachment клас за изпълнение на следните операции:

Зареждане от TNEF

  • static MapiAttachment loadFromTnef(String fileName) – Зарежда прикачен файл от TNEF файл.

  • static MapiAttachment loadFromTnef(InputStream stream) – Зарежда прикачен файл от TNEF поток.

Записване в TNEF

  • void saveToTnef(String fileName) – Записва прикачен файл в TNEF файл.

  • void saveToTnef(OutputStream stream) – Записва прикачен файл в TNEF поток.

Следният примерен код демонстрира как да извлечете TNEF прикачване от съобщение, да го запазите в поток или файл и след това да го заредите отново в съобщението като 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);

Извличане на URI на прикачване, ако прикачването е URI‑прикачване

Следният кодов откъс демонстрира как да извлечете URI на прикачване.

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);
}

Добавяне на референтни прикачвания

Референтното прикачване е алтернатива на локалното прикачване на файл. В някои случаи референтните прикачвания може да са предпочитани, например ако искате да управлявате достъпа до тях. Класовете по-долу се използват за управление и манипулиране на имейл съобщения и техните прикачвания:

  • ReferenceAttachment - Представлява референтно прикачване.
  • AttachmentPermissionType - Данните за типа разрешение, свързани с прикачен файл тип уеб референция.
  • AttachmentProviderType - Типът уеб услуга, която обработва прикачения файл.

Следният примерен код демонстрира как да заредите имейл съобщение от файл, създадете референтно прикачване със специфични свойства и добавите прикачването към имейл съобщението:

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);

Работа с вградени обекти

Вграден обект е обект, създаден с едно приложение и включен в документ или файл, създаден от друго приложение. Например, електронна таблица на Microsoft Excel може да бъде вградена в доклад на Microsoft Word, или видео файл може да бъде вграден в презентация на Microsoft PowerPoint. Когато файлът е вграден, вместо да бъде вмъкнат или поставен в друг документ, той запазва оригиналния си формат. Вграденият документ може да бъде отворен в оригиналното приложение и модифициран.

Вграждане на обекти в имейл

Този LinkedResource клас се използва с MailMessage клас за вграждане на обекти във вашите имейл съобщения. За да добавите вграден обект, следвайте тези стъпки

  1. Създайте инстанция на MailMessage клас.
  2. Посочете стойностите за от, до и тема в MailMessage екземпляр.
  3. Създайте инстанция на AlternateView клас.
  4. Създайте инстанция на LinkedResource клас.
  5. Заредете вграден обект в LinkedResourceCollection.
  6. Добавете заредения вграден обект в MailMessage инстанция на класа.
  7. Добавете AlternateView екземпляр към MailMessage инстанция на класа.

Примерите с код по-долу създават имейл съобщение както с обикновен текст, така и с HTML тела и изображение, вградено в HTML

|Изображение, вградено в имейл| | :- | |todo:image_alt_text| Можете да изпратите произволен брой вградени обекти. Размерът на прикачения файл е ограничен от пощенския сървър. Gmail, например, не поддържа файлове по-големи от 10 MB. Примерите с код по-долу демонстрират как да вградите обекти в имейл.

// 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());

Премахване на вградени обекти от имейл

LinkedResourceCollection достъпно чрез MailMessage.LinkedResources свойство. The LinkedResourceCollection колекцията предоставя метод за пълно премахване на вградени обекти, добавени към имейл съобщение. Използвайте претоварената версия на LinkedResourceCollection.removeAt метод за премахване на всички следи от вграден обект от имейл съобщение.

Примерният код по-долу показва как да се премахнат вградените обекти от имейл съобщение.

// 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);

Извличане на вградени обекти

Тази тема обяснява как да извлечете вградени обекти от имейл файл. Вграден обект е обект, създаден с едно приложение и включен в документ или файл, създаден от друго приложение. Например, електронна таблица на Microsoft Excel може да бъде вградена в доклад на Microsoft Word, или видео файл може да бъде вграден в презентация на Microsoft PowerPoint. Когато файлът е вграден, вместо да бъде вмъкнат или поставен в друг документ, той запазва оригиналния си формат. Вграденият документ може да бъде отворен в оригиналното приложение и модифициран. За да извлечете вграден обект от имейл съобщение, следвайте тези стъпки:

  1. Създайте инстанция на MailMessage клас.
  2. Заредете имейл файл в MailMessage екземпляр.
  3. Създайте цикъл и създайте екземпляр на Attachment клас в него.
  4. Запазете прикачения файл и го покажете на екрана.
  5. Посочете адреса на подателя и получателя в MailMessage екземпляр.
  6. Изпратете имейл, използвайки SmtpClient клас.

Кодовият отрязък по-долу извлича вградени обекти от имейл.

|Извлечени вградени обекти в имейл| | :- | |todo:image_alt_text| Следният кодов отрязък ви показва как да извлечете вградени обекти.

MailMessage mailMsg = MailMessage.load("Message.msg", new MsgLoadOptions());

for (Attachment attachment : mailMsg.getAttachments()) {
    attachment.save("MessageEmbedded_out.msg");
    System.out.println(attachment.getName());
}

Идентифициране и извличане на вграден прикачен файл от MSG, форматиран като RTF

Следният код може да се използва за съобщения, форматирани като RTF, за да се различават и извлечат прикачени файлове, които са вмъкнати (Inline) или се показват като икона в тялото на съобщението. Следният кодов отрязък ви показва как да идентифицирате и извлечете вграден прикачен файл от MSG, форматиран като 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);
            }
        }
    }
}

Извличане на прикачени файлове от подписан имейл

Подписаните имейли съдържат единствено прикачен файл smime.p7m. Това означава, че имейлът е криптиран с SMIME. Форматът smime.p7m е цифровият подпис. За да видите съдържанието на този имейл, използвайте RemoveSignature метод. Методът връща MailMessage обект без цифров подпис.

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());
    }
}

Работа с Content-Type и Content-Disposition

Aspose.Email API предоставя възможността за работа с прикачения файл Content-Type и Content-Disposition от заглавката на прикачения файл. Следният кодов отрязък ви показва как да получите и промените описанието на съдържанието от прикачения файл.

Показване на параметрите Content-Type и Content-Disposition

Следният кодов отрязък ви показва как да визуализирате параметрите на Content-Type и Content-Disposition на екрана:

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());
}

Използване на параметрите Content-Type и Content-Disposition с прикачени файлове

Следният кодов отрязък ви показва как да използвате параметрите Content-Type и Content-Disposition с прикачен файл:

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);