# Mailtrap Node.js client - Official  [](https://github.com/railsware/mailtrap-nodejs/actions/workflows/test.yml) [](https://www.npmjs.com/package/mailtrap) [](https://www.npmjs.com/package/mailtrap) ## Prerequisites To get the most out of this official Mailtrap.io Node.js SDK: - [Create a Mailtrap account](https://mailtrap.io/signup) - [Verify your domain](https://mailtrap.io/sending/domains) ## Installation You can install the package via [npm](https://www.npmjs.com/) or [yarn](https://yarnpkg.com/): ```bash npm install mailtrap # or, if you are using Yarn: yarn add mailtrap ``` ## Usage You should use ES modules or CommonJS imports in your application to load the package. ### Minimal usage (Transactional sending) The quickest way to send a single transactional email with only the required parameters: ```ts import { MailtrapClient } from "mailtrap"; const mailtrap = new MailtrapClient({ token: process.env.MAILTRAP_API_KEY, // You can create your API key here https://mailtrap.io/api-tokens }); mailtrap .send({ from: { name: "Mailtrap Test", email: "sender@example.com" }, to: [{ email: "recipient@example.com" }], subject: "Hello from Mailtrap Node.js", text: "Plain text body", }) .then(console.log) .catch(console.error); ``` ### Sandbox vs Production (easy switching) Mailtrap lets you test safely in the Email Sandbox and then switch to Production (Sending) with one flag. Example `.env` variables (or export in shell): ```bash MAILTRAP_API_KEY=your_api_token # https://mailtrap.io/api-tokens MAILTRAP_USE_SANDBOX=true # true/false toggle MAILTRAP_INBOX_ID=123456 # Only needed for sandbox ``` Bootstrap logic: ```ts import { MailtrapClient } from "mailtrap"; const apiKey = process.env.MAILTRAP_API_KEY; const isSandbox = process.env.MAILTRAP_USE_SANDBOX === "true"; const inboxId = isSandbox ? Number(process.env.MAILTRAP_INBOX_ID) : undefined; // required only for sandbox const client = new MailtrapClient({ token: apiKey, sandbox: isSandbox, testInboxId: inboxId, // undefined is ignored for production }); client .send({ from: { name: "Mailtrap Test", email: isSandbox ? "sandbox@example.com" : "no-reply@your-domain.com", }, to: [{ email: "recipient@example.com" }], subject: isSandbox ? "[SANDBOX] Demo email" : "Welcome onboard", text: "This is a minimal body for demonstration purposes.", }) .then(console.log) .catch(console.error); ``` Bulk stream example (optional) differs only by setting `bulk: true`: ```ts const bulkClient = new MailtrapClient({ token: apiKey, bulk: true }); ``` Recommendations: - Toggle sandbox with `MAILTRAP_USE_SANDBOX`. - Use separate API tokens for Production and Sandbox. - Keep initialisation in a single factory object/service so that switching is centralised. ### Full-featured usage example ```ts import { MailtrapClient } from "mailtrap"; import fs from "node:fs"; import path from "node:path"; // Init Mailtrap client depending on your needs const mailtrap = new MailtrapClient({ token: process.env.MAILTRAP_API_KEY, // your API token bulk: false, // set to true for bulk email sending (false by default) sandbox: false, // set to true for sandbox mode (false by default) testInboxId: undefined, // optional, only for sandbox mode }); const welcomeImage = fs.readFileSync(path.join(__dirname, "welcome.png")); mailtrap .send({ category: "Integration Test", custom_variables: { user_id: "45982", batch_id: "PSJ-12", }, from: { name: "Mailtrap Test", email: "example@your-domain-here.com" }, reply_to: { email: "reply@your-domain-here.com" }, to: [{ name: "Jon", email: "email@example.com" }], cc: [{ email: "mailtrapqa@example.com" }, { email: "staging@example.com" }], bcc: [{ email: "mailtrapdev@example.com" }], subject: "Best practices of building HTML emails", text: "Hey! Learn the best practices of building HTML emails and play with ready-to-go templates. Mailtrap's Guide on How to Build HTML Email is live on our blog", html: `
Hey
Learn the best practices of building HTML emails and play with ready-to-go templates.
Mailtrap's Guide on How to Build HTML Email is live on our blog
`,
attachments: [
{
filename: "welcome.png",
content_id: "welcome.png",
disposition: "inline",
content: welcomeImage,
},
],
headers: {
"X-Message-Source": "domain.com",
"X-Mailer": "Mailtrap Node.js Client",
},
})
.then(console.log)
.catch(console.error);
// OR Template email sending
mailtrap
.send({
from: { name: "Mailtrap Test", email: "example@your-domain-here.com" },
reply_to: { email: "reply@your-domain-here.com" },
to: [{ name: "Jon", email: "example@gmail.com" }],
template_uuid: "bfa432fd-0000-0000-0000-8493da283a69",
template_variables: {
user_name: "Jon Bush",
next_step_link: "https://mailtrap.io/",
get_started_link: "https://mailtrap.io/",
onboarding_video_link: "some_video_link",
company: {
name: "Best Company",
address: "Its Address",
},
products: [
{
name: "Product 1",
price: 100,
},
{
name: "Product 2",
price: 200,
},
],
isBool: true,
int: 123,
},
})
.then(console.log)
.catch(console.error);
```
## Nodemailer Transport
> NOTE: [Nodemailer](https://www.npmjs.com/package/nodemailer) is needed as a dependency.
```sh
npm install nodemailer
# or, if you are using Yarn:
yarn add nodemailer
```
If you're using TypeScript, install `@types/nodemailer` as a `devDependency`:
```sh
npm install -D @types/nodemailer
# or, if you are using Yarn:
yarn add --dev @types/nodemailer
```
You can provide Mailtrap-specific keys like `category`, `custom_variables`, `template_uuid`, and `template_variables`.
See transport usage below:
- [Transport](examples/sending/transport.ts)
## Supported functionality & Examples
Email API:
- Send an email (Transactional stream) – [`sending/minimal.ts`](examples/sending/minimal.ts)
- Send an email (Bulk stream) – [`bulk/send-mail.ts`](examples/bulk/send-mail.ts)
- Send an email with a Template (Transactional) – [`sending/template.ts`](examples/sending/template.ts)
- Send an email with a Template (Bulk) – [`bulk/send-mail.ts`](examples/bulk/send-mail.ts)
- Batch send (Transactional) – [`batch/transactional.ts`](examples/batch/transactional.ts)
- Batch send (Bulk) – [`batch/bulk.ts`](examples/bulk/bulk.ts)
- Batch send with Template (Transactional) – [`batch/template.ts`](examples/batch/template.ts)
- Batch send with Template (Bulk) – [`batch/template.ts`](examples/batch/template.ts)
- Sending domain management CRUD – [`sending-domains/everything.ts`](examples/sending-domains/everything.ts)
- Sending stats (aggregated and by domain, category, ESP, date) – [`stats/everything.ts`](examples/stats/everything.ts)
- Email logs (list with filters, get by message ID) – [`email-logs/everything.ts`](examples/email-logs/everything.ts)
- Webhooks CRUD – [`webhooks/everything.ts`](examples/webhooks/everything.ts)
- Verifying webhook signatures – [`webhooks/verify-signature.ts`](examples/webhooks/verify-signature.ts)
Email Sandbox (Testing):
- Send an email (Sandbox) – [`testing/send-mail.ts`](examples/testing/send-mail.ts)
- Send an email with a Template (Sandbox) – [`testing/template.ts`](examples/testing/template.ts)
- Batch send (Sandbox) – [`batch/sandbox.ts`](examples/batch/sandbox.ts)
- Batch send with Template (Sandbox) – [`batch/sandbox.ts`](examples/batch/sandbox.ts)
- Message management CRUD – [`testing/messages.ts`](examples/testing/messages.ts)
- Inbox management CRUD – [`testing/inboxes.ts`](examples/testing/inboxes.ts)
- Project management CRUD – [`testing/projects.ts`](examples/testing/projects.ts)
- Attachments operations – [`testing/attachments.ts`](examples/testing/attachments.ts)
Contact management:
- Contacts CRUD & listing – [`contacts/everything.ts`](examples/contacts/everything.ts)
- Contact lists CRUD – [`contact-lists/everything.ts`](examples/contact-lists/everything.ts)
- Custom fields CRUD – [`contact-fields/everything.ts`](examples/contact-fields/everything.ts)
- Import/Export – [`contact-imports/everything.ts`](examples/contact-imports/everything.ts), [`contact-exports/everything.ts`](examples/contact-exports/everything.ts)
- Events – [`contact-events/everything.ts`](examples/contact-events/everything.ts)
General API:
- Templates CRUD – [`templates/everything.ts`](examples/templates/everything.ts)
- Suppressions (find & delete) – [`sending/suppressions.ts`](examples/sending/suppressions.ts)
- Billing info – [`general/billing.ts`](examples/general/billing.ts)
- Accounts info – [`general/accounts.ts`](examples/general/accounts.ts)
- Permissions listing – [`general/permissions.ts`](examples/general/permissions.ts)
- Users listing – [`general/account-accesses.ts`](examples/general/account-accesses.ts)
- API tokens CRUD & reset – [`general/api-tokens.ts`](examples/general/api-tokens.ts)
- Sub-accounts (list & create) – [`sub-accounts/everything.ts`](examples/sub-accounts/everything.ts)
## Contributing
Bug reports and pull requests are welcome on [GitHub](https://github.com/railsware/mailtrap-nodejs). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](CODE_OF_CONDUCT.md).
## License
The package is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
## Code of Conduct
Everyone interacting in the Mailtrap project's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the [code of conduct](CODE_OF_CONDUCT.md).
## Compatibility with previous releases
Versions of this package up to 2.0.2 were an [unofficial client](https://github.com/vchin/mailtrap-client) developed by [@vchin](https://github.com/vchin). Package version 3 is a completely new package.