Sample code for 30+ languages & platforms
SQL Server

IMAP Copy Email from Selected Folder to Another Folder

Copies an email from the selected mailbox (folder) to another mailbox (folder).

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
    DECLARE @iTmp1 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 requires the Chilkat API to have been previously unlocked.
    -- See Global Unlock Sample for sample code.

    -- This example copies an email from one mailbox to another.
    DECLARE @imap int
    EXEC @hr = sp_OACreate 'Chilkat.Imap', @imap OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    -- Turn on session logging for debugging.
    EXEC sp_OASetProperty @imap, 'KeepSessionLog', 1

    -- Connect using 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

    -- Authenticate
    EXEC sp_OAMethod @imap, 'Login', @success OUT, 'email_account_login', 'email_account_password'
    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

    -- Search for messages having "Test email" in the subject.
    DECLARE @fetchUids int
    SELECT @fetchUids = 1
    DECLARE @criteria nvarchar(4000)
    SELECT @criteria = 'SUBJECT "Test email"'
    DECLARE @messageSet int
    EXEC @hr = sp_OACreate 'Chilkat.MessageSet', @messageSet OUT

    EXEC sp_OAMethod @imap, 'QueryMbx', @success OUT, @criteria, @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

    -- Assuming we have 1 or more messages in the set, copy the 1st one to the folder "Inbox.testFolder"
    EXEC sp_OAGetProperty @messageSet, 'Count', @iTmp0 OUT
    IF @iTmp0 > 0
      BEGIN
        EXEC sp_OAMethod @messageSet, 'GetId', @iTmp0 OUT, 0
        EXEC sp_OAGetProperty @messageSet, 'HasUids', @iTmp1 OUT
        EXEC sp_OAMethod @imap, 'Copy', @success OUT, @iTmp0, @iTmp1, 'Inbox/testFolder'
        IF @success <> 1
          BEGIN
            EXEC sp_OAGetProperty @imap, 'LastErrorText', @sTmp0 OUT
            PRINT @sTmp0
          END
      END

    EXEC sp_OAGetProperty @imap, 'SessionLog', @sTmp0 OUT
    PRINT @sTmp0


    PRINT 'OK'

    -- Sample sessiong log:

    -- ----INFO----
    -- Connecting to IMAP server at outlook.office365.com:993
    -- ----IMAP RESPONSE----
    -- * OK The Microsoft Exchange IMAP4 service is ready. [QgBMADAAUABSADAAMQAwADIAQwBBADAAMAA3ADAALgBwAHIAbwBkAC4AZQB4AGMAaABhAG4AZwBlAGwAYQBiAHMALgBjAG8AbQA=]
    -- ----IMAP REQUEST----
    -- aaab LOGIN "chilkat@live.com"
    -- ----IMAP RESPONSE----
    -- aaab OK LOGIN completed.
    -- ----IMAP REQUEST----
    -- aaac SELECT "Inbox"
    -- ----IMAP RESPONSE----
    -- * 28 EXISTS
    -- * 0 RECENT
    -- * FLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)
    -- * OK [PERMANENTFLAGS (\Seen \Answered \Flagged \Deleted \Draft $MDNSent)] Permanent flags
    -- * OK [UNSEEN 23] Is the first unseen message
    -- * OK [UIDVALIDITY 14] UIDVALIDITY value
    -- * OK [UIDNEXT 6416] The next unique identifier value
    -- aaac OK [READ-WRITE] SELECT completed.
    -- ----IMAP REQUEST----
    -- aaad UID SEARCH SUBJECT "Test email"
    -- ----IMAP RESPONSE----
    -- * SEARCH 6414
    -- aaad OK SEARCH completed.
    -- ----IMAP REQUEST----
    -- aaae UID COPY 6414 "Inbox/testFolder"
    -- ----IMAP RESPONSE----
    -- aaae OK [COPYUID 180 6414 1] COPY completed.
    -- 
    -- OK

    EXEC @hr = sp_OADestroy @imap
    EXEC @hr = sp_OADestroy @messageSet


END
GO