2

除了 Cognito 用户池的“消息自定义”选项卡中指定的电子邮件之外,还有其他方法可以发送电子邮件吗?我想根据一些参数使用不同的电子邮件。

例如

verify@my-service.com 用于验证电子邮件

Welcome@my-service.com 用于欢迎电子邮件

4

2 回答 2

5

您可以转到 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。

于 2017-11-13T05:33:36.497 回答
3

如果您想自己处理所有电子邮件,可以使用CustomEmailSenderLambda 指定。此触发器当前无法通过 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);
  }
}
于 2021-03-05T19:39:10.140 回答