Cognito使用自定义电子邮件发送确认邮件

时间:2017-03-14 09:02:43

标签: amazon-web-services amazon-sns aws-cognito

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

E.g。

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

welcome@my-service.com欢迎电子邮件

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果您想自己处理所有电子邮件,您可以使用 CustomEmailSender Lambda 指定此项。此触发器当前无法通过 AWS 控制台使用,但您可以使用 CLI 或 CDK/CloudFormation 指定它。请参阅文档 here

虽然这些文档非常糟糕。要点是,您将获得有关该事件的 code 属性,这是一个 base64 编码的 blob,使用您在用户池中指定的 KMS 密钥进行加密。根据触发事件,这是 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);
  }
}
相关问题