feat: dynamic email template using markdown (#4515)

* feat: markdown dynamic email template

* fix: lint and remove debug statements

* fix: lint issues
This commit is contained in:
Calum H.
2025-10-08 20:05:23 +01:00
committed by GitHub
parent e9735bd9ba
commit 9ee0626e8b
3 changed files with 57 additions and 0 deletions

View File

@@ -5,6 +5,14 @@ import emails from '~/templates/emails'
export default defineEventHandler(async (event) => {
const template = event.context.params?.template as string
if (template === 'dynamic') {
throw createError({
statusCode: 404,
message: 'Email template not found',
})
}
try {
const component = (await emails[template]()).default as Component | undefined

View File

@@ -0,0 +1,29 @@
import { render } from '@vue-email/render'
import MarkdownDynamicEmail from '~/templates/emails/dynamic/MarkdownDynamicEmail.vue'
export default defineEventHandler(async (event) => {
try {
const body = await readBody<{ title: string; body: string }>(event)
if (!body.title || !body.body) {
throw createError({
statusCode: 400,
message: 'Missing required fields: title and body',
})
}
const html = await render(MarkdownDynamicEmail, {
title: body.title,
body: body.body,
})
return html
} catch (error) {
console.error('Error rendering dynamic email template:', error)
throw createError({
statusCode: 500,
message: 'Failed to render dynamic email template',
})
}
})

View File

@@ -0,0 +1,20 @@
<script setup lang="ts">
import { Heading, Markdown } from '@vue-email/components'
import StyledEmail from '../shared/StyledEmail.vue'
const props = defineProps<{
title: string
body: string
}>()
</script>
<template>
<StyledEmail :title="props.title">
<Heading as="h1" class="mb-2 text-2xl font-bold">
{{ props.title }}
</Heading>
<Markdown :source="props.body" />
</StyledEmail>
</template>