Customize verification, password reset, and magic link emails.
Located in packages/auth/src/email/:
| File | Purpose |
|---|---|
send-verification-email.ts |
Email verification |
send-reset-password.ts |
Password reset |
send-magic-link.ts |
Magic link login |
send-invitation.ts |
Org invitations |
emailVerification: {
sendOnSignUp: true,
autoSignInAfterVerification: true,
sendVerificationEmail: async ({ user, url }) => {
const verificationUrl = buildEmailUrlWithFrontendCallback(url, "/dashboard");
await sendVerificationEmail(env, {
to: { address: user.email, name: user.name || "" },
url: verificationUrl,
});
},
},emailAndPassword: {
sendResetPassword: async ({ user, url }) => {
const resetUrl = buildPasswordResetFrontendUrl(url);
await sendResetPassword(env, {
to: { address: user.email, name: user.name || "" },
url: resetUrl,
});
},
},const buildEmailUrlWithFrontendCallback = (
originalUrl: string,
frontendPath: string = "/dashboard"
): string => {
const urlObj = new URL(originalUrl);
urlObj.searchParams.set("callbackURL", `${frontendURL}${frontendPath}`);
return urlObj.toString();
};const buildPasswordResetFrontendUrl = (originalUrl: string): string => {
const urlObj = new URL(originalUrl);
const pathParts = urlObj.pathname.split("/").filter(Boolean);
const token = pathParts[pathParts.length - 1];
return `${frontendURL}/reset-password?token=${token}`;
};EMAIL_FROM_ADDRESS=noreply@example.com
EMAIL_FROM_NAME=FlowStack