Skip to content

Commit af81560

Browse files
committed
Create a class function to AmazonEmailService and organized params as record
1 parent 363b1ab commit af81560

5 files changed

+93
-103
lines changed

AmazonEmailMessage.pas

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
unit AmazonEmailMessage;
2+
3+
interface
4+
5+
type
6+
TBodyType = (btHTML, btText);
7+
8+
TEmailMessage = record
9+
FromName: string;
10+
FromAddress: string;
11+
Recipients: TArray<string>;
12+
ReplyTo: TArray<string>;
13+
CC: TArray<string>;
14+
BCC: TArray<string>;
15+
Subject: string;
16+
Body: string;
17+
BodyType: TBodyType;
18+
end;
19+
20+
implementation
21+
22+
end.

AmazonEmailService.pas

+35-40
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,27 @@ interface
66
IPPeerAPI,
77
Data.Cloud.CloudAPI,
88
IPPeerClient,
9-
System.Classes;
9+
System.Classes,
10+
AmazonEmailMessage;
1011

1112
type
12-
TEmailBody = (eHTML, eText);
13-
1413
TAmazonEmailService = class
1514
private
1615
FRegion: string;
1716
FAWSAccessKey: string;
1817
FAWSSecretKey: string;
19-
FEmailBody: TEmailBody;
2018
procedure IssueRequest(const QueryParameters: TStringStream; out Response: TCloudResponseInfo);
2119
procedure PopulateResponseInfo(const ResponseInfo: TCloudResponseInfo; const Peer: IIPHTTP); overload;
2220
procedure PopulateResponseInfo(const ResponseInfo: TCloudResponseInfo; const E: EIPHTTPProtocolExceptionPeer); overload;
23-
function BuildQueryParameters(const Recipients, ReplyTo: TArray<string>; const FromName, FromAddress, Subject,
24-
MessageBody: string): TStringStream;
21+
function BuildQueryParameters(const EmailMessage: TEmailMessage): TStringStream;
2522
procedure PrepareRequest(const Peer: IIPHTTP);
2623
public
2724
constructor Create(const Region, AWSAccessKey, AWSSecretKey: string); overload;
2825
constructor Create; overload;
26+
function Send(const EmailMessage: TEmailMessage; out Response: TCloudResponseInfo): Boolean;
2927

30-
function SendMail(const Recipients, ReplyTo: TArray<string>; const FromName, FromAddress, Subject, MessageBody: string;
31-
out Response: TCloudResponseInfo; const EmailBody: TEmailBody): Boolean; overload;
32-
function SendMail(const Recipients, ReplyTo: TArray<string>; const FromName, FromAddress, Subject, MessageBody: string;
33-
const EmailBody: TEmailBody): Boolean; overload;
34-
property EmailBody: TEmailBody read FEmailBody write FEmailBody;
28+
class function SendMail(const EmailMessage: TEmailMessage): Boolean; overload;
29+
class function SendMail(const EmailMessage: TEmailMessage; out Response: TCloudResponseInfo): Boolean; overload;
3530
end;
3631

3732
implementation
@@ -79,7 +74,6 @@ procedure TAmazonEmailService.IssueRequest(const QueryParameters: TStringStream;
7974
Peer.IOHandler := PeerFactory.CreatePeer('', IIPSSLIOHandlerSocketOpenSSL, nil) as IIPSSLIOHandlerSocketOpenSSL;
8075

8176
PrepareRequest(Peer);
82-
8377
try
8478
Peer.DoPost(FRegion, QueryParameters);
8579
PopulateResponseInfo(Response, Peer);
@@ -134,44 +128,20 @@ procedure TAmazonEmailService.PrepareRequest(const Peer: IIPHTTP);
134128
end;
135129
end;
136130

137-
function TAmazonEmailService.SendMail(const Recipients, ReplyTo: TArray<string>; const FromName, FromAddress, Subject,
138-
MessageBody: string; const EmailBody: TEmailBody): Boolean;
139-
var
140-
Response: TCloudResponseInfo;
131+
function TAmazonEmailService.BuildQueryParameters(const EmailMessage: TEmailMessage): TStringStream;
141132
begin
142-
try
143-
Result := SendMail(Recipients, ReplyTo, FromName, FromAddress, Subject, MessageBody, Response, EmailBody);
144-
finally
145-
if Assigned(Response) then
146-
Response.Free;
147-
end;
133+
Result := TBuildQueryParameters.GetQueryParams(EmailMessage);
148134
end;
149135

150-
function TAmazonEmailService.BuildQueryParameters(const Recipients, ReplyTo: TArray<string>; const FromName,
151-
FromAddress, Subject, MessageBody: string): TStringStream;
152-
var
153-
BuildQueryParameters: TBuildQueryParameters;
154-
begin
155-
BuildQueryParameters := TBuildQueryParameters.Create(FEmailBody);
156-
try
157-
Result := BuildQueryParameters.GetQueryParams(Recipients, ReplyTo, FromName, FromAddress, Subject, MessageBody);
158-
finally
159-
BuildQueryParameters.Free;
160-
end;
161-
end;
162-
163-
function TAmazonEmailService.SendMail(const Recipients, ReplyTo: TArray<string>; const FromName, FromAddress, Subject,
164-
MessageBody: string; out Response: TCloudResponseInfo; const EmailBody: TEmailBody): Boolean;
136+
function TAmazonEmailService.Send(const EmailMessage: TEmailMessage; out Response: TCloudResponseInfo): Boolean;
165137
var
166138
QueryParameters: TStringStream;
167139
begin
168-
FEmailBody := EmailBody;
169-
170140
CoInitialize(nil);
171141
try
172142
Response := TCloudResponseInfo.Create;
173143

174-
QueryParameters := BuildQueryParameters(Recipients, ReplyTo, FromName, FromAddress, Subject, MessageBody);
144+
QueryParameters := BuildQueryParameters(EmailMessage);
175145
try
176146
IssueRequest(QueryParameters, Response);
177147
Result := (Response <> nil) and (Response.StatusCode = 200);
@@ -184,4 +154,29 @@ function TAmazonEmailService.SendMail(const Recipients, ReplyTo: TArray<string>;
184154
end;
185155
end;
186156

157+
class function TAmazonEmailService.SendMail(const EmailMessage: TEmailMessage): Boolean;
158+
var
159+
Response: TCloudResponseInfo;
160+
begin
161+
try
162+
Result := TAmazonEmailService.SendMail(EmailMessage, Response);
163+
finally
164+
if Assigned(Response) then
165+
Response.Free;
166+
end;
167+
end;
168+
169+
class function TAmazonEmailService.SendMail(const EmailMessage: TEmailMessage;
170+
out Response: TCloudResponseInfo): Boolean;
171+
var
172+
AmazonEmailService: TAmazonEmailService;
173+
begin
174+
AmazonEmailService := TAmazonEmailService.Create;
175+
try
176+
Result := AmazonEmailService.Send(EmailMessage, Response);
177+
finally
178+
AmazonEmailService.Free;
179+
end;
180+
end;
181+
187182
end.

BuildQueryParameters.pas

+13-30
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,14 @@
33
interface
44

55
uses
6+
AmazonEmailMessage,
67
AmazonEmailService,
78
System.Classes;
89

910
type
1011
TBuildQueryParameters = class
11-
private
12-
FEmailBody: TEmailBody;
1312
public
14-
constructor Create(const EmailBody: TEmailBody);
15-
function GetQueryParams(const Recipients: TArray<string>; const FromName, FromAddress, Subject, MessageBody: string):
16-
TStringStream; overload;
17-
function GetQueryParams(const Recipients, ReplyTo: TArray<string>; const FromName, FromAddress, Subject, MessageBody:
18-
string): TStringStream; overload;
19-
property EmailBody: TEmailBody read FEmailBody write FEmailBody;
13+
class function GetQueryParams(const EmailMessage: TEmailMessage): TStringStream;
2014
end;
2115

2216
implementation
@@ -26,46 +20,35 @@ implementation
2620
EncodeQueryParams,
2721
System.NetEncoding;
2822

29-
constructor TBuildQueryParameters.Create(const EmailBody: TEmailBody);
30-
begin
31-
FEmailBody := EmailBody;
32-
end;
33-
34-
function TBuildQueryParameters.GetQueryParams(const Recipients: TArray<string>; const FromName, FromAddress, Subject,
35-
MessageBody: string): TStringStream;
36-
begin
37-
Result := GetQueryParams(Recipients, nil, FromName, FromAddress, Subject, MessageBody);
38-
end;
39-
40-
function TBuildQueryParameters.GetQueryParams(const Recipients, ReplyTo: TArray<string>; const FromName, FromAddress,
41-
Subject, MessageBody: string): TStringStream;
23+
class function TBuildQueryParameters.GetQueryParams(const EmailMessage: TEmailMessage): TStringStream;
4224
const
43-
ACTION = 'SendEmail';
25+
Action = 'SendEmail';
4426
var
4527
I: Integer;
4628
BodyType, Source: string;
4729
begin
4830
Result := TStringStream.Create(EmptyStr, TEncoding.UTF8);
4931
try
5032
Result.WriteString('Action=' + ACTION);
51-
Source := Format('=?utf-8?B?%s?= <%s>', [TNetEncoding.Base64.Encode(FromName), FromAddress]);
33+
34+
Source := Format('=?utf-8?B?%s?= <%s>', [TNetEncoding.Base64.Encode(EmailMessage.FromName), EmailMessage.FromAddress]);
5235
Result.WriteString(Format('&Source=%s', [TEncodeQueryParams.Encode(Source)]));
5336

54-
for I := Low(Recipients) to High(Recipients) do
55-
Result.WriteString(Format('&Destination.ToAddresses.member.%d=%s', [I+1, TEncodeQueryParams.Encode(Recipients[I])]));
37+
for I := Low(EmailMessage.Recipients) to High(EmailMessage.Recipients) do
38+
Result.WriteString(Format('&Destination.ToAddresses.member.%d=%s', [I+1, TEncodeQueryParams.Encode(EmailMessage.Recipients[I])]));
5639

57-
for I := Low(ReplyTo) to High(ReplyTo) do
58-
Result.WriteString(Format('&ReplyToAddresses.member.%d=%s', [I+1, TEncodeQueryParams.Encode(ReplyTo[I])]));
40+
for I := Low(EmailMessage.ReplyTo) to High(EmailMessage.ReplyTo) do
41+
Result.WriteString(Format('&ReplyToAddresses.member.%d=%s', [I+1, TEncodeQueryParams.Encode(EmailMessage.ReplyTo[I])]));
5942

6043
Result.WriteString('&Message.Subject.Charset=UTF-8');
61-
Result.WriteString(Format('&Message.Subject.Data=%s', [TEncodeQueryParams.Encode(Subject)]));
44+
Result.WriteString(Format('&Message.Subject.Data=%s', [TEncodeQueryParams.Encode(EmailMessage.Subject)]));
6245

63-
if FEmailBody = eHTML then
46+
if EmailMessage.BodyType = btHTML then
6447
BodyType := 'Html'
6548
else
6649
BodyType := 'Text';
6750
Result.WriteString(Format('&Message.Body.%s.Charset=UTF-8', [BodyType]));
68-
Result.WriteString(Format('&Message.Body.%s.Data=%s', [BodyType, TEncodeQueryParams.Encode(MessageBody)]));
51+
Result.WriteString(Format('&Message.Body.%s.Data=%s', [BodyType, TEncodeQueryParams.Encode(EmailMessage.Body)]));
6952
except
7053
Result.Free;
7154
raise

tests/AmazonEmailServiceTests.dproj

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
22
<PropertyGroup>
33
<ProjectGuid>{EA1C69F3-72E3-4B8D-A13E-31ED3822699A}</ProjectGuid>
4-
<ProjectVersion>16.0</ProjectVersion>
4+
<ProjectVersion>16.1</ProjectVersion>
55
<FrameworkType>None</FrameworkType>
66
<Base>True</Base>
77
<Config Condition="'$(Config)'==''">Debug</Config>
@@ -217,7 +217,7 @@
217217
</DeployClass>
218218
<DeployClass Name="ProjectOSXEntitlements">
219219
<Platform Name="OSX32">
220-
<RemoteDir>Contents</RemoteDir>
220+
<RemoteDir>../</RemoteDir>
221221
<Operation>1</Operation>
222222
</Platform>
223223
</DeployClass>
@@ -303,6 +303,7 @@
303303
</DeployClass>
304304
<DeployClass Name="ProjectiOSEntitlements">
305305
<Platform Name="iOSDevice">
306+
<RemoteDir>../</RemoteDir>
306307
<Operation>1</Operation>
307308
</Platform>
308309
</DeployClass>

tests/BuildQueryParametersTests.pas

+20-31
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,19 @@ interface
55
uses
66
Classes,
77
DUnitX.TestFramework,
8+
AmazonEmailMessage,
89
BuildQueryParameters;
910

1011
type
1112
[TestFixture]
1213
TBuildQueryParametersTests = class
1314
strict private
14-
FRecipients: TArray<string>;
15-
FBuildQueryParameters: TBuildQueryParameters;
15+
FEmailMessage: TEmailMessage;
1616
private
1717
procedure AddRecipient(const Address: string);
1818
public
1919
[Setup]
2020
procedure SetUp;
21-
[TearDown]
22-
procedure TearDown;
2321
published
2422
procedure GetQueryParams_WithHTMLBody_EncodedParamsReturned;
2523
procedure GetQueryParams_WithTextBody_EncodedParamsReturned;
@@ -35,8 +33,8 @@ implementation
3533

3634
procedure TBuildQueryParametersTests.AddRecipient(const Address: string);
3735
begin
38-
SetLength(FRecipients, Length(FRecipients) +1);
39-
FRecipients[High(FRecipients)] := Address;
36+
SetLength(FEmailMessage.Recipients, Length(FEmailMessage.Recipients) +1);
37+
FEmailMessage.Recipients[High(FEmailMessage.Recipients)] := Address;
4038
end;
4139

4240
procedure TBuildQueryParametersTests.GetQueryParams_MutipleRecipients_RecipientsAdded;
@@ -48,7 +46,7 @@ procedure TBuildQueryParametersTests.GetQueryParams_MutipleRecipients_Recipients
4846
begin
4947
AddRecipient('[email protected]');
5048

51-
EncodedParams := FBuildQueryParameters.GetQueryParams(FRecipients, '', '[email protected]', '', '');
49+
EncodedParams := TBuildQueryParameters.GetQueryParams(FEmailMessage);
5250
try
5351
Assert.Contains(EncodedParams.DataString, ExpectedRecipients);
5452
finally
@@ -58,11 +56,12 @@ procedure TBuildQueryParametersTests.GetQueryParams_MutipleRecipients_Recipients
5856

5957
procedure TBuildQueryParametersTests.GetQueryParams_FromNameSpecified_FromNameEncoded;
6058
const
61-
ExpectedSource = '&Source=%3D%3Futf-8%3FB%3FW0FDTUVdIEpvaG4gRG9l%3F%3D%20%3Cemail%40email.com%3E';
59+
ExpectedSource = '&Source=%3D%3Futf-8%3FB%3FW0FDTUVdIEpvaG4gRG9l%3F%3D%20%3Cemail%40mail.com%3E';
6260
var
6361
EncodedParams: TStringStream;
6462
begin
65-
EncodedParams := FBuildQueryParameters.GetQueryParams(FRecipients, '[ACME] John Doe', '[email protected]', '', '');
63+
FEmailMessage.FromName := '[ACME] John Doe';
64+
EncodedParams := TBuildQueryParameters.GetQueryParams(FEmailMessage);
6665
try
6766
Assert.Contains(EncodedParams.DataString, ExpectedSource);
6867
finally
@@ -85,12 +84,11 @@ procedure TBuildQueryParametersTests.GetQueryParams_WithHTMLBody_EncodedParamsRe
8584
'ensure%20that%20the%20browser%20will%20display%20the%20text%20properly.%3C%2Fp%3E%3C%2' +
8685
'Fbody%3E%3C%2Fhtml%3E';
8786
var
88-
FromAddress, Subject, MessageBody: string;
8987
EncodedParams: TStringStream;
9088
begin
91-
FromAddress := '[email protected]';
92-
Subject := 'This is the subject line with HTML.';
93-
MessageBody := '<!DOCTYPE html>' +
89+
FEmailMessage.BodyType := btHTML;
90+
FEmailMessage.Subject := 'This is the subject line with HTML.';
91+
FEmailMessage.Body := '<!DOCTYPE html>' +
9492
'<html>' +
9593
'<body>' +
9694
'<p>' +
@@ -103,7 +101,7 @@ procedure TBuildQueryParametersTests.GetQueryParams_WithHTMLBody_EncodedParamsRe
103101
'</body>' +
104102
'</html>';
105103

106-
EncodedParams := FBuildQueryParameters.GetQueryParams(FRecipients, '', FromAddress, Subject, MessageBody);
104+
EncodedParams := TBuildQueryParameters.GetQueryParams(FEmailMessage);
107105
try
108106
Assert.AreEqual(EXPECTED_RETURN, EncodedParams.DataString);
109107
finally
@@ -117,11 +115,10 @@ procedure TBuildQueryParametersTests.GetQueryParams_WithReplyToAddresses_Address
117115
'&ReplyToAddresses.member.2=emailtoreply2%40mail.com';
118116
var
119117
EncodedParams: TStringStream;
120-
ReplyTo: TArray<string>;
121118
begin
122-
ReplyTo := TArray<string>.Create('[email protected]', '[email protected]');
119+
FEmailMessage.ReplyTo := TArray<string>.Create('[email protected]', '[email protected]');
123120

124-
EncodedParams := FBuildQueryParameters.GetQueryParams(FRecipients, ReplyTo, '', '[email protected]', '', '');
121+
EncodedParams := TBuildQueryParameters.GetQueryParams(FEmailMessage);
125122
try
126123
Assert.Contains(EncodedParams.DataString, ExpectedRecipients);
127124
finally
@@ -139,15 +136,13 @@ procedure TBuildQueryParametersTests.GetQueryParams_WithTextBody_EncodedParamsRe
139136
'&Message.Body.Text.Charset=UTF-8' +
140137
'&Message.Body.Text.Data=Hello.%20I%20hope%20you%20are%20having%20a%20good%20day.';
141138
var
142-
FromAddress, Subject, MessageBody: string;
143139
EncodedParams: TStringStream;
144140
begin
145-
FromAddress := '[email protected]';
146-
Subject := 'This is the subject line.';
147-
MessageBody := 'Hello. I hope you are having a good day.';
141+
FEmailMessage.BodyType := btText;
142+
FEmailMessage.Subject := 'This is the subject line.';
143+
FEmailMessage.Body := 'Hello. I hope you are having a good day.';
148144

149-
FBuildQueryParameters.EmailBody := eText;
150-
EncodedParams := FBuildQueryParameters.GetQueryParams(FRecipients, '', FromAddress, Subject, MessageBody);
145+
EncodedParams := TBuildQueryParameters.GetQueryParams(FEmailMessage);
151146
try
152147
Assert.AreEqual(EXPECTED_RETURN, EncodedParams.DataString);
153148
finally
@@ -158,14 +153,8 @@ procedure TBuildQueryParametersTests.GetQueryParams_WithTextBody_EncodedParamsRe
158153
procedure TBuildQueryParametersTests.SetUp;
159154
begin
160155
inherited;
161-
FBuildQueryParameters := TBuildQueryParameters.Create(eHTML);
162-
FRecipients := TArray<string>.Create('[email protected]');
163-
end;
164-
165-
procedure TBuildQueryParametersTests.TearDown;
166-
begin
167-
inherited;
168-
FBuildQueryParameters.Free;
156+
FEmailMessage.FromAddress := '[email protected]';
157+
FEmailMessage.Recipients := TArray<string>.Create('[email protected]');
169158
end;
170159

171160
initialization

0 commit comments

Comments
 (0)