Sample code for 30+ languages & platforms
SQL Server

Iterate MIME Parts of an Email

See more Email Object Examples

Demonstrates how to iterate over the MIME sub-parts of an email, and retrieve the content of each MIME sub-part body.

Note: This example requires some new features added to Chilkat v9.5.0.95.

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
    DECLARE @iTmp0 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.

    -- See the following Chilkat post to Quickly Understand Email MIME

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

    EXEC sp_OAMethod @email, 'LoadEml', @success OUT, 'qa_data/eml/sample.eml'
    IF @success = 0
      BEGIN

        PRINT 'Failed to load .eml'
        EXEC @hr = sp_OADestroy @email
        RETURN
      END

    DECLARE @sbContentType int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbContentType OUT

    DECLARE @caseSensitive int
    SELECT @caseSensitive = 0

    -- Get the total number of non-multipart MIME sub-parts.
    -- (This is a simple way of iterating over all the MIME leaf parts regardless of the MIME tree structure)
    DECLARE @inlineOnly int
    SELECT @inlineOnly = 0
    DECLARE @excludeAttachments int
    SELECT @excludeAttachments = 0
    DECLARE @searchSpec nvarchar(4000)
    SELECT @searchSpec = '*/*'

    DECLARE @numParts int
    EXEC sp_OAMethod @email, 'GetNumPartsOfType', @numParts OUT, @searchSpec, @inlineOnly, @excludeAttachments
    DECLARE @i int
    SELECT @i = 0
    WHILE @i < @numParts
      BEGIN
        -- What is the Content-Type of this MIME part?
        EXEC sp_OAMethod @email, 'GetNthContentType', @sTmp0 OUT, @i, @searchSpec, @inlineOnly, @excludeAttachments
        EXEC sp_OAMethod @sbContentType, 'Append', @success OUT, @sTmp0
        EXEC sp_OAMethod @sbContentType, 'StartsWith', @iTmp0 OUT, 'text/', @caseSensitive
        IF @iTmp0 = 1
          BEGIN
            -- Get the text body of this MIME part.
            DECLARE @textBody nvarchar(4000)
            EXEC sp_OAMethod @email, 'GetNthTextPartOfType', @textBody OUT, @i, @searchSpec, @inlineOnly, @excludeAttachments

            EXEC sp_OAMethod @sbContentType, 'GetAsString', @sTmp0 OUT
            PRINT 'Got text body for ' + @sTmp0
          END
        ELSE
          BEGIN
            EXEC sp_OAMethod @sbContentType, 'ContentsEqual', @iTmp0 OUT, 'message/rfc822', @caseSensitive
            IF @iTmp0 = 1
              BEGIN
                -- If the Content-Type is message/rfc822, then the MIME body for this part contains a full embedded MIME messages.
                -- Your application could load it into a Chilkat email object and recursively process...
                DECLARE @attachedEmail int
                EXEC @hr = sp_OACreate 'Chilkat.Email', @attachedEmail OUT

                DECLARE @bdMime int
                EXEC @hr = sp_OACreate 'Chilkat.BinData', @bdMime OUT

                EXEC sp_OAMethod @email, 'GetNthBinaryPartOfTypeBd', @success OUT, @i, @searchSpec, @inlineOnly, @excludeAttachments, @bdMime
                EXEC sp_OAMethod @attachedEmail, 'SetFromMimeBd', @success OUT, @bdMime
                -- Now your app can recursively process the attachedEmail...
              END
            ELSE
              BEGIN
                -- Get the bytes of this MIME body part.
                DECLARE @bd int
                EXEC @hr = sp_OACreate 'Chilkat.BinData', @bd OUT

                EXEC sp_OAMethod @email, 'GetNthBinaryPartOfTypeBd', @success OUT, @i, @searchSpec, @inlineOnly, @excludeAttachments, @bd

                EXEC sp_OAMethod @sbContentType, 'GetAsString', @sTmp0 OUT

                EXEC sp_OAGetProperty @bd, 'NumBytes', @iTmp0 OUT
                PRINT 'Got binary body for ' + @sTmp0 + ' numBytes = ' + @iTmp0
              END
          END
        EXEC sp_OAMethod @sbContentType, 'Clear', NULL
        SELECT @i = @i + 1
      END

    EXEC @hr = sp_OADestroy @email
    EXEC @hr = sp_OADestroy @sbContentType
    EXEC @hr = sp_OADestroy @attachedEmail
    EXEC @hr = sp_OADestroy @bdMime
    EXEC @hr = sp_OADestroy @bd


END
GO