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

Download and Save Email Attachments (POP3)

See more POP3 Examples

Downloads emails from a POP3 mailbox and saves all attachments.

Chilkat Dart Downloads

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

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

  // The mailman object is used for receiving (POP3) 
  // and sending (SMTP) email.
  final mailman = CkMailMan();

  // Set the POP3 server's hostname
  mailman.mailHost = 'pop.yourserver.com';

  // Set the POP3 login/password.
  mailman.popUsername = '***';
  mailman.popPassword = '***';

  // Copy the all email from the user's POP3 mailbox 
  // into a bundle object.  The email remains on the server.
  // FetchAll is a reasonable choice for POP3 maildrops that don't have too many
  // emails. For larger mail drops, one might download emails one at a time..
  final bundle = CkEmailBundle();
  final keepOnServer = true;
  final headersOnly = false;
  // Irrelevent because we are NOT downloading headers-only
  final numBodyLines = 0;
  try {
    mailman.fetchAll(keepOnServer, headersOnly, numBodyLines, bundle);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // The directory path can be relative or absolute.
  // This shows a Windows style directory path.  On other operating systems, the path
  // would be different..
  final dirPath = 'c:/myAttachments';

  final email = CkEmail();
  var bundleIndex = 0;
  final numMessages = bundle.messageCount;

  while (bundleIndex < numMessages) {
    bundle.emailAt(bundleIndex, email);

    // Save all attachments to the specified directory.
    // The directory is automatically created if it does not yet exist.
    try {
      email.saveAllAttachments(dirPath);
    } on ChilkatException catch (e) {
      print(e.lastErrorText);
      return;
    }

    // The OverwriteExisting property controls whether already-existing files
    // are automatically overwritten.  By default, it is set to true so that existing
    // files will be overwritten.

    // Setting OverwriteExisting = false will cause the attachment-saving methods to generate
    // unique filenames if a file with the same name already exists.  The actual filename(s)
    // saved will be present by calling GetAttachmentFilename for each attachment *after*
    // saving.
    // For example...
    email.overwriteExisting = false;
    try {
      email.saveAllAttachments(dirPath);
    } on ChilkatException catch (e) {
      print(e.lastErrorText);
      return;
    }

    final numAttachments = email.numAttachments;
    var attachIndex = 0;
    while (attachIndex < numAttachments) {
      // If the attachment filename was changed to prevent overwriting,
      // GetAttachmentFilename will return the new filename.
      print(email.getAttachmentFilename(attachIndex));
      attachIndex++;
    }

    // Attachments can also be saved individually.
    attachIndex = 0;
    while (attachIndex < numAttachments) {

      print('Original Filename: ${email.getAttachmentFilename(attachIndex)}');
      try {
        email.saveAttachedFile(attachIndex, dirPath);
      } on ChilkatException catch (e) {
        print(e.lastErrorText);
        return;
      }

      // If OverwriteExisting = true, the saved filename will always equal the original filename,
      // unless there are characters present in the filename that are not allowed by Windows,
      // such as * ? < > | etc.  In those cases the illegal characters are either removed or replaced
      // with underscore characters to allow the file to be saved.
      print('Saved Filename: ${email.getAttachmentFilename(attachIndex)}');
      attachIndex++;
    }

    bundleIndex++;
  }
}