Sample code for 30+ languages & platforms
SQL Server

Outlook -- Move Messages from One Folder to Another

See more Outlook Examples

Demonstrates how to move messages from one folder to another.

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

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

    -- Use your previously obtained access token here:
    EXEC sp_OASetProperty @http, 'AuthToken', 'MICROSOFT_GRAPH_ACCESS_TOKEN'

    -- This example will move some messages from /Inbox to /Inbox/abc/subFolderB
    -- We'll need the folder ids for both source and destination folders..

    -- Get the folder IDs from the folder map created by this example 
    DECLARE @htFolderMap int
    EXEC @hr = sp_OACreate 'Chilkat.Hashtable', @htFolderMap OUT

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

    EXEC sp_OAMethod @sbMap, 'LoadFile', @success OUT, 'qa_data/outlook/folderMap.xml', 'utf-8'
    EXEC sp_OAMethod @htFolderMap, 'AddFromXmlSb', @success OUT, @sbMap

    -- Get the IDs for the source and destination folders.
    DECLARE @srcFolderId nvarchar(4000)
    EXEC sp_OAMethod @htFolderMap, 'LookupStr', @srcFolderId OUT, '/Inbox'
    EXEC sp_OAGetProperty @htFolderMap, 'LastMethodSuccess', @iTmp0 OUT
    IF @iTmp0 <> 1
      BEGIN

        PRINT 'Folder ID not found'
        EXEC @hr = sp_OADestroy @http
        EXEC @hr = sp_OADestroy @htFolderMap
        EXEC @hr = sp_OADestroy @sbMap
        RETURN
      END
    DECLARE @dstFolderId nvarchar(4000)
    EXEC sp_OAMethod @htFolderMap, 'LookupStr', @dstFolderId OUT, '/Inbox/abc/subFolderB'
    EXEC sp_OAGetProperty @htFolderMap, 'LastMethodSuccess', @iTmp0 OUT
    IF @iTmp0 <> 1
      BEGIN

        PRINT 'Folder ID not found'
        EXEC @hr = sp_OADestroy @http
        EXEC @hr = sp_OADestroy @htFolderMap
        EXEC @hr = sp_OADestroy @sbMap
        RETURN
      END

    SELECT @success = 1
    DECLARE @json int
    EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT

    EXEC sp_OASetProperty @json, 'EmitCompact', 0

    -- Search for emails in this folder with the words "sample" or "example" in the subject, and return only the id and subject.
    EXEC sp_OAMethod @http, 'SetUrlVar', @success OUT, 'folder_id', @srcFolderId
    EXEC sp_OAMethod @http, 'SetUrlVar', @success OUT, 'select', 'id,subject'
    EXEC sp_OAMethod @http, 'SetUrlVar', @success OUT, 'filter', 'contains(subject,''sample'') or contains(subject,''example'')'

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

    EXEC sp_OAMethod @http, 'QuickGetSb', @success OUT, 'https://graph.microsoft.com/v1.0/me/mailFolders/{$folder_id}/messages?$filter={$filter}&$select={$select}', @sbResponse
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @http, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @http
        EXEC @hr = sp_OADestroy @htFolderMap
        EXEC @hr = sp_OADestroy @sbMap
        EXEC @hr = sp_OADestroy @json
        EXEC @hr = sp_OADestroy @sbResponse
        RETURN
      END

    EXEC sp_OAMethod @json, 'LoadSb', @success OUT, @sbResponse
    -- Show the results..
    EXEC sp_OAMethod @json, 'Emit', @sTmp0 OUT
    PRINT @sTmp0

    -- Sample results:

    -- 	{
    -- 	  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('me')/mailFolders('AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA')/messages(id,subject)",
    -- 	  "value": [
    -- 	    {
    -- 	      "@odata.etag": "W/\"CQAAABYAAADn68XtMop0TpsYJGpfKXY9AADOpwfr\"",
    -- 	      "id": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA5_vF7TKKdE6bGCRqXyl2PQAAAM6Jj10AAAA=",
    -- 	      "subject": "A sample email with Amazon in the body"
    -- 	    },
    -- 	    {
    -- 	      "@odata.etag": "W/\"CQAAABYAAADn68XtMop0TpsYJGpfKXY9AADOpwfo\"",
    -- 	      "id": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA5_vF7TKKdE6bGCRqXyl2PQAAAM6Jj1oAAAA=",
    -- 	      "subject": "This is an example email from chilkat.io"
    -- 	    }
    -- 	  ]
    -- 	}

    -- ------------
    -- Proceed to move (copy) each of the above emails to the destination folder.
    DECLARE @jsonRequestBody int
    EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @jsonRequestBody OUT

    DECLARE @jsonResponse int
    EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @jsonResponse OUT

    EXEC sp_OASetProperty @jsonResponse, 'EmitCompact', 0

    DECLARE @messageId nvarchar(4000)

    DECLARE @i int
    SELECT @i = 0
    DECLARE @numEmails int
    EXEC sp_OAMethod @json, 'SizeOfArray', @numEmails OUT, 'value'
    WHILE @i < @numEmails
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i

        EXEC sp_OAMethod @json, 'StringOf', @messageId OUT, 'value[i].id'
        EXEC sp_OAMethod @http, 'SetUrlVar', @success OUT, 'message_id', @messageId

        -- Create a JSON request body with this content:
        -- 
        -- 		{
        -- 		  "DestinationId": "destinationId-value"
        -- 		}
        -- 
        EXEC sp_OAMethod @htFolderMap, 'LookupStr', @dstFolderId OUT, '/Inbox/abc/subFolderB'
        EXEC sp_OAMethod @jsonRequestBody, 'UpdateString', @success OUT, 'DestinationId', @dstFolderId

        PRINT 'Moving ' + @messageId

        -- Move the message to the destination folder
        DECLARE @resp int
        EXEC @hr = sp_OACreate 'Chilkat.HttpResponse', @resp OUT

        EXEC sp_OAMethod @http, 'HttpJson', @success OUT, 'POST', 'https://graph.microsoft.com/v1.0/me/messages/{$message_id}/move', @jsonRequestBody, 'application/json', @resp
        IF @success = 0
          BEGIN
            EXEC sp_OAGetProperty @http, 'LastErrorText', @sTmp0 OUT
            PRINT @sTmp0
            EXEC @hr = sp_OADestroy @http
            EXEC @hr = sp_OADestroy @htFolderMap
            EXEC @hr = sp_OADestroy @sbMap
            EXEC @hr = sp_OADestroy @json
            EXEC @hr = sp_OADestroy @sbResponse
            EXEC @hr = sp_OADestroy @jsonRequestBody
            EXEC @hr = sp_OADestroy @jsonResponse
            EXEC @hr = sp_OADestroy @resp
            RETURN
          END

        -- A 200 response indicates success.
        EXEC sp_OAGetProperty @http, 'LastStatus', @iTmp0 OUT
        IF @iTmp0 = 200
          BEGIN

            PRINT 'Message moved.'
          END
        ELSE
          BEGIN

            EXEC sp_OAGetProperty @resp, 'StatusCode', @iTmp0 OUT
            PRINT 'Response status code = ' + @iTmp0

            PRINT 'Error: Message not moved.'
          END

        -- Show the response in both cases..
        EXEC sp_OAGetProperty @resp, 'BodyStr', @sTmp0 OUT
        EXEC sp_OAMethod @jsonResponse, 'Load', @success OUT, @sTmp0
        EXEC sp_OAMethod @jsonResponse, 'Emit', @sTmp0 OUT
        PRINT @sTmp0

        SELECT @i = @i + 1
      END

    -- ---------------------------------------------------
    -- Sample output:

    -- Moving AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA5_vF7TKKdE6bGCRqXyl2PQAAAM6Jj2EAAAA=
    -- Message moved.
    -- {
    --   "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#message",
    --   "@odata.type": "#microsoft.graph.message",
    --   "@odata.etag": "W/\"CQAAABYAAADn68XtMop0TpsYJGpfKXY9AADOp08j\"",
    --   "id": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwMAAADn68XtMop0TpsYJGpfKXY9AAAAzomk2wAAAA==",
    --   "createdDateTime": "2017-05-30T23:39:35Z",
    --   "lastModifiedDateTime": "2017-05-31T23:17:59Z",
    --   "changeKey": "CQAAABYAAADn68XtMop0TpsYJGpfKXY9AADOp08j",
    --   "categories": [
    --   ],
    --   "receivedDateTime": "2017-05-30T23:39:35Z",
    --   "sentDateTime": "2017-05-30T23:39:18Z",
    --   "hasAttachments": false,
    --   "internetMessageId": "<4aea73c1-2b29-f550-e6f1-eb22785a56f0@chilkatsoft.com>",
    --   "subject": "A sample email with Amazon in the body",
    --   "bodyPreview": "This email has the keyword Amazon in the body..",
    --   "importance": "normal",
    --   "parentFolderId": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwMAAAA=",
    --   "conversationId": "AQQkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAQADxkIFlCV-RFitsiVnh2MsI=",
    --   "isDeliveryReceiptRequested": null,
    --   "isReadReceiptRequested": false,
    --   "isRead": false,
    --   "isDraft": false,
    --   "webLink": "https://outlook.live.com/owa/?ItemID=AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5%2BvF7TKKdE6bGCRqXyl2PQAAAL8huwMAAADn68XtMop0TpsYJGpfKXY9AAAAzomk2wAAAA%3D%3D&exvsurl=1&viewmodel=ReadMessageItem",
    --   "inferenceClassification": "focused",
    --   "body": {
    --     "contentType": "html",
    --     "content": "<html>...</html>\r\n"
    --   },
    --   "sender": {
    --     "emailAddress": {
    --       "name": "Chilkat Software",
    --       "address": "support@chilkatsoft.com"
    --     }
    --   },
    --   "from": {
    --     "emailAddress": {
    --       "name": "Chilkat Software",
    --       "address": "support@chilkatsoft.com"
    --     }
    --   },
    --   "toRecipients": [
    --     {
    --       "emailAddress": {
    --         "name": "Chilkat Software",
    --         "address": "chilkatsoft@outlook.com"
    --       }
    --     }
    --   ],
    --   "ccRecipients": [
    --   ],
    --   "bccRecipients": [
    --   ],
    --   "replyTo": [
    --   ]
    -- }
    -- 
    -- Moving AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA5_vF7TKKdE6bGCRqXyl2PQAAAM6Jj2IAAAA=
    -- Message moved.
    -- {
    --   "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#message",
    --   "@odata.type": "#microsoft.graph.message",
    --   "@odata.etag": "W/\"CQAAABYAAADn68XtMop0TpsYJGpfKXY9AADOp08k\"",
    --   "id": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwMAAADn68XtMop0TpsYJGpfKXY9AAAAzomk3AAAAA==",
    --   "createdDateTime": "2017-05-30T21:07:18Z",
    --   "lastModifiedDateTime": "2017-05-31T23:17:59Z",
    --   "changeKey": "CQAAABYAAADn68XtMop0TpsYJGpfKXY9AADOp08k",
    --   "categories": [
    --   ],
    --   "receivedDateTime": "2017-05-30T21:07:18Z",
    --   "sentDateTime": "2017-05-30T21:06:56Z",
    --   "hasAttachments": false,
    --   "internetMessageId": "<31fbbbce-2c70-c8d1-f0bd-35a7c7694a99@chilkat.io>",
    --   "subject": "This is an example email from chilkat.io",
    --   "bodyPreview": "This is an example email from chilkat.io",
    --   "importance": "normal",
    --   "parentFolderId": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwMAAAA=",
    --   "conversationId": "AQQkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAQAEa8sL3gJ_FNjgk2YkP1eTQ=",
    --   "isDeliveryReceiptRequested": null,
    --   "isReadReceiptRequested": false,
    --   "isRead": true,
    --   "isDraft": false,
    --   "webLink": "https://outlook.live.com/owa/?ItemID=AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5%2BvF7TKKdE6bGCRqXyl2PQAAAL8huwMAAADn68XtMop0TpsYJGpfKXY9AAAAzomk3AAAAA%3D%3D&exvsurl=1&viewmodel=ReadMessageItem",
    --   "inferenceClassification": "focused",
    --   "body": {
    --     "contentType": "html",
    --     "content": "<html>...</html>\r\n"
    --   },
    --   "sender": {
    --     "emailAddress": {
    --       "name": "Chilkat Software",
    --       "address": "admin@chilkat.io"
    --     }
    --   },
    --   "from": {
    --     "emailAddress": {
    --       "name": "Chilkat Software",
    --       "address": "admin@chilkat.io"
    --     }
    --   },
    --   "toRecipients": [
    --     {
    --       "emailAddress": {
    --         "name": "Chilkat Software",
    --         "address": "chilkatsoft@outlook.com"
    --       }
    --     }
    --   ],
    --   "ccRecipients": [
    --   ],
    --   "bccRecipients": [
    --   ],
    --   "replyTo": [
    --   ]
    -- }
    -- 

    EXEC @hr = sp_OADestroy @http
    EXEC @hr = sp_OADestroy @htFolderMap
    EXEC @hr = sp_OADestroy @sbMap
    EXEC @hr = sp_OADestroy @json
    EXEC @hr = sp_OADestroy @sbResponse
    EXEC @hr = sp_OADestroy @jsonRequestBody
    EXEC @hr = sp_OADestroy @jsonResponse
    EXEC @hr = sp_OADestroy @resp


END
GO