Getting started
Welcome to Better Svelte Email! This guide walks you through installation, configuration, and building your first email.
Requirements
svelte >= v5.14.3tailwindcss >= v4
Installation
Install the package:
npm install better-svelte-email Write your first email
Create a new file at src/lib/emails/welcome.svelte. This example uses tailwind, but bare css works too.
<!-- src/lib/emails/welcome.svelte -->
<script>
import {
Html,
Head,
Body,
Preview,
Container,
Section,
Text,
Button,
Row
} from 'better-svelte-email';
let { name = 'there' } = $props();
</script>
<Html>
<Head />
<Body class="bg-zinc-100">
<Preview preview="Welcome Email" />
<Container class="m-8 mx-auto max-w-lg rounded-2xl bg-white p-8">
<Section class="mx-auto text-center">
<Text class="text-2xl font-bold text-zinc-900">Welcome {name}!</Text>
<Text class="mt-3 text-zinc-600">
Better Svelte Email converts Svelte components into email-safe HTML.
</Text>
<Row class="mt-6">
<Button
href="https://better-svelte-email.konixy.fr/docs"
pX={24}
pY={14}
class="mr-2 rounded-lg bg-orange-600 text-white"
>
Explore the docs
</Button>
<Button
href="https://github.com/Konixy/better-svelte-email"
pX={24}
pY={14}
class="ml-2 rounded-lg border border-zinc-200 text-zinc-900"
>
or the GitHub
</Button>
</Row>
</Section>
</Container>
</Body>
</Html> Render and send it
Render the email using the Renderer class and send it using your preferred email provider (resend in this example).
// src/routes/api/send-email/+server.ts
import Renderer from 'better-svelte-email/render';
import { Resend } from 'resend';
import { env } from '$env/dynamic/private';
import WelcomeEmail from '$lib/emails/welcome.svelte';
const { render } = new Renderer();
const resend = new Resend(env.PRIVATE_RESEND_API_KEY);
export async function POST({ request }) {
const { name, email } = await request.json();
const html = await render(WelcomeEmail, { props: { name } });
// Send email using your preferred service (Resend, SendGrid, etc.)
await resend.emails.send({
from: 'onboarding@resend.dev',
to: email,
subject: 'Welcome!',
html
});
return new Response('Email sent');
} Plain text version
You can also render the email as plain text using the toPlainText function for better accessibility.
import { toPlainText } from 'better-svelte-email/render';
const plainText = toPlainText(html);
await resend.emails.send({
from: 'onboarding@resend.dev',
to: email,
subject: 'Welcome!',
html,
// Add the plain text version to the email
text: plainText
}); Further configuration
Tailwind configuration
You can pass a Tailwind configuration object to the Renderer class.
const tailwindConfig = {
theme: { extend: { colors: { brand: '#FF3E00' } } }
};
const { render } = new Renderer({ tailwindConfig }); Preview your emails
Better Svelte Email provides an EmailPreview component that you can use to preview your emails in the browser.
See the Email Preview section for a guide on how to use it.