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

Imap.GetMailSize vs Email.Size

Shows how to get the total size of an email, as well as the sizes of the attachments. This can be done when either full-emails or headers-only are downloaded.

Chilkat SQL Server Downloads

SQL Server
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    DECLARE @iTmp0 int
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @sTmp1 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.

    DECLARE @imap int
    EXEC @hr = sp_OACreate 'Chilkat.Imap', @imap OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    --  Connect to an IMAP server.
    --  Use TLS
    EXEC sp_OASetProperty @imap, 'Ssl', 1
    EXEC sp_OASetProperty @imap, 'Port', 993
    EXEC sp_OAMethod @imap, 'Connect', @success OUT, 'imap.example.com'
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @imap, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @imap
        RETURN
      END

    --  Login
    EXEC sp_OAMethod @imap, 'Login', @success OUT, '****', '****'
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @imap, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @imap
        RETURN
      END

    --  Select an IMAP mailbox
    EXEC sp_OAMethod @imap, 'SelectMailbox', @success OUT, 'Inbox'
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @imap, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @imap
        RETURN
      END

    --  Get the message IDs of all the emails in the mailbox
    --  We can choose to fetch UIDs or sequence numbers.
    DECLARE @fetchUids int
    SELECT @fetchUids = 1
    DECLARE @messageSet int
    EXEC @hr = sp_OACreate 'Chilkat.MessageSet', @messageSet OUT

    EXEC sp_OAMethod @imap, 'QueryMbx', @success OUT, 'ALL', @fetchUids, @messageSet
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @imap, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @imap
        EXEC @hr = sp_OADestroy @messageSet
        RETURN
      END

    --  When downloading headers, each email object contains
    --  (obviously) the headers, but the body will be missing.
    --  Attachments will not be included.  However, it is
    --  possible to get information about the attachments
    --  as well as the complete size of the email.
    DECLARE @bundle int
    EXEC @hr = sp_OACreate 'Chilkat.EmailBundle', @bundle OUT

    DECLARE @headersOnly int
    SELECT @headersOnly = 1
    EXEC sp_OAMethod @imap, 'FetchMsgSet', @success OUT, @headersOnly, @messageSet, @bundle
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @imap, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @imap
        EXEC @hr = sp_OADestroy @messageSet
        EXEC @hr = sp_OADestroy @bundle
        RETURN
      END

    --  Loop over the email objects and display information about each:
    DECLARE @email int
    EXEC @hr = sp_OACreate 'Chilkat.Email', @email OUT

    DECLARE @i int
    SELECT @i = 0
    DECLARE @j int
    SELECT @j = 0
    DECLARE @numEmails int
    EXEC sp_OAGetProperty @bundle, 'MessageCount', @numEmails OUT
    WHILE @i < @numEmails
      BEGIN
        EXEC sp_OAMethod @bundle, 'EmailAt', @success OUT, @i, @email

        --  Display the From and Subject
        EXEC sp_OAGetProperty @email, 'From', @sTmp0 OUT
        PRINT @sTmp0
        EXEC sp_OAGetProperty @email, 'Subject', @sTmp0 OUT
        PRINT @sTmp0

        --  Display the recipients:
        SELECT @j = 0
        EXEC sp_OAGetProperty @email, 'NumTo', @iTmp0 OUT
        WHILE @j < @iTmp0
          BEGIN

            EXEC sp_OAMethod @email, 'GetToName', @sTmp0 OUT, @j

            EXEC sp_OAMethod @email, 'GetToAddr', @sTmp1 OUT, @j
            PRINT 'TO: ' + @sTmp0 + ', ' + @sTmp1
            SELECT @j = @j + 1
          END
        SELECT @j = 0
        EXEC sp_OAGetProperty @email, 'NumCC', @iTmp0 OUT
        WHILE @j < @iTmp0
          BEGIN

            EXEC sp_OAMethod @email, 'GetCcName', @sTmp0 OUT, @j

            EXEC sp_OAMethod @email, 'GetCcAddr', @sTmp1 OUT, @j
            PRINT 'CC: ' + @sTmp0 + ', ' + @sTmp1
            SELECT @j = @j + 1
          END

        --  Show the total size of the email, including body and attachments:
        EXEC sp_OAGetProperty @email, 'Size', @iTmp0 OUT
        PRINT @iTmp0

        --  When a full email is downloaded, we would use the
        --  email.NumAttachments property in conjunction with the
        --  email.GetMailAttach* methods.
        --  However, when an email object contains only the header,
        --  we need to access the attachment info differently:
        DECLARE @numAttach int
        EXEC sp_OAMethod @imap, 'GetMailNumAttach', @numAttach OUT, @email
        SELECT @j = 0
        WHILE @j < @numAttach
          BEGIN
            EXEC sp_OAMethod @imap, 'GetMailAttachFilename', @sTmp0 OUT, @email, @j
            PRINT @sTmp0
            DECLARE @attachSize int
            EXEC sp_OAMethod @imap, 'GetMailAttachSize', @attachSize OUT, @email, @j


            PRINT '    size = ' + @attachSize + ' bytes'
            SELECT @j = @j + 1
          END


        PRINT '--'

        SELECT @i = @i + 1
      END

    --  Disconnect from the IMAP server.
    EXEC sp_OAMethod @imap, 'Disconnect', @success OUT

    EXEC @hr = sp_OADestroy @imap
    EXEC @hr = sp_OADestroy @messageSet
    EXEC @hr = sp_OADestroy @bundle
    EXEC @hr = sp_OADestroy @email


END
GO