การทำงานกับไฟล์แนบและวัตถุฝัง

Contents
[ ]

การจัดการไฟล์แนบอีเมล

ไฟล์แนบของอีเมลคือไฟล์ที่ส่งพร้อมกับข้อความอีเมล ไฟล์อาจถูกส่งเป็นข้อความแยกหรือเป็นส่วนหนึ่งของข้อความที่แนบอยู่ Attachment คลาสใช้ร่วมกับ MailMessage คลาส ข้อความทั้งหมดมีส่วนเนื้อหา นอกจากเนื้อหาแล้วคุณอาจต้องการส่งไฟล์เพิ่มเติม ซึ่งจะส่งเป็นไฟล์แนบและเป็นอินสแตนซ์ของ Attachment คลาส คุณสามารถส่งไฟล์แนบจำนวนไม่จำกัด แต่ขนาดไฟล์แนบจะถูกจำกัดโดยเซิร์ฟเวอร์เมล ตัวอย่างเช่น Gmail ไม่รองรับไฟล์ขนาดเกิน 10MB

การเพิ่มไฟล์แนบ

เพื่อแนบไฟล์แนบไปยังอีเมล โปรดทำตามขั้นตอนต่อไปนี้:

  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 สำหรับ 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);

การดึง Attachment 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);
}

การเพิ่มไฟล์แนบอ้างอิง

ไฟล์แนบอ้างอิงเป็นทางเลือกของไฟล์แนบในเครื่อง ในบางกรณีไฟล์แนบอ้างอิงอาจเหมาะสมกว่า เช่น หากคุณต้องการจัดการการเข้าถึงของมัน คลาสต่อไปนี้ใช้สำหรับจัดการและทำงานกับข้อความอีเมลและไฟล์แนบของมัน:

  • 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 ไม่รองรับไฟล์ที่มีขนาดเกิน 10MB โค้ดสแนปเป็ทด้านล่างแสดงวิธีการฝังวัตถุลงในอีเมล.

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