Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(SQL Server) Auto-Refresh O365 Access Token when Sending EmailSee more Office365 ExamplesDemonstrates how to automatically recover from an expired access token when sending email from smtp.office365.com using OAuth2 authentication. If the server responds with an error indicating that the access token is expired, then we refresh the access token and retry.
-- 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) -- This example requires the Chilkat API to have been previously unlocked. -- See Global Unlock Sample for sample code. -- An Office365 OAuth2 access token must first be obtained prior -- to running this code. -- First get our previously obtained OAuth2 access token. DECLARE @jsonToken int -- Use "Chilkat_9_5_0.JsonObject" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @jsonToken OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END DECLARE @success int EXEC sp_OAMethod @jsonToken, 'LoadFile', @success OUT, 'qa_data/tokens/office365.json' DECLARE @mailman int -- Use "Chilkat_9_5_0.MailMan" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.MailMan', @mailman OUT EXEC sp_OASetProperty @mailman, 'SmtpHost', 'smtp.office365.com' EXEC sp_OASetProperty @mailman, 'SmtpPort', 587 EXEC sp_OASetProperty @mailman, 'StartTLS', 1 -- Use your Office365 email address for the SmtpUsername. EXEC sp_OASetProperty @mailman, 'SmtpUsername', 'OFFICE365_EMAIL_ADDRESS' EXEC sp_OAMethod @jsonToken, 'StringOf', @sTmp0 OUT, 'access_token' EXEC sp_OASetProperty @mailman, 'OAuth2AccessToken', @sTmp0 -- Create a new email object DECLARE @email int -- Use "Chilkat_9_5_0.Email" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Email', @email OUT EXEC sp_OASetProperty @email, 'Subject', 'This is a test' EXEC sp_OASetProperty @email, 'Body', 'This is a test' EXEC sp_OASetProperty @email, 'From', 'MY_NAME <OFFICE365_EMAIL_ADDRESS>' EXEC sp_OAMethod @email, 'AddTo', @success OUT, 'John Doe', 'somebody@example.com' -- Call SendEmail to connect to the SMTP server and send. -- The connection (i.e. session) to the SMTP server remains -- open so that subsequent SendEmail calls may use the -- same connection. EXEC sp_OAMethod @mailman, 'SendEmail', @success OUT, @email IF @success = 1 BEGIN PRINT 'Mail Sent!' EXEC @hr = sp_OADestroy @jsonToken EXEC @hr = sp_OADestroy @mailman EXEC @hr = sp_OADestroy @email RETURN END -- If we fall through to here, it means something failed. -- If we failed because of an invalid or expired access token, we should get this SMTP status code and error message: -- response: 535 5.7.3 Authentication unsuccessful [CH2PR19CA0023.namprd19.prod.outlook.com] -- status code: 535 EXEC sp_OAGetProperty @mailman, 'LastSmtpStatus', @iTmp0 OUT IF @iTmp0 <> 535 BEGIN EXEC sp_OAGetProperty @mailman, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @jsonToken EXEC @hr = sp_OADestroy @mailman EXEC @hr = sp_OADestroy @email RETURN END -- If we get here, it means the SMTP status code equaled 535, which is an authentication failure. -- Let's refresh the access token, and then retry.. DECLARE @oauth2 int -- Use "Chilkat_9_5_0.OAuth2" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.OAuth2', @oauth2 OUT -- Update to use your token endpoint. -- In the Azure Portal, in "App registrations", go to "Endpoints" (located to the right of the "+ New registration" link.) -- Find your endpoint for the "OAuth 2.0 token endpoint (v2)" -- See Office365 OAuth2 Endpoints EXEC sp_OASetProperty @oauth2, 'TokenEndpoint', 'https://login.microsoftonline.com/xxxxxxxxxx-71bf-4ebe-a866-738364321bf2/oauth2/v2.0/token' -- Replace these with actual values. EXEC sp_OASetProperty @oauth2, 'ClientId', 'CLIENT_ID' EXEC sp_OASetProperty @oauth2, 'ClientSecret', 'CLIENT_SECRET' -- Get the "refresh_token" EXEC sp_OAMethod @jsonToken, 'StringOf', @sTmp0 OUT, 'refresh_token' EXEC sp_OASetProperty @oauth2, 'RefreshToken', @sTmp0 -- Send the HTTP POST to refresh the access token.. EXEC sp_OAMethod @oauth2, 'RefreshAccessToken', @success OUT IF @success <> 1 BEGIN EXEC sp_OAGetProperty @oauth2, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @jsonToken EXEC @hr = sp_OADestroy @mailman EXEC @hr = sp_OADestroy @email EXEC @hr = sp_OADestroy @oauth2 RETURN END EXEC sp_OAGetProperty @oauth2, 'AccessToken', @sTmp0 OUT PRINT 'New access token: ' + @sTmp0 EXEC sp_OAGetProperty @oauth2, 'RefreshToken', @sTmp0 OUT PRINT 'New refresh token: ' + @sTmp0 -- Update the JSON with the new tokens. EXEC sp_OAGetProperty @oauth2, 'AccessToken', @sTmp0 OUT EXEC sp_OAMethod @jsonToken, 'UpdateString', @success OUT, 'access_token', @sTmp0 EXEC sp_OAGetProperty @oauth2, 'RefreshToken', @sTmp0 OUT EXEC sp_OAMethod @jsonToken, 'UpdateString', @success OUT, 'refresh_token', @sTmp0 -- Save the new JSON access token response to a file. DECLARE @sbJson int -- Use "Chilkat_9_5_0.StringBuilder" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbJson OUT EXEC sp_OASetProperty @jsonToken, 'EmitCompact', 0 EXEC sp_OAMethod @jsonToken, 'EmitSb', @success OUT, @sbJson EXEC sp_OAMethod @sbJson, 'WriteFile', @success OUT, 'qa_data/tokens/office365.json', 'utf-8', 0 PRINT 'OAuth2 authorization granted!' EXEC sp_OAGetProperty @oauth2, 'AccessToken', @sTmp0 OUT PRINT 'New Access Token = ' + @sTmp0 -- ------------------------------------------------- -- Retry the SMTP send using the refreshed access token. PRINT 'Retrying the send using the refreshed access token.' EXEC sp_OAGetProperty @oauth2, 'AccessToken', @sTmp0 OUT EXEC sp_OASetProperty @mailman, 'OAuth2AccessToken', @sTmp0 EXEC sp_OAMethod @mailman, 'SendEmail', @success OUT, @email IF @success = 0 BEGIN EXEC sp_OAGetProperty @mailman, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @jsonToken EXEC @hr = sp_OADestroy @mailman EXEC @hr = sp_OADestroy @email EXEC @hr = sp_OADestroy @oauth2 EXEC @hr = sp_OADestroy @sbJson RETURN END EXEC sp_OAMethod @mailman, 'CloseSmtpConnection', @success OUT IF @success <> 1 BEGIN PRINT 'Connection to SMTP server not closed cleanly.' END PRINT 'Email sent!' EXEC @hr = sp_OADestroy @jsonToken EXEC @hr = sp_OADestroy @mailman EXEC @hr = sp_OADestroy @email EXEC @hr = sp_OADestroy @oauth2 EXEC @hr = sp_OADestroy @sbJson END GO |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.