Sample code for 30+ languages & platforms
Dart Requires Chilkat v11.0.0+

Load .eml and Examine the Structure, Attachments, and Related Items

See more Email Object Examples

Demonstrates how to load examine the MIME structure of a .eml, and also examine the attachment and related item filenames, attached messages, and multipart/report and DSN information.

Chilkat Dart Downloads

Dart
import 'package:chilkat/chilkat.dart';

void main() {
  // This example requires the Chilkat API to have been previously unlocked.
  // See Global Unlock Sample for sample code.

  final emlPath = 'C:/AAWorkarea/beatrix/roesner.eml';

  final mime = CkMime();

  try {
    mime.loadMimeFile(emlPath);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  print('---- MIME structure ----');
  print(mime.getStructure('text'));
  print('------------------------');

  final email = CkEmail();
  email.loadEml(emlPath);

  // Was this a signed and/or encrypted email?
  // If so, then loading the .eml automatically unwraps
  // (i.e. verifies signatures and decrypts) and the resultant
  // email is what existed prior to signing/encrypting.
  print('Email was Signed: ${email.receivedSigned}');
  print('Email was Encrypted: ${email.receivedEncrypted}');
  if (email.receivedSigned) {
    print('Signature(s) valid = ${email.signaturesValid}');
  }

  if (email.receivedEncrypted) {
    print('Decrypted successfully = ${email.decrypted}');
  }

  var i = 0;
  final numAttach = email.numAttachments;
  print('Number of attachments = $numAttach');

  while (i < numAttach) {
    print('---- Attachment $i');

    // Examine the filename (if any)
    print('filename: ${email.getAttachmentFilename(i)}');
    // Examine the content-ID (if any)
    print('Content-ID: ${email.getAttachmentContentID(i)}');
    // Examine the content-type
    print('Content-Type: ${email.getAttachmentContentType(i)}');
    // Examine the content-disposition
    print('Content-Disposition${email.getAttachmentHeader(i, 'content-disposition')}');
    // Examine the attachment size:
    print('Size (in bytes) of the attachment: ${email.getAttachmentSize(i)}');

    i++;
  }

  print('--');

  // Now for the related items.

  // Note: A MIME sub-part can potentially be both a related item AND an attachment.
  // The typical case is when the item is contained under the multipart/related enclosure and 
  // the item also has a "Content-Disposition" header indicating "attachment".
  // The location within multipart/related makes it a "related item", yet the Content-Disposition can also make it semantically an attachment.
  // Related items and attachments are not necessarily mutually exclusive.

  final numRelated = email.numRelatedItems;
  print('Number of related items = $numRelated');
  i = 0;
  while (i < numRelated) {
    print('---- Related Item $i');

    // Examine the filename (if any)
    print('filename: ${email.getRelatedFilename(i)}');
    // Examine the content-ID (if any)
    print('Content-ID: ${email.getRelatedContentID(i)}');
    // Examine the content-type
    print('Content-Type: ${email.getRelatedContentType(i)}');
    // Examine the content-location (if any)
    print('Content-Location${email.getRelatedContentLocation(i)}');

    i++;
  }

  // The email could also have attached messages.
  // An attached message is another email that was attached to this email.
  final em = CkEmail();
  final numAttachedMessages = email.numAttachedMessages;
  print('Number of attached messages = $numAttachedMessages');
  i = 0;
  while (i < numAttachedMessages) {
    print('---- Attached message $i');

    // Examine the attached email
    email.getAttachedEmail(i, em);
    print('from: ${em.from}');
    print('subject: ${em.subject}');
    i++;
  }

  // An email could also be a multipart/report email. 
  // This is a DSN (Delivery Status Notification)
  // The NumReports property indicates how many "reports" exist.
  final numReports = email.numReports;
  print('Number of reports = $numReports');
  i = 0;
  while (i < numReports) {
    print('---- Report $i');
    // Get the raw report data...
    print(email.getReport(i));
    i++;
  }

  // If the email is a multipart/report, then the information
  // from the message/delivery-status part of the email can be retrieved:
  if (email.isMultipartReport()) {

    print('--- Delivery Status Information:');
    print('Status: ${email.getDeliveryStatusInfo('Status')}');
    print('Action: ${email.getDeliveryStatusInfo('Action')}');
    print('Reporting-MTA: ${email.getDeliveryStatusInfo('Reporting-MTA')}');

    final jsonDsnInfo = CkJsonObject();
    email.getDsnInfo(jsonDsnInfo);
    jsonDsnInfo.emitCompact = false;
    print(jsonDsnInfo.emit());
  }
}