From 7dc9a8ccafe857c7930886d182963b449c456694 Mon Sep 17 00:00:00 2001 From: franciscoaurino Date: Tue, 1 Oct 2024 22:18:26 -0300 Subject: [PATCH] added routine to attach file and adjusted function to send message with subject, message and attachment. adjusted global constant. --- EmailOAuthDm.dfm | 1 - EmailOAuthDm.pas | 17 +- GMailAuthDemo.dpr | 4 +- GMailAuthDemo.dproj | 775 +++++++++++++++++++++++++++++++++++++++++++- Globals.Sample.pas | 28 +- Unit2.dfm | 94 ++---- Unit2.pas | 14 +- 7 files changed, 852 insertions(+), 81 deletions(-) diff --git a/EmailOAuthDm.dfm b/EmailOAuthDm.dfm index 31721ce..d07de89 100644 --- a/EmailOAuthDm.dfm +++ b/EmailOAuthDm.dfm @@ -1,5 +1,4 @@ object EmailOAuthDataModule: TEmailOAuthDataModule - OldCreateOrder = True OnCreate = DataModuleCreate OnDestroy = DataModuleDestroy Height = 3000 diff --git a/EmailOAuthDm.pas b/EmailOAuthDm.pas index 652396c..c2b8736 100644 --- a/EmailOAuthDm.pas +++ b/EmailOAuthDm.pas @@ -22,6 +22,7 @@ interface , IdSASLCollection , IdMessage , IdMessageClient + , IdAttachmentFile , IdPOP3 , IdBaseComponent , IdComponent @@ -35,6 +36,7 @@ interface , IdSASL.OAuth.Base , Email.Demo.Types , windows + ; type @@ -73,7 +75,7 @@ TEmailOAuthDataModule = class(TDataModule) procedure Authenticate; procedure ClearAuthentication; procedure SetupAuthenticator; - procedure SendMessage(const destAddress: string; const Path: String); + procedure SendMessage(const Subject : string ; const Body : string ; const destAddress: string; const Path: String; const attachmentFiles: array of string); procedure CheckIMAP; procedure CheckPOP; end; @@ -199,10 +201,11 @@ procedure TEmailOAuthDataModule.ClearAuthentication; SetupAuthenticator; end; -procedure TEmailOAuthDataModule.SendMessage(const destAddress: string; const Path: String); +procedure TEmailOAuthDataModule.SendMessage(const Subject : string ; const Body : string ; const destAddress: string; const Path: String; const attachmentFiles: array of string); var IdMessage: TIdMessage; xoauthSASL : TIdSASLListEntry; + i: Integer; begin // if we only have refresh_token or access token has expired // request new access_token to use with request @@ -242,8 +245,14 @@ procedure TEmailOAuthDataModule.SendMessage(const destAddress: string; const Pat IdMessage.From.Name := Provider.ClientName; IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address; IdMessage.Recipients.Add.Text := destAddress; - IdMessage.Subject := 'Hello World'; - IdMessage.Body.Text := 'Hello Body'; + IdMessage.Subject := Subject; + IdMessage.Body.Text := Body; + for i := Low(attachmentFiles) to High(attachmentFiles) do + begin + if FileExists(attachmentFiles[i]) then + TIdAttachmentFile.Create(IdMessage.MessageParts, attachmentFiles[i]) + end; + IdSMTP1.Send(IdMessage); IdSMTP1.Disconnect; diff --git a/GMailAuthDemo.dpr b/GMailAuthDemo.dpr index 894047f..a7f177d 100644 --- a/GMailAuthDemo.dpr +++ b/GMailAuthDemo.dpr @@ -3,13 +3,13 @@ program GMailAuthDemo; uses Vcl.Forms, Unit2 in 'Unit2.pas' {Form2}, - Globals in 'Globals.pas', // rename from globals.sample.pas and update contents if missing IdSASL.OAuth.XOAUTH2 in 'IdSASL.OAuth.XOAUTH2.pas', EmailOAuthDm in 'EmailOAuthDm.pas' {EmailOAuthDataModule: TDataModule}, IdSASL.OAuth.OAuth2Bearer in 'IdSASL.OAuth.OAuth2Bearer.pas', REST.Authenticator.EnhancedOAuth in 'REST.Authenticator.EnhancedOAuth.pas', Email.Demo.Types in 'Email.Demo.Types.pas', - IdSASL.OAuth.Base in 'IdSASL.OAuth.Base.pas'; + IdSASL.OAuth.Base in 'IdSASL.OAuth.Base.pas', + Globals.Sample in 'Globals.Sample.pas'; {$R *.res} diff --git a/GMailAuthDemo.dproj b/GMailAuthDemo.dproj index 708cf4e..72d8168 100644 --- a/GMailAuthDemo.dproj +++ b/GMailAuthDemo.dproj @@ -89,7 +89,6 @@
Form2
dfm -
EmailOAuthDataModule
@@ -100,6 +99,7 @@ + Base @@ -123,6 +123,12 @@ + + + .\ + true + + GMailAuthDemo.exe @@ -130,60 +136,827 @@ + + 1 + + + Contents\MacOS + 1 + 0 + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + 1 + + + Contents\MacOS + 1 + 0 + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + 0 + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + 0 .dll;.bpl + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + 0 .bpl + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + 0 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + 0 + + + library\lib\armeabi-v7a + 1 + + 1 + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + Assets 1 + + Assets + 1 + Assets 1 + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + True diff --git a/Globals.Sample.pas b/Globals.Sample.pas index ff29587..9e7d800 100644 --- a/Globals.Sample.pas +++ b/Globals.Sample.pas @@ -1,21 +1,33 @@ -unit Globals; +unit Globals.sample; interface // Please update all these constants to yours and rename this file to globals.pas -const google_clientid = 'XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com'; -const google_clientsecret = 'XXXXXXXXXXXXXXXXXXXXXXX'; -const google_clientaccount = 'xxxxxxx@gmail.com'; +const clientsendtoaddress = 'youremail@example.com'; +const clientname = 'your account name'; +//gmail +const google_clientid = 'xxxx-xxxx.apps.googleusercontent.com' ; +const google_clientsecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'; +const google_clientaccount = 'youremail@example.com'; -const microsoft_clientid = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'; -const microsoft_clientsecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; +//configure project +// website : https://developers.google.com/identity/oauth2/web/guides/get-google-api-clientid?hl=pt-br + +///microsoft +const microsoft_clientid = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'; +const microsoft_clientsecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; const microsoft_clientaccount = 'xxxxxxxxx@hotmail.com'; -const clientsendtoaddress = 'youremail@example.com'; -const clientname = 'John Smith'; +const microsoftoffice_clientaccount = '@live.com';//@live.com or @hotmail.com email address + +//yahoo +const yahoo_clientid = 'yahoo_clientid'; +const yahoo_clintsecret = 'clientsecret'; +const yahoo_clientAccount = 'yahoo_clientAccount'; + implementation end. diff --git a/Unit2.dfm b/Unit2.dfm index c39918b..0f95a51 100644 --- a/Unit2.dfm +++ b/Unit2.dfm @@ -2,54 +2,40 @@ object Form2: TForm2 Left = 0 Top = 0 Caption = 'Test OAUTH2 Gmail Send Message' - ClientHeight = 943 - ClientWidth = 1485 + ClientHeight = 300 + ClientWidth = 594 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText - Font.Height = -28 + Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] - OldCreateOrder = True OnCreate = FormCreate OnDestroy = FormDestroy - PixelsPerInch = 240 - TextHeight = 34 + TextHeight = 13 object btnAuthenticate: TButton - Left = 1059 - Top = 19 - Width = 265 - Height = 63 - Margins.Left = 8 - Margins.Top = 8 - Margins.Right = 8 - Margins.Bottom = 8 + Left = 424 + Top = 8 + Width = 106 + Height = 25 Caption = 'Authenticate' TabOrder = 0 OnClick = btnAuthenticateClick end object btnSendMsg: TButton - Left = 1058 - Top = 238 - Width = 187 - Height = 62 - Margins.Left = 8 - Margins.Top = 8 - Margins.Right = 8 - Margins.Bottom = 8 + Left = 423 + Top = 95 + Width = 75 + Height = 25 Caption = 'Send MSG' TabOrder = 1 OnClick = btnSendMsgClick end object rgEmailProviders: TRadioGroup - Left = 20 - Top = 20 - Width = 1023 - Height = 145 - Margins.Left = 8 - Margins.Top = 8 - Margins.Right = 8 - Margins.Bottom = 8 + Left = 8 + Top = 8 + Width = 409 + Height = 58 Caption = 'Provider' Columns = 3 ItemIndex = 0 @@ -61,53 +47,37 @@ object Form2: TForm2 OnClick = rgEmailProvidersClick end object btnCheckMsg: TButton - Left = 1058 - Top = 340 - Width = 187 - Height = 63 - Margins.Left = 8 - Margins.Top = 8 - Margins.Right = 8 - Margins.Bottom = 8 + Left = 423 + Top = 136 + Width = 75 + Height = 25 Caption = 'Check MSG'#39's' TabOrder = 3 OnClick = btnCheckMsgClick end object btnClearAuthToken: TButton - Left = 1058 - Top = 98 - Width = 265 - Height = 62 - Margins.Left = 8 - Margins.Top = 8 - Margins.Right = 8 - Margins.Bottom = 8 + Left = 423 + Top = 39 + Width = 106 + Height = 25 Caption = 'Clear Auth Token' TabOrder = 4 OnClick = btnClearAuthTokenClick end object btnCheckIMAP: TButton - Left = 1060 - Top = 420 - Width = 188 - Height = 63 - Margins.Left = 8 - Margins.Top = 8 - Margins.Right = 8 - Margins.Bottom = 8 + Left = 424 + Top = 168 + Width = 75 + Height = 25 Caption = 'Check IMAP' TabOrder = 5 OnClick = btnCheckIMAPClick end object Memo1: TMemo - Left = 20 - Top = 180 - Width = 1023 - Height = 455 - Margins.Left = 8 - Margins.Top = 8 - Margins.Right = 8 - Margins.Bottom = 8 + Left = 8 + Top = 72 + Width = 409 + Height = 182 Lines.Strings = ( 'Memo1') TabOrder = 6 diff --git a/Unit2.pas b/Unit2.pas index d56ff99..a558132 100644 --- a/Unit2.pas +++ b/Unit2.pas @@ -21,7 +21,7 @@ interface , IdSASL.Oauth.OAuth2Bearer , IdSASL.Oauth.XOAUTH2 , Email.Demo.Types - , Globals // rename from globals.sample.pas and update contents if missing + , Globals.sample // rename from globals.sample.pas and update contents if missing ; type @@ -125,7 +125,7 @@ implementation LogoutEndpoint : ''; ClientID : yahoo_clientid; ClientSecret : yahoo_clintsecret; - ClientAccount : 'geoff_smith82@yahoo.com'; // your @live.com or @hotmail.com email address + ClientAccount : yahoo_clientAccount ;// your @live.com or @hotmail.com email address // Scopes : 'https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/POP.AccessAsUser.All https://outlook.office.com/SMTP.Send offline_access'; ClientName : clientname; Scopes : 'email mail-r mail-w'; @@ -187,8 +187,16 @@ procedure TForm2.btnClearAuthTokenClick(Sender: TObject); end; procedure TForm2.btnSendMsgClick(Sender: TObject); +var +filesToAttach: array of string; begin - EmailOAuthDataModule.SendMessage(clientsendtoaddress, ''); + SetLength(filesToAttach, 2); // Sets the size of the array + filesToAttach[0] := 'C:\Temp\text.pdf'; + filesToAttach[1] := 'C:\Temp\text.txt'; + + EmailOAuthDataModule.SendMessage('Subjet text' , 'message text', clientsendtoaddress, '', filesToAttach); + + // EmailOAuthDataModule.SendMessage(clientsendtoaddress, ''); end; procedure TForm2.LogMsg(const msg: string);