我是nuxt的新手,我想创建一个可重复使用的发送电子邮件,当用户注册或登录时将被调用。电子邮件模板将存储在
/assets/email-templates/
所以例如
/assets/email-templates/register.html
如果有新用户注册,将发送此文件。
我尝试使用
fs.readfileAsync
节点进行文件处理,但我收到一个错误,指出没有找到目录文件。我正在使用 nodemailer 发送电子邮件和电子邮件模板的把手。
我希望修复文件以便能够向用户发送电子邮件。
我以前遇到过这个问题,但我的是在部署期间。
在 Nuxt 3 上,我建议使用 nuxt 的服务器存储
useStorage()
。
使用服务器存储,更容易找到您要使用的电子邮件模板路径。
如果你对服务器存储不熟悉,可以在server文件夹里面做个测试,像这样
~/server/api/test.get.ts
export default defineEventHandler(async (event) => {
const keys = await useStorage().getKeys()
return keys
})
.getKeys()
将输出您的应用程序上可用的所有文件。
输出会是这样的
[
"assets:server:text.html",
"assets:text.html",
...
...
]
现在,让我们在
~/assets/email-templates
中获取您的电子邮件模板的路径。如果您使用.getKeys()
,您将在回复中看到它。会变成这样"root:assets:email-templates:register.html"
由于您希望发送电子邮件可重复使用,请遵循此示例。
~/server/utils/send-email.ts
import * as nodemailer from 'nodemailer'
import handlebars from 'handlebars'
interface IEmailData {
source: string
head: { to: string, subject: string },
body: any
}
export default async (data: IEmailData): Promise<void> => {
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: useRuntimeConfig().apiSecret.EMAIL_PASS,
pass: useRuntimeConfig().apiSecret.EMAIL_PASS
}
})
const compileSource = handlebars.compile(data.source)
const mailOptions = {
from: 'Send Email Example <[email protected]>',
to: data.head.to,
subject: data.head.subject,
html: compileSource(data.body)
}
await transporter.sendMail(mailOptions)
}
在你的服务器 API 路由上。就像这个例子一样。
~/server/api/user/register.post.ts
export default defineEventHandler(async (event) => {
try {
const body: { name: string, email: string, password: string, } = await readBody(event)
// const keys = useStorage().getKeys() - Get list of all keys available to your app.
const source = await useStorage().getItem('root:assets:email-templates:register.html')
const emailHeading: { to: string, subject: string } = {
to: body.email,
subject: 'Your account has been created.'
}
const emailBody: { name: string } = {
name: body.name,
}
if (source) {
await sendEmail({ source: source as string, head: emailHeading, body: emailBody })
}
return 200 // Success
} catch (error: unknown) {
console.log(error)
return createError({ statusCode: 500, statusMessage: 'Something went wrong.' })
}
})
希望对你有帮助。