Sample code for 30+ languages & platforms
Rust 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 Rust Downloads

Rust

// 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.
let mailman = chilkat::MailMan::new();

// Set the POP3 server's hostname
mailman.set_mail_host("pop.yourserver.com");

// Set the POP3 login/password.
mailman.set_pop_username("***");
mailman.set_pop_password("***");

// 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..
let bundle = chilkat::EmailBundle::new();
let keep_on_server = true;
let headers_only = false;
// Irrelevent because we are NOT downloading headers-only
let num_body_lines = 0;
if mailman.fetch_all(keep_on_server, headers_only, num_body_lines, &bundle).is_err() {
    println!("{}", mailman.last_error_text());
    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..
let dir_path = "c:/myAttachments".to_string();

let email = chilkat::Email::new();
let mut bundle_index = 0;
let num_messages = bundle.message_count();

while bundle_index < num_messages {
    let _ = bundle.email_at(bundle_index, &email);

    // Save all attachments to the specified directory.
    // The directory is automatically created if it does not yet exist.
    if email.save_all_attachments(&dir_path).is_err() {
        println!("{}", email.last_error_text());
        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.set_overwrite_existing(false);
    if email.save_all_attachments(&dir_path).is_err() {
        println!("{}", email.last_error_text());
        return;
    }

    let num_attachments = email.num_attachments();
    let mut attach_index = 0;
    while attach_index < num_attachments {
        // If the attachment filename was changed to prevent overwriting,
        // GetAttachmentFilename will return the new filename.
        println!("{}", email.get_attachment_filename(attach_index).unwrap_or_default());
        attach_index = attach_index + 1;
    }

    // Attachments can also be saved individually.
    attach_index = 0;
    while attach_index < num_attachments {

        println!("Original Filename: {}", email.get_attachment_filename(attach_index).unwrap_or_default());
        if email.save_attached_file(attach_index, &dir_path).is_err() {
            println!("{}", email.last_error_text());
            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.
        println!("Saved Filename: {}", email.get_attachment_filename(attach_index).unwrap_or_default());
        attach_index = attach_index + 1;
    }

    bundle_index = bundle_index + 1;
}