Робота з вкладеннями та вбудованими об’єктами
Керування вкладеннями електронної пошти
Вкладення електронного листа — це файл, який надсилається разом з повідомленням електронної пошти. Файл може бути надісланий як окреме повідомлення, так і як частина повідомлення, до якого він приєднаний. Attachment клас використовується з MailMessage клас. Усі повідомлення містять тіло. Окрім тіла, ви можете захотіти надіслати додаткові файли. Вони надсилаються як вкладення і представлені у вигляді екземпляра Attachment клас. Ви можете надсилати будь-яку кількість вкладень, проте розмір вкладення обмежується поштовим сервером. Gmail, наприклад, не підтримує файли розміром більше 10 МБ.
Спробуйте!
Додавайте або видаляйте вкладення електронної пошти онлайн за допомогою безкоштовного Aspose.Email Editor App.
Додавання вкладення
Щоб прикріпити вкладення до електронного листа, будь ласка, виконайте наступні кроки:
- Створіть екземпляр MailMessage клас.
- Створіть екземпляр Attachment клас.
- Завантажте вкладення у Attachment екземпляр.
- Додайте 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);
Відображення назви файлу вкладення
Щоб відобразити назву файлу вкладення, виконайте такі кроки:
- Пройдіться по вкладеннях у повідомленні електронної пошти та
- Збережіть кожне вкладення.
- Відобразіть назви всіх вкладень на екрані.
Наступний фрагмент коду показує, як відобразити назву файлу вкладення на екрані.
MailMessage eml = MailMessage.load("Attachments.eml");
for (Attachment attachment : eml.getAttachments()) {
// Display the attachment file name
System.out.println(attachment.getName());
}
Витягування вкладень електронної пошти
У цьому розділі пояснюється, як витягнути вкладення з файлу електронної пошти. Вкладення електронної пошти — це файл, який надсилається разом із повідомленням. Файл може бути надісланий як окреме повідомлення, так і як частина повідомлення, до якого він прикріплений. У всіх повідомленнях електронної пошти є можливість надсилати додаткові файли. Вони надсилаються як вкладення і представлені як екземпляри Attachment клас. The Attachment клас використовується з MailMessage клас для роботи з вкладеннями. Щоб витягти вкладення з повідомлення електронної пошти, виконайте такі кроки:
- Створіть екземпляр MailMessage клас.
- Завантажте файл електронного листа у MailMessage екземпляр.
- Створіть екземпляр Attachment клас та використовуйте його в циклі для витягнення всіх вкладень.
- Збережіть вкладення та відобразіть його на екрані.
|Витягнуті вкладення в електронному листі| | :- | |
| Наступний фрагмент коду показує, як витягнути вкладення електронної пошти.
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 з вкладення
API Aspose.Email надає можливість читати 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
The Attachment.isTnef властивість API Aspose.Email для Java, яка вказує, чи є вкладення повідомлення у форматі TNEF.
Наступний фрагмент коду демонструє, як визначити, чи є вкладення у форматі TNEF:
MailMessage eml = MailMessage.load(fileName);
for (Attachment attachment : eml.getAttachments()) {
System.out.println("Is Attachment TNEF?: " + attachment.isTnef());
}
Завантаження та збереження TNEF‑вкладень
Aspose.Email для 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. Коли файл вбудовується, а не вставляється чи копіюється в інший документ, він зберігає свій оригінальний формат. Вбудований документ можна відкрити у первинній програмі та змінити.
Вбудовування об’єктів в електронний лист
The LinkedResource клас використовується з MailMessage клас для вбудовування об’єктів у ваші повідомлення електронної пошти. Щоб додати вбудований об’єкт, виконайте наступні кроки
- Створіть екземпляр MailMessage клас.
- Вкажіть значення полів From, To та Subject у MailMessage екземпляр.
- Створіть екземпляр AlternateView клас.
- Створіть екземпляр LinkedResource клас.
- Завантажте вбудований об’єкт у LinkedResourceCollection.
- Додайте завантажений вбудований об’єкт у MailMessage екземпляр класу.
- Додайте AlternateView екземпляр до MailMessage екземпляр класу.
Нижче наведені фрагменти коду створюють повідомлення електронної пошти з простим текстом та HTML‑тілом, а також зображенням, вбудованим в HTML
|Зображення, вбудоване в електронний лист| | :- | |
| Ви можете надіслати будь-скільки вбудованих об’єктів. Розмір вкладення обмежений поштовим сервером. Наприклад, Gmail не підтримує файли розміром понад 10 МБ. Нижче наведені фрагменти коду, що демонструють, як вбудовувати об’єкти в електронний лист.
// 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 властивість. Цей 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. Коли файл вбудовується, а не вставляється або копіюється в інший документ, він зберігає свій оригінальний формат. Вбудований документ можна відкрити у первинній програмі та змінити його. Щоб витягнути вбудований об’єкт з повідомлення електронної пошти, виконайте такі кроки:
- Створіть екземпляр MailMessage клас.
- Завантажте файл електронного листа у MailMessage екземпляр.
- Створіть цикл і створіть екземпляр Attachment клас у цьому.
- Збережіть вкладення та відобразіть його на екрані.
- Вкажіть адресу відправника та отримувача у MailMessage екземпляр.
- Надіслати електронний лист, використовуючи SmtpClient клас.
Нижченаведений фрагмент коду витягує вбудовані об’єкти з листа.
|Витягнуті вбудовані об’єкти у листі| | :- | |
| Нижченаведений фрагмент коду показує, як витягти вбудовані об’єкти.
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);