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

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