除了 Cognito 用户池的“消息自定义”选项卡中指定的电子邮件之外,还有其他方法可以发送电子邮件吗?我想根据一些参数使用不同的电子邮件。
例如
verify@my-service.com 用于验证电子邮件
Welcome@my-service.com 用于欢迎电子邮件
除了 Cognito 用户池的“消息自定义”选项卡中指定的电子邮件之外,还有其他方法可以发送电子邮件吗?我想根据一些参数使用不同的电子邮件。
例如
verify@my-service.com 用于验证电子邮件
Welcome@my-service.com 用于欢迎电子邮件
您可以转到 Cognito 中的常规设置,然后单击触发器。在那里您可以选择 Post Confirmation lambda 函数(此示例在节点中)来发送电子邮件。在 lambda 函数中,您可以随意设置主题并从电子邮件地址更改。
var aws = require('aws-sdk');
var ses = new aws.SES();
exports.handler = function(event, context) {
console.log(event);
if (event.request.userAttributes.email) {
// Pull another attribute if you want
sendEmail(event.request.userAttributes.email,
"Congratulations "+event.userName+", you have been registered!"
, function(status) {
context.done(null, event);
});
} else {
// Nothing to do, the user's email ID is unknown
console.log("Failed");
context.done(null, event);
}
};
function sendEmail(to, body, completedCallback) {
var eParams = {
Destination: {
ToAddresses: [to]
},
Message: {
Body: {
Text: {
Data: body
}
},
Subject: {
Data: "Welcome to My Service!"
}
},
Source: "welcome@my-service.com"
};
var email = ses.sendEmail(eParams, function(err, data){
if (err) {
console.log(err);
} else {
console.log("===EMAIL SENT===");
}
completedCallback('Email sent');
});
console.log("EMAIL CODE END");
};
您还必须设置 SES。
如果您想自己处理所有电子邮件,可以使用CustomEmailSender
Lambda 指定。此触发器当前无法通过 AWS 控制台使用,但您可以使用 CLI 或 CDK/CloudFormation 指定它。请参阅此处的文档。
那些文档虽然很糟糕。要点是您将获得code
有关事件的属性,该属性是使用您在用户池中指定的 KMS 密钥加密的 base64 编码 blob。根据触发事件,这是 Cognito 生成的验证码、临时密码等。这是我的 Lambda 的简化版本:
import { buildClient, CommitmentPolicy, KmsKeyringNode } from '@aws-crypto/client-node';
const { decrypt } = buildClient(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);
const kmsKeyring = new KmsKeyringNode({
keyIds: [process.env.COGNITO_EMAILER_KEY_ARN]
});
export async function lambdaHandler(event, context) {
try {
let payload = '';
if (event.request.code) {
const { plaintext, messageHeader } = await decrypt(
kmsKeyring,
Buffer.from(event.request.code, "base64")
);
if (event.userPoolId !== messageHeader.encryptionContext["userpool-id"]) {
console.error("Encryption context does not match expected values!");
return;
}
payload = plaintext.toString();
}
let messageHtml = "";
switch (event.triggerSource) {
case "CustomEmailSender_SignUp": {
const verificationCode = payload;
messageHtml = `<p>Use this code to verify your email: ${verificationCode}</p>`;
break;
}
case "CustomEmailSender_AdminCreateUser":
case "CustomEmailSender_ResendCode": {
const tempPassword = payload;
messageHtml = `<p>Your temporary password is ${tempPassword}</p>`;
break;
}
default: {
console.warn("unhandled trigger:", event.triggerSource);
return;
}
}
await sendEmail({
subject: "Automated message",
to: event.request.userAttributes.email,
messageHtml,
});
return true;
} catch (err) {
console.error(err.message);
process.exit(1);
}
}