diff --git a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
index 1482c0aa08f8b..c01a3b4b0ed6a 100644
--- a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
+++ b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
@@ -1081,16 +1081,11 @@ export class AwsSes implements INodeType {
if (operation === 'sendTemplate') {
const toAddresses = this.getNodeParameter('toAddresses', i) as string[];
-
const template = this.getNodeParameter('templateName', i) as string;
-
const fromEmail = this.getNodeParameter('fromEmail', i) as string;
-
const additionalFields = this.getNodeParameter('additionalFields', i);
-
const templateDataUi = this.getNodeParameter('templateDataUi', i) as IDataObject;
-
- const params = [`Template=${template}`, `Source=${fromEmail}`];
+ const params = [`Template=${template}`, `Source=${encodeURIComponent(fromEmail)}`];
if (toAddresses.length) {
setParameter(params, 'Destination.ToAddresses.member', toAddresses);
@@ -1150,7 +1145,7 @@ export class AwsSes implements INodeType {
//@ts-ignore
templateData[templateDataValue.key] = templateDataValue.value;
}
- params.push(`TemplateData=${JSON.stringify(templateData)}`);
+ params.push(`TemplateData=${encodeURIComponent(JSON.stringify(templateData))}`);
}
}
@@ -1176,13 +1171,15 @@ export class AwsSes implements INodeType {
const additionalFields = this.getNodeParameter('additionalFields', i);
const params = [
- `Template.TemplateName=${templateName}`,
- `Template.SubjectPart=${subjectPart}`,
- `Template.HtmlPart=
${htmlPart}
`,
+ `Template.TemplateName=${encodeURIComponent(templateName)}`,
+ `Template.SubjectPart=${encodeURIComponent(subjectPart)}`,
+ `Template.HtmlPart=${encodeURIComponent(htmlPart)}`,
];
if (additionalFields.textPart) {
- params.push(`Template.TextPart=${additionalFields.textPart}`);
+ params.push(
+ `Template.TextPart=${encodeURIComponent(additionalFields.textPart as string)}`,
+ );
}
responseData = await awsApiRequestSOAP.call(
@@ -1256,18 +1253,24 @@ export class AwsSes implements INodeType {
const updateFields = this.getNodeParameter('updateFields', i);
- const params = [`Template.TemplateName=${templateName}`];
+ const params = [`Template.TemplateName=${encodeURIComponent(templateName)}`];
if (updateFields.textPart) {
- params.push(`Template.TextPart=${updateFields.textPart}`);
+ params.push(
+ `Template.TextPart=${encodeURIComponent(updateFields.textPart as string)}`,
+ );
}
if (updateFields.subjectPart) {
- params.push(`Template.SubjectPart=${updateFields.subjectPart}`);
+ params.push(
+ `Template.SubjectPart=${encodeURIComponent(updateFields.subjectPart as string)}`,
+ );
}
if (updateFields.subjectPart) {
- params.push(`Template.HtmlPart=${updateFields.htmlPart}`);
+ params.push(
+ `Template.HtmlPart=${encodeURIComponent(updateFields.htmlPart as string)}`,
+ );
}
responseData = await awsApiRequestSOAP.call(
diff --git a/packages/nodes-base/nodes/Aws/SES/test/AwsSes.node.test.ts b/packages/nodes-base/nodes/Aws/SES/test/AwsSes.node.test.ts
index dfd4005fe32e0..68d48556985bd 100644
--- a/packages/nodes-base/nodes/Aws/SES/test/AwsSes.node.test.ts
+++ b/packages/nodes-base/nodes/Aws/SES/test/AwsSes.node.test.ts
@@ -90,6 +90,96 @@ describe('AwsSes Node', () => {
],
},
},
+ {
+ description: 'should URIencode params for sending email with template',
+ input: {
+ workflowData: {
+ nodes: [
+ {
+ parameters: {},
+ type: 'n8n-nodes-base.manualTrigger',
+ typeVersion: 1,
+ position: [-180, 520],
+ id: '363e874a-9054-4a64-bc3f-786719dde626',
+ name: "When clicking 'Test workflow'",
+ },
+ {
+ parameters: {
+ operation: 'sendTemplate',
+ templateName: '=Template11',
+ fromEmail: 'test+user@example.com',
+ toAddresses: ['test+user@example.com'],
+ templateDataUi: {
+ templateDataValues: [
+ {
+ key: 'Name',
+ value: '=Special. Characters @#$%^&*()_-',
+ },
+ ],
+ },
+ additionalFields: {},
+ },
+ type: 'n8n-nodes-base.awsSes',
+ typeVersion: 1,
+ position: [60, 520],
+ id: '13bbf4ef-8320-45d1-9210-61b62794a108',
+ name: 'AWS SES4',
+ credentials: {
+ aws: {
+ id: 'Nz0QZhzu3MvfK4TQ',
+ name: 'AWS account',
+ },
+ },
+ },
+ ],
+ connections: {
+ "When clicking 'Test workflow'": {
+ main: [
+ [
+ {
+ node: 'AWS SES4',
+ type: NodeConnectionType.Main,
+ index: 0,
+ },
+ ],
+ ],
+ },
+ },
+ },
+ },
+ output: {
+ nodeExecutionOrder: ['Start'],
+ nodeData: { 'AWS SES': [[{ json: { success: 'true' } }]] },
+ },
+ nock: {
+ baseUrl: 'https://email.eu-central-1.amazonaws.com',
+ mocks: [
+ {
+ method: 'post',
+ path: '/',
+ requestBody: (body: any) => {
+ assert.deepEqual(qs.parse(body), {
+ Action: 'SendTemplatedEmail',
+ TemplateName: '=Template11',
+ Source: encodeURIComponent('test+user@example.com'),
+ Destination: {
+ ToAddresses: [encodeURIComponent('test+user@example.com')],
+ },
+ TemplateData: encodeURIComponent(
+ JSON.stringify({
+ Name: '=Special. Characters @#$%^&*()_-',
+ }),
+ ),
+ });
+ return true;
+ },
+ statusCode: 200,
+ responseBody:
+ 'true',
+ },
+ ],
+ },
+ },
];
const nodeTypes = Helpers.setup(tests);