Nuxt 3 电子邮件模板没有找到这样的目录文件

问题描述 投票:0回答:1

我是nuxt的新手,我想创建一个可重复使用的发送电子邮件,当用户注册或登录时将被调用。电子邮件模板将存储在

/assets/email-templates/

所以例如

/assets/email-templates/register.html
如果有新用户注册,将发送此文件。

我尝试使用

fs.readfileAsync
节点进行文件处理,但我收到一个错误,指出没有找到目录文件。我正在使用 nodemailer 发送电子邮件和电子邮件模板的把手。

我希望修复文件以便能够向用户发送电子邮件。

html-email nodemailer nuxtjs3 nuxt3
1个回答
0
投票

我以前遇到过这个问题,但我的是在部署期间。

在 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.' })
    }
})

希望对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.