کار با پیوست‌ها و اشیای درج‌شده

مدیریت پیوست‌های ایمیل

یک پیوست ایمیل فایلی است که همراه با پیام ایمیل ارسال می‌شود. فایل می‌تواند به‌عنوان پیام جداگانه یا بخشی از پیام که به آن پیوست شده است ارسال شود. Attachment کلاس با MailMessage کلاس. تمام پیام‌ها شامل بدنه هستند. علاوه بر بدنه، ممکن است بخواهید فایل‌های اضافی ارسال کنید. اینها به عنوان پیوست‌ها ارسال می‌شوند و به صورت یک نمونه از Attachment کلاس. می‌توانید هر تعداد پیوست ارسال کنید اما اندازه پیوست توسط سرور ایمیل محدود می‌شود. به عنوان مثال Gmail از فایل‌های بزرگتر از 10 مگابایت پشتیبانی نمی‌کند.

افزودن پیوست

برای ضمیمه کردن یک پیوست به ایمیل، لطفاً مراحل زیر را دنبال کنید:

  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 از پیوست

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

این Attachment.isTnef ویژگی API جاوا Aspose.Email نشان می‌دهد آیا پیوست پیام به‌صورت 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-attachment باشد

قطعه کد زیر نشان می‌دهد چگونه 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);
}

افزودن پیوست‌های مرجع

پیوست مرجع یک جایگزین برای پیوست فایل محلی است. در برخی موارد، پیوست‌های مرجع ممکن است ترجیح داده شوند، برای مثال، اگر بخواهید دسترسی آن را مدیریت کنید. کلاس‌های زیر برای مدیریت و دستکاری پیام‌های ایمیل و پیوست‌های آنها استفاده می‌شوند:

نمونه کد زیر نشان می‌دهد چگونه یک پیام ایمیل را از یک فایل بارگذاری کنید، یک پیوست مرجع با ویژگی‌های خاص ایجاد کنید، و پیوست را به پیام ایمیل اضافه کنید:

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. مقادیر From، To و Subject را در MailMessage نمونه.
  3. یک نمونه از AlternateView کلاس.
  4. یک نمونه از LinkedResource کلاس.
  5. بارگذاری یک شیء جاسازی‌شده در LinkedResourceCollection.
  6. شیء جاسازی‌شدهٔ بارگذاری‌شده را به MailMessage نمونهٔ کلاس.
  7. افزودن AlternateView نمونه به MailMessage نمونهٔ کلاس.

قطعات کد زیر یک پیام ایمیل با هر دو بدنهٔ متن ساده و HTML و یک تصویر جاسازی‌شده در HTML تولید می‌کنند

|تصویر جاسازی‌شده در ایمیل| | :- | |todo:image_alt_text| می‌توانید هر تعداد اشیاء جاسازی‌شده ارسال کنید. حجم پیوست توسط سرور ایمیل محدود می‌شود. به عنوان مثال، Gmail از فایل‌های بزرگتر از ۱۰ مگابایت پشتیبانی نمی‌کند. قطعات کد زیر نشان می‌دهند چگونه اشیاء را به یک ایمیل جاسازی کنید.

// 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 جاسازی شود. وقتی فایلی جاسازی می‌شود، به‌جای این که در یک سند دیگر وارد یا چسبانده شود، قالب اصلی خود را حفظ می‌کند. سند جاسازی‌شده می‌تواند در برنامه اصلی باز شده و ویرایش شود. برای استخراج یک شیء جاسازی‌شده از یک پیام ایمیل، مراحل زیر را دنبال کنید:

  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

API Aspose.Email امکان کار با پیوست را فراهم می‌کند 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);