การทำงานกับไฟล์แนบและวัตถุฝัง
การจัดการไฟล์แนบอีเมล
ไฟล์แนบของอีเมลคือไฟล์ที่ส่งพร้อมกับข้อความอีเมล ไฟล์อาจถูกส่งเป็นข้อความแยกหรือเป็นส่วนหนึ่งของข้อความที่แนบอยู่ Attachment คลาสใช้ร่วมกับ MailMessage คลาส ข้อความทั้งหมดมีส่วนเนื้อหา นอกจากเนื้อหาแล้วคุณอาจต้องการส่งไฟล์เพิ่มเติม ซึ่งจะส่งเป็นไฟล์แนบและเป็นอินสแตนซ์ของ Attachment คลาส คุณสามารถส่งไฟล์แนบจำนวนไม่จำกัด แต่ขนาดไฟล์แนบจะถูกจำกัดโดยเซิร์ฟเวอร์เมล ตัวอย่างเช่น Gmail ไม่รองรับไฟล์ขนาดเกิน 10MB
ลองใช้ดู!
เพิ่มหรือลบไฟล์แนบอีเมลออนไลน์ด้วยบริการฟรี แอป Aspose.Email Editor.
การเพิ่มไฟล์แนบ
เพื่อแนบไฟล์แนบไปยังอีเมล โปรดทำตามขั้นตอนต่อไปนี้:
- สร้างอินสแตนซ์ของ 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 คลาส. เมธอด 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 จากไฟล์แนบ
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 คลาสสำหรับฝังวัตถุในข้อความอีเมลของคุณ เพื่อเพิ่มวัตถุที่ฝังอยู่ ให้ทำตามขั้นตอนต่อไปนี้
- สร้างอินสแตนซ์ของ MailMessage คลาส.
- ระบุค่าจาก, ถึงและหัวเรื่องใน MailMessage อินสแตนซ์
- สร้างอินสแตนซ์ของ AlternateView คลาส.
- สร้างอินสแตนซ์ของ LinkedResource คลาส.
- โหลดวัตถุที่ฝังเข้าไปใน LinkedResourceCollection.
- เพิ่มวัตถุที่ฝังที่โหลดแล้วเข้าไปใน MailMessage อินสแตนซ์ของคลาส.
- เพิ่ม AlternateView อินสแตนซ์ของ MailMessage อินสแตนซ์ของคลาส.
โค้ดสแนปเป็ทด้านล่างสร้างข้อความอีเมลที่มีส่วนข้อความธรรมดาและ HTML รวมทั้งภาพที่ฝังอยู่ใน HTML
|รูปภาพที่ฝังอยู่ในอีเมล| | :- | |
| คุณสามารถส่งวัตถุที่ฝังอยู่ได้จำนวนไม่จำกัด ขนาดของไฟล์แนบถูกจำกัดโดยเซิร์ฟเวอร์เมล ตัวอย่างเช่น 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 เมื่อไฟล์ถูกฝังไว้ จะรักษารูปแบบเดิมของมันไว้ แทนที่จะถูกแทรกหรือวางลงในเอกสารอื่น สามารถเปิดเอกสารที่ฝังไว้ด้วยแอปพลิเคชันต้นทางและแก้ไขได้ เพื่อดึงวัตถุที่ฝังอยู่จากข้อความอีเมล ให้ทำตามขั้นตอนต่อไปนี้:
- สร้างอินสแตนซ์ของ 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);