Sample code for 30+ languages & platforms
SQL Server

Download and Save Email Attachments (POP3)

See more POP3 Examples

Downloads emails from a POP3 mailbox and saves all attachments.

Chilkat SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    -- Important: Do not use nvarchar(max).  See the warning about using nvarchar(max).
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 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.
    DECLARE @mailman int
    EXEC @hr = sp_OACreate 'Chilkat.MailMan', @mailman OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    -- Set the POP3 server's hostname
    EXEC sp_OASetProperty @mailman, 'MailHost', 'pop.yourserver.com'

    -- Set the POP3 login/password.
    EXEC sp_OASetProperty @mailman, 'PopUsername', '***'
    EXEC sp_OASetProperty @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..
    DECLARE @bundle int
    EXEC @hr = sp_OACreate 'Chilkat.EmailBundle', @bundle OUT

    DECLARE @keepOnServer int
    SELECT @keepOnServer = 1
    DECLARE @headersOnly int
    SELECT @headersOnly = 0
    -- Irrelevent because we are NOT downloading headers-only
    DECLARE @numBodyLines int
    SELECT @numBodyLines = 0
    EXEC sp_OAMethod @mailman, 'FetchAll', @success OUT, @keepOnServer, @headersOnly, @numBodyLines, @bundle
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @mailman, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @mailman
        EXEC @hr = sp_OADestroy @bundle
        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..
    DECLARE @dirPath nvarchar(4000)
    SELECT @dirPath = 'c:/myAttachments'

    DECLARE @email int
    EXEC @hr = sp_OACreate 'Chilkat.Email', @email OUT

    DECLARE @bundleIndex int
    SELECT @bundleIndex = 0
    DECLARE @numMessages int
    EXEC sp_OAGetProperty @bundle, 'MessageCount', @numMessages OUT

    WHILE (@bundleIndex < @numMessages)
      BEGIN
        EXEC sp_OAMethod @bundle, 'EmailAt', @success OUT, @bundleIndex, @email

        -- Save all attachments to the specified directory.
        -- The directory is automatically created if it does not yet exist.
        EXEC sp_OAMethod @email, 'SaveAllAttachments', @success OUT, @dirPath
        IF @success = 0
          BEGIN
            EXEC sp_OAGetProperty @email, 'LastErrorText', @sTmp0 OUT
            PRINT @sTmp0
            EXEC @hr = sp_OADestroy @mailman
            EXEC @hr = sp_OADestroy @bundle
            EXEC @hr = sp_OADestroy @email
            RETURN
          END

        -- 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...
        EXEC sp_OASetProperty @email, 'OverwriteExisting', 0
        EXEC sp_OAMethod @email, 'SaveAllAttachments', @success OUT, @dirPath
        IF @success = 0
          BEGIN
            EXEC sp_OAGetProperty @email, 'LastErrorText', @sTmp0 OUT
            PRINT @sTmp0
            EXEC @hr = sp_OADestroy @mailman
            EXEC @hr = sp_OADestroy @bundle
            EXEC @hr = sp_OADestroy @email
            RETURN
          END

        DECLARE @numAttachments int
        EXEC sp_OAGetProperty @email, 'NumAttachments', @numAttachments OUT
        DECLARE @attachIndex int
        SELECT @attachIndex = 0
        WHILE (@attachIndex < @numAttachments)
          BEGIN
            -- If the attachment filename was changed to prevent overwriting,
            -- GetAttachmentFilename will return the new filename.
            EXEC sp_OAMethod @email, 'GetAttachmentFilename', @sTmp0 OUT, @attachIndex
            PRINT @sTmp0
            SELECT @attachIndex = @attachIndex + 1
          END

        -- Attachments can also be saved individually.
        SELECT @attachIndex = 0
        WHILE (@attachIndex < @numAttachments)
          BEGIN


            EXEC sp_OAMethod @email, 'GetAttachmentFilename', @sTmp0 OUT, @attachIndex
            PRINT 'Original Filename: ' + @sTmp0
            EXEC sp_OAMethod @email, 'SaveAttachedFile', @success OUT, @attachIndex, @dirPath
            IF @success = 0
              BEGIN
                EXEC sp_OAGetProperty @email, 'LastErrorText', @sTmp0 OUT
                PRINT @sTmp0
                EXEC @hr = sp_OADestroy @mailman
                EXEC @hr = sp_OADestroy @bundle
                EXEC @hr = sp_OADestroy @email
                RETURN
              END

            -- 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.

            EXEC sp_OAMethod @email, 'GetAttachmentFilename', @sTmp0 OUT, @attachIndex
            PRINT 'Saved Filename: ' + @sTmp0
            SELECT @attachIndex = @attachIndex + 1
          END

        SELECT @bundleIndex = @bundleIndex + 1
      END

    EXEC @hr = sp_OADestroy @mailman
    EXEC @hr = sp_OADestroy @bundle
    EXEC @hr = sp_OADestroy @email


END
GO