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

Lua
local chilkat = require("chilkat")

-- 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.
local mailman = chilkat.MailMan.new()

-- Set the POP3 server's hostname
mailman.mail_host = "pop.yourserver.com"

-- Set the POP3 login/password.
mailman.pop_username = "***"
mailman.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..
local bundle = chilkat.EmailBundle.new()
local keepOnServer = true
local headersOnly = false
-- Irrelevent because we are NOT downloading headers-only
local numBodyLines = 0
local success = mailman:fetch_all(keepOnServer, headersOnly, numBodyLines, bundle)
if not success then
    print(mailman.last_error_text)
    return
end

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

local email = chilkat.Email.new()
local bundleIndex = 0
local numMessages = bundle.message_count

while bundleIndex < numMessages do
    bundle:email_at(bundleIndex, email)

    -- Save all attachments to the specified directory.
    -- The directory is automatically created if it does not yet exist.
    success = email:save_all_attachments(dirPath)
    if not success then
        print(email.last_error_text)
        return
    end

    -- 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.overwrite_existing = false
    success = email:save_all_attachments(dirPath)
    if not success then
        print(email.last_error_text)
        return
    end

    local numAttachments = email.num_attachments
    local attachIndex = 0
    while attachIndex < numAttachments do
        -- If the attachment filename was changed to prevent overwriting,
        -- GetAttachmentFilename will return the new filename.
        print(email:get_attachment_filename(attachIndex))
        attachIndex = attachIndex + 1
    end

    -- Attachments can also be saved individually.
    attachIndex = 0
    while attachIndex < numAttachments do
        print("Original Filename: " .. email:get_attachment_filename(attachIndex))
        success = email:save_attached_file(attachIndex, dirPath)
        if not success then
            print(email.last_error_text)
            return
        end

        -- 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:get_attachment_filename(attachIndex))
        attachIndex = attachIndex + 1
    end

    bundleIndex = bundleIndex + 1
end