- server/lib/email.ts: transporter 改为懒加载,避免 ESM import 提升导致 EMAIL_PASS 未加载 - server/routes/auth.ts: send-verify 改为写 pendingEmail,验证成功后才写 email;新增 60s 冷却;catch 块打印错误 - server/db.ts: 新增 pendingEmail 字段及迁移 - src/stores/appStore.ts: 新增 refreshCurrentUser,启动时调用 apiGetMe 拉取真实 cloudEnabled - src/App.tsx: 启动时调用 refreshCurrentUser - ProfileModal/AccountModal: 加入 60s 倒计时和重新发送按钮 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
34 lines
1.2 KiB
TypeScript
34 lines
1.2 KiB
TypeScript
import nodemailer from 'nodemailer'
|
||
|
||
function createTransporter() {
|
||
return nodemailer.createTransport({
|
||
host: 'smtp.126.com',
|
||
port: 465,
|
||
secure: true,
|
||
auth: {
|
||
user: 'mikivl@126.com',
|
||
pass: process.env.EMAIL_PASS!,
|
||
},
|
||
})
|
||
}
|
||
|
||
export async function sendVerifyCode(to: string, code: string) {
|
||
await createTransporter().sendMail({
|
||
from: '"MikiVL 笔记" <mikivl@126.com>',
|
||
to,
|
||
subject: '邮箱验证码',
|
||
text: `你的验证码是:${code},10 分钟内有效。`,
|
||
html: `<p style="font-family:sans-serif">你的验证码是:<strong style="font-size:1.2em;letter-spacing:0.1em">${code}</strong>,10 分钟内有效。</p>`,
|
||
})
|
||
}
|
||
|
||
export async function sendResetCode(to: string, code: string) {
|
||
await createTransporter().sendMail({
|
||
from: '"MikiVL 笔记" <mikivl@126.com>',
|
||
to,
|
||
subject: '重置密码验证码',
|
||
text: `你的重置密码验证码是:${code},10 分钟内有效。如非本人操作请忽略。`,
|
||
html: `<p style="font-family:sans-serif">你的重置密码验证码是:<strong style="font-size:1.2em;letter-spacing:0.1em">${code}</strong>,10 分钟内有效。如非本人操作请忽略。</p>`,
|
||
})
|
||
}
|