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

Xbase++
LOCAL nSuccess
LOCAL oMailman
LOCAL oBundle
LOCAL nKeepOnServer
LOCAL nHeadersOnly
LOCAL nNumBodyLines
LOCAL cDirPath
LOCAL oEmail
LOCAL nBundleIndex
LOCAL nNumMessages
LOCAL nNumAttachments
LOCAL nAttachIndex

nSuccess := 0

//  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.
oMailman := CreateObject("Chilkat.MailMan")

//  Set the POP3 server's hostname
oMailman:MailHost := "pop.yourserver.com"

//  Set the POP3 login/password.
oMailman:PopUsername := "***"
oMailman: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..
oBundle := CreateObject("Chilkat.EmailBundle")
nKeepOnServer := 1
nHeadersOnly := 0
//  Irrelevent because we are NOT downloading headers-only
nNumBodyLines := 0
nSuccess := oMailman:FetchAll(nKeepOnServer, nHeadersOnly, nNumBodyLines, oBundle)
IF (nSuccess == 0)
    ? oMailman:LastErrorText
    oMailman:destroy()
    oBundle:destroy()
    RETURN
ENDIF

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

oEmail := CreateObject("Chilkat.Email")
nBundleIndex := 0
nNumMessages := oBundle:MessageCount

DO WHILE (nBundleIndex < nNumMessages)
    oBundle:EmailAt(nBundleIndex, oEmail)

    //  Save all attachments to the specified directory.
    //  The directory is automatically created if it does not yet exist.
    nSuccess := oEmail:SaveAllAttachments(cDirPath)
    IF (nSuccess == 0)
        ? oEmail:LastErrorText
        oMailman:destroy()
        oBundle:destroy()
        oEmail:destroy()
        RETURN
    ENDIF

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

    //  Setting OverwriteExisting = 0 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...
    oEmail:OverwriteExisting := 0
    nSuccess := oEmail:SaveAllAttachments(cDirPath)
    IF (nSuccess == 0)
        ? oEmail:LastErrorText
        oMailman:destroy()
        oBundle:destroy()
        oEmail:destroy()
        RETURN
    ENDIF

    nNumAttachments := oEmail:NumAttachments
    nAttachIndex := 0
    DO WHILE (nAttachIndex < nNumAttachments)
        //  If the attachment filename was changed to prevent overwriting,
        //  GetAttachmentFilename will return the new filename.
        ? oEmail:GetAttachmentFilename(nAttachIndex)
        nAttachIndex := nAttachIndex + 1
    ENDDO

    //  Attachments can also be saved individually.
    nAttachIndex := 0
    DO WHILE (nAttachIndex < nNumAttachments)

        ? "Original Filename: " + oEmail:GetAttachmentFilename(nAttachIndex)
        nSuccess := oEmail:SaveAttachedFile(nAttachIndex, cDirPath)
        IF (nSuccess == 0)
            ? oEmail:LastErrorText
            oMailman:destroy()
            oBundle:destroy()
            oEmail:destroy()
            RETURN
        ENDIF

        //  If OverwriteExisting = 1, 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.
        ? "Saved Filename: " + oEmail:GetAttachmentFilename(nAttachIndex)
        nAttachIndex := nAttachIndex + 1
    ENDDO

    nBundleIndex := nBundleIndex + 1
ENDDO

oMailman:destroy()
oBundle:destroy()
oEmail:destroy()