extension-email-verification
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseEmail — Verification
邮箱 — 验证
Email verification extension for Caffeine AI.
适用于Caffeine AI的邮箱验证扩展。
Overview
概述
This skill adds email address verification via a click-to-verify link. The handles the verification callback; tracks verified addresses.
MixinEmailVerificationverifiedEmails该技能通过点击验证链接实现邮箱地址验证。负责处理验证回调;用于跟踪已验证的邮箱地址。
MixinEmailVerificationverifiedEmailsBackend
后端
This component is for sending an email to users with a verification link which the user can click to prove they own the email address.
此组件用于向用户发送包含验证链接的邮件,用户可点击链接证明其拥有该邮箱地址。
To check if an email address has been verified
检查邮箱地址是否已验证
Use the prefabricated module which cannot be modified.
mo:caffeineai-email-verification/verifiedEmails.momo
module {
public type State = {
var verifiedEmails : Set.Set<Text>;
};
public func new() : State {
{
var verifiedEmails = Set.empty<Text>();
};
};
public func contains(state : State, email : Text) : Bool;
public func iter(state : State) : Iter.Iter<Text>;
public func size(state : State) : Nat;
};To check whether an email is verified use the function. Do NOT try to track the email verification status independently by storing it against the user profile.
contains使用预制模块,该模块不可修改。
mo:caffeineai-email-verification/verifiedEmails.momo
module {
public type State = {
var verifiedEmails : Set.Set<Text>;
};
public func new() : State {
{
var verifiedEmails = Set.empty<Text>();
};
};
public func contains(state : State, email : Text) : Bool;
public func iter(state : State) : Iter.Iter<Text>;
public func size(state : State) : Nat;
};如需检查邮箱是否已验证,请使用函数。请勿尝试通过在用户档案中存储验证状态来独立跟踪邮箱验证情况。
containsTo handle the verification link
处理验证链接
Use the prefabricated module which cannot be modified.
mo:caffeineai-email-verification/verificationMixin.moThe MixinEmailVerification handles calls to the verification link to verify an email address.
mo
import MixinEmailVerification "mo:caffeineai-email-verification/verificationMixin";使用预制模块,该模块不可修改。
mo:caffeineai-email-verification/verificationMixin.moMixinEmailVerification负责处理验证链接的调用,以完成邮箱地址验证。
mo
import MixinEmailVerification "mo:caffeineai-email-verification/verificationMixin";For sending users a verification email
向用户发送验证邮件
- This extension depends on the extension-email for sending emails.
- Use the sendVerificationEmail function.
- It returns a SendResult which is #ok if the email is sent successfully otherwise #err(error) with the error text.
- Each recipient receives an individual email with a specific verification link for them
- The htmlBody MUST contain the placeholder text {{VERIFICATION_URL}}
mo
module {
public type SendResult = {
#ok;
#err : Text;
};
public func sendVerificationEmail(
fromUsername : Text,
recipients : [Text],
subject : Text,
htmlBody : Text,
) : async SendResult;
};- 此扩展依赖于extension-email来发送邮件。
- 使用函数。
sendVerificationEmail - 该函数返回:若邮件发送成功则返回
SendResult,否则返回#ok并附带错误文本。#err(error) - 每位收件人会收到包含专属验证链接的独立邮件。
- HTML邮件正文必须包含占位符文本
{{VERIFICATION_URL}}
mo
module {
public type SendResult = {
#ok;
#err : Text;
};
public func sendVerificationEmail(
fromUsername : Text,
recipients : [Text],
subject : Text,
htmlBody : Text,
) : async SendResult;
};Example usage with endpoints for registering a user and for checking whether a user is verified.
用户注册与验证状态检查的端点示例
motoko
import Map "mo:core/Map";
import Runtime "mo:core/Runtime";
import Principal "mo:core/Principal";
import Text "mo:core/Text";
import EmailClient "mo:caffeineai-email/emailClient";
import MixinEmailVerification "mo:caffeineai-email-verification/verificationMixin";
import VerifiedEmails "mo:caffeineai-email-verification/verifiedEmails";
actor {
// Stores which emails are verified
let verifiedEmails = VerifiedEmails.new();
// User profiles storage
let users = Map.empty<Principal, User>();
// Email to principal mapping for uniqueness check
let emailToPrincipal = Map.empty<Text, Principal>();
// Handles the verification link and updates the verifiedEmails store
include MixinEmailVerification(verifiedEmails);
type User = {
name : Text;
email : Text;
};
public shared ({ caller }) func registerUser(email : Text, name : Text) : async () {
if (users.containsKey(caller)) {
Runtime.trap("User already registered");
};
if (emailToPrincipal.containsKey(email)) {
Runtime.trap("Email already registered");
};
let user : User = {
name;
email;
};
users.add(caller, user);
emailToPrincipal.add(email, caller);
let result = await EmailClient.sendVerificationEmail(
"no-reply",
[email],
"Welcome to Our Service",
"Hello " # name # ",<br><br>Thank you for registering with our service. Please <a href=\"{{VERIFICATION_URL}}\">click here</a> to verify your email address<br><br>Best regards,<br>The Team",
);
switch (result) {
case (#ok) {};
case (#err(error)) {
Runtime.trap("Couldn't send verification email: " # error);
};
};
};
public shared ({ caller }) func isEmailVerified() : async Bool {
switch (users.get(caller)) {
case (null) {
Runtime.trap("User not registered");
};
case (?user) {
VerifiedEmails.contains(verifiedEmails, user.email);
};
};
};
};motoko
import Map "mo:core/Map";
import Runtime "mo:core/Runtime";
import Principal "mo:core/Principal";
import Text "mo:core/Text";
import EmailClient "mo:caffeineai-email/emailClient";
import MixinEmailVerification "mo:caffeineai-email-verification/verificationMixin";
import VerifiedEmails "mo:caffeineai-email-verification/verifiedEmails";
actor {
// 存储已验证的邮箱地址
let verifiedEmails = VerifiedEmails.new();
// 用户档案存储
let users = Map.empty<Principal, User>();
// 邮箱到主体的映射,用于唯一性检查
let emailToPrincipal = Map.empty<Text, Principal>();
// 处理验证链接并更新verifiedEmails存储
include MixinEmailVerification(verifiedEmails);
type User = {
name : Text;
email : Text;
};
public shared ({ caller }) func registerUser(email : Text, name : Text) : async () {
if (users.containsKey(caller)) {
Runtime.trap("User already registered");
};
if (emailToPrincipal.containsKey(email)) {
Runtime.trap("Email already registered");
};
let user : User = {
name;
email;
};
users.add(caller, user);
emailToPrincipal.add(email, caller);
let result = await EmailClient.sendVerificationEmail(
"no-reply",
[email],
"Welcome to Our Service",
"Hello " # name # ",<br><br>Thank you for registering with our service. Please <a href=\"{{VERIFICATION_URL}}\">click here</a> to verify your email address<br><br>Best regards,<br>The Team",
);
switch (result) {
case (#ok) {};
case (#err(error)) {
Runtime.trap("Couldn't send verification email: " # error);
};
};
};
public shared ({ caller }) func isEmailVerified() : async Bool {
switch (users.get(caller)) {
case (null) {
Runtime.trap("User not registered");
};
case (?user) {
VerifiedEmails.contains(verifiedEmails, user.email);
};
};
};
};Frontend
前端
If there is a UI for the admin to enter the content of a verification email then indicate that the placeholder text {{VERIFICATION_URL}} must be present in the email body.
若存在供管理员输入验证邮件内容的UI,则需提示邮件正文中必须包含占位符文本。
{{VERIFICATION_URL}}