Skip to content

Documentation

Send React Email templates.

Render a React Email component to HTML and plain text, and send both parts.

Before you start

You need a verified sending domain (see Domains) and an API key (under API keys in the dashboard; it is shown once). Keep the key in an environment variable on your server, never in code that runs in a browser or an app.

Install

Install the Mailtruss client, React Email's components and renderer, and React.

Terminal
npm install mailtruss @react-email/components @react-email/render react

The template and the send

Render a React Email component to HTML and plain text with @react-email/render, then send both parts. Sending a plain-text part as well as the HTML is good practice.

welcome-email.tsx
import { Body, Button, Container, Heading, Html, Text } from "@react-email/components";
import { render } from "@react-email/render";
import { MailClient } from "mailtruss";
​
function Welcome({ name }: { name: string }) {
return (
<Html>
<Body style={{ fontFamily: "sans-serif" }}>
<Container>
<Heading>Welcome, {name}</Heading>
<Text>Your account is ready.</Text>
<Button
href="https://yourdomain.com/start"
style={{ background: "#533afd", color: "#fff", padding: "10px 16px" }}
>
Get started
</Button>
</Container>
</Body>
</Html>
);
}
​
const mail = new MailClient({ apiKey: process.env.MAILTRUSS_API_KEY! });
const element = <Welcome name="Ada" />;
​
export const sent = await mail.emails.send({
from: "Acme <hello@yourdomain.com>",
to: "delivered@mailtruss.test",
subject: "Welcome to Acme",
html: await render(element),
text: await render(element, { plainText: true }),
});

Try it without sending real mail

Send to delivered@mailtruss.test first. It works before any domain is verified and reaches no real mailbox, so you can check your code and see the recorded timeline. Then try bounced@mailtruss.test to see what a bounce looks like. All the test addresses are listed under Sending.

See what happened

Open the message under Emails in the dashboard: it shows the recorded timeline, what each event proves, and a diagnosis if something went wrong. Or fetch it with GET /api/v1/emails/:id/events. To be told as it happens, add a webhook.

If it fails

API requests answer with an error name and message. The common ones:

  • 403 invalid_api_key or 401 missing_api_key: the key is wrong, revoked or not sent. Send it as Authorization: Bearer ms_live_….
  • 403 domain_not_verified: the from address is on a domain that is not verified. Publish the DNS records and re-check.
  • 422 validation_error: fix the field the message names. Nothing was sent and no quota was used.
  • 429 rate_limit_exceeded: back off for the Retry-After header. See rate limits.

Problems that happen after a message is accepted (bounces, complaints) are explained under delivery errors.

Other guides

Last updated

Something wrong or unclear on this page?

Report an issue