Skip to content

Commit ca8d249

Browse files
riaschoShireenMissi
andauthoredMar 11, 2025
fix(AWS SES Node): Encode template parameters properly (#13570)
Co-authored-by: Shireen Missi <shireen@n8n.io>
1 parent b6d5092 commit ca8d249

File tree

2 files changed

+96
-15
lines changed

2 files changed

+96
-15
lines changed
 

‎packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts

+18-15
Original file line numberDiff line numberDiff line change
@@ -1081,16 +1081,11 @@ export class AwsSes implements INodeType {
10811081

10821082
if (operation === 'sendTemplate') {
10831083
const toAddresses = this.getNodeParameter('toAddresses', i) as string[];
1084-
10851084
const template = this.getNodeParameter('templateName', i) as string;
1086-
10871085
const fromEmail = this.getNodeParameter('fromEmail', i) as string;
1088-
10891086
const additionalFields = this.getNodeParameter('additionalFields', i);
1090-
10911087
const templateDataUi = this.getNodeParameter('templateDataUi', i) as IDataObject;
1092-
1093-
const params = [`Template=${template}`, `Source=${fromEmail}`];
1088+
const params = [`Template=${template}`, `Source=${encodeURIComponent(fromEmail)}`];
10941089

10951090
if (toAddresses.length) {
10961091
setParameter(params, 'Destination.ToAddresses.member', toAddresses);
@@ -1150,7 +1145,7 @@ export class AwsSes implements INodeType {
11501145
//@ts-ignore
11511146
templateData[templateDataValue.key] = templateDataValue.value;
11521147
}
1153-
params.push(`TemplateData=${JSON.stringify(templateData)}`);
1148+
params.push(`TemplateData=${encodeURIComponent(JSON.stringify(templateData))}`);
11541149
}
11551150
}
11561151

@@ -1176,13 +1171,15 @@ export class AwsSes implements INodeType {
11761171
const additionalFields = this.getNodeParameter('additionalFields', i);
11771172

11781173
const params = [
1179-
`Template.TemplateName=${templateName}`,
1180-
`Template.SubjectPart=${subjectPart}`,
1181-
`Template.HtmlPart=<h1>${htmlPart}</h1>`,
1174+
`Template.TemplateName=${encodeURIComponent(templateName)}`,
1175+
`Template.SubjectPart=${encodeURIComponent(subjectPart)}`,
1176+
`Template.HtmlPart=${encodeURIComponent(htmlPart)}`,
11821177
];
11831178

11841179
if (additionalFields.textPart) {
1185-
params.push(`Template.TextPart=${additionalFields.textPart}`);
1180+
params.push(
1181+
`Template.TextPart=${encodeURIComponent(additionalFields.textPart as string)}`,
1182+
);
11861183
}
11871184

11881185
responseData = await awsApiRequestSOAP.call(
@@ -1256,18 +1253,24 @@ export class AwsSes implements INodeType {
12561253

12571254
const updateFields = this.getNodeParameter('updateFields', i);
12581255

1259-
const params = [`Template.TemplateName=${templateName}`];
1256+
const params = [`Template.TemplateName=${encodeURIComponent(templateName)}`];
12601257

12611258
if (updateFields.textPart) {
1262-
params.push(`Template.TextPart=${updateFields.textPart}`);
1259+
params.push(
1260+
`Template.TextPart=${encodeURIComponent(updateFields.textPart as string)}`,
1261+
);
12631262
}
12641263

12651264
if (updateFields.subjectPart) {
1266-
params.push(`Template.SubjectPart=${updateFields.subjectPart}`);
1265+
params.push(
1266+
`Template.SubjectPart=${encodeURIComponent(updateFields.subjectPart as string)}`,
1267+
);
12671268
}
12681269

12691270
if (updateFields.subjectPart) {
1270-
params.push(`Template.HtmlPart=${updateFields.htmlPart}`);
1271+
params.push(
1272+
`Template.HtmlPart=${encodeURIComponent(updateFields.htmlPart as string)}`,
1273+
);
12711274
}
12721275

12731276
responseData = await awsApiRequestSOAP.call(

‎packages/nodes-base/nodes/Aws/SES/test/AwsSes.node.test.ts

+78
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import * as Helpers from '@test/nodes/Helpers';
77
import type { WorkflowTestData } from '@test/nodes/types';
88

99
describe('AwsSes Node', () => {
10+
const email = 'test+user@example.com';
11+
const templateData = {
12+
Name: 'Special. Characters @#$%^&*()_-',
13+
};
1014
const tests: WorkflowTestData[] = [
1115
{
1216
description: 'should create customVerificationEmail',
@@ -90,6 +94,80 @@ describe('AwsSes Node', () => {
9094
],
9195
},
9296
},
97+
{
98+
description: 'should URIencode params for sending email with template',
99+
input: {
100+
workflowData: {
101+
nodes: [
102+
{
103+
parameters: {},
104+
type: 'n8n-nodes-base.manualTrigger',
105+
typeVersion: 1,
106+
position: [-180, 520],
107+
id: '363e874a-9054-4a64-bc3f-786719dde626',
108+
name: "When clicking 'Test workflow'",
109+
},
110+
{
111+
parameters: {
112+
operation: 'sendTemplate',
113+
templateName: '=Template11',
114+
fromEmail: 'test+user@example.com',
115+
toAddresses: ['test+user@example.com'],
116+
templateDataUi: {
117+
templateDataValues: [
118+
{
119+
key: 'Name',
120+
value: '=Special. Characters @#$%^&*()_-',
121+
},
122+
],
123+
},
124+
additionalFields: {},
125+
},
126+
type: 'n8n-nodes-base.awsSes',
127+
typeVersion: 1,
128+
position: [60, 520],
129+
id: '13bbf4ef-8320-45d1-9210-61b62794a108',
130+
name: 'AWS SES',
131+
credentials: {
132+
aws: {
133+
id: 'Nz0QZhzu3MvfK4TQ',
134+
name: 'AWS account',
135+
},
136+
},
137+
},
138+
],
139+
connections: {
140+
"When clicking 'Test workflow'": {
141+
main: [
142+
[
143+
{
144+
node: 'AWS SES',
145+
type: NodeConnectionType.Main,
146+
index: 0,
147+
},
148+
],
149+
],
150+
},
151+
},
152+
},
153+
},
154+
output: {
155+
nodeExecutionOrder: ['Start'],
156+
nodeData: { 'AWS SES': [[{ json: { success: 'true' } }]] },
157+
},
158+
nock: {
159+
baseUrl: 'https://email.eu-central-1.amazonaws.com',
160+
mocks: [
161+
{
162+
method: 'post',
163+
path: `/?Action=SendTemplatedEmail&Template=Template11&Source=${encodeURIComponent(email)}&Destination.ToAddresses.member.1=${encodeURIComponent(email)}&TemplateData=${encodeURIComponent(JSON.stringify(templateData))}`,
164+
statusCode: 200,
165+
responseBody:
166+
'<SendTemplatedEmailResponse><success>true</success></SendTemplatedEmailResponse>',
167+
},
168+
],
169+
},
170+
},
93171
];
94172

95173
const nodeTypes = Helpers.setup(tests);

0 commit comments

Comments
 (0)
Please sign in to comment.