This NestJS Package Turns Email Setup from Nightmare to No-Brainer

Written by axotion | Published 2025/01/21
Tech Story Tags: nestjs | nestjs-tutorial | nestjs-starter-guide | nestjs-module | typescript | javascript | nestjs-mailer-package | hackernoon-top-story

TLDRThe Nestjs-mailer package is a modern tool for building dynamic email templates and sending emails effortlessly. It leverages the power of React and Nodemailer, making it a developer-friendly tool.via the TL;DR App

Sending emails is a critical functionality in many applications, whether for user notifications, transactional updates, or marketing purposes.

However, implementing email solutions can sometimes be cumbersome, as you have to integrate mailer with template language, check for dependencies...

But!

With theĀ @nestixis/nestjs-mailerĀ package, you can simplify this process while ensuring flexibility and reliability.

This package leverages the power of React and Nodemailer, making it a modern and developer-friendly tool for building dynamic email templates and sending emails effortlessly.

Let's dive into how you can set it up and use it :)

Installing the Package

To get started, you need to install theĀ nestjs-mailerpackage in your NestJS application. This package is available via npm, making installation quick and straightforward. Run the following command in your terminal:

npm install @nestixis/nestjs-mailer

Configuring the Module

Once the package is installed, the next step is to configure theĀ MailerSdkModuleĀ in your application.

Configuration is straightforward, and for testing purposes, you can use a tool likeĀ MailcatchĀ to capture and preview emails without sending them to real users.

Here's an example of how to set it up:

import { MailerSdkModule } from '@nestixis/nestjs-mailer';
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [
    MailerSdkModule.register({
      auth: {
        user: 'username',
        password: 'password',
        host: 'sandbox-smtp.mailcatch.app',
        port: 2525,
        ssl: false,
      },
      from: '[email protected]',
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Creating an Email Template

To make your emails visually appealing and more dynamic, you can combine templates with React, and package@react-email/components, allows you to design such email templates.

**But before that, you should call the file invite-admin-with-account-template.tsx and set
**

"jsx": "react"

in your tsconfig.json

Here's an example of a template for inviting a new admin user:

import {
  Body,
  Container,
  Head,
  Html,
  Img,
  Link,
  Section,
  Text,
} from '@react-email/components';
import * as React from 'react';

export default function InviteAdminWithAccountTemplate({
  translation,
  language,
  invitationHref,
  passwordHref,
  logoUrl,
}) {
  return (
    <Html lang={language}>
      <Head>
        <style>{/* Your custom styles here */}</style>
      </Head>
      <Body style={{ fontFamily: 'Arial, sans-serif' }}>
        <Section>
          <Container>
            {logoUrl ? (
              <Img src={logoUrl} alt="Logo" />
            ) : (
              <Text>{translation.titleInside}</Text>
            )}
            <Text>{translation.contentPart1}</Text>
            <Text>{translation.contentPart2}</Text>
            <Text>
              {translation.contentPart3.subpart1}
              <Link href={invitationHref}>
                {translation.contentPart3.subpart2}
              </Link>
              {translation.contentPart3.subpart3}
            </Text>
            <Text>
              {translation.contentPart4.subpart1}
              <Link href={passwordHref}>
                {translation.contentPart4.subpart2}
              </Link>
            </Text>
          </Container>
        </Section>
      </Body>
    </Html>
  );
}

Injecting the Email Sender

After creating your email template, the next step is to send the email. To do this, you inject the email sender into your service.

import {
  EmailSenderInterface,
  MAILER_SDK_CLIENT,
} from '@nestixis/nestjs-mailer';
import { Inject, Injectable } from '@nestjs/common';
import InviteAdminWithAccountTemplate from './invite-admin-with-account-template';

@Injectable()
export class AppService {
  constructor(
    @Inject(MAILER_SDK_CLIENT)
    private readonly emailSender: EmailSenderInterface,
  ) {}

  async send(): Promise<void> {
    const translations = {
      titleInside: { subpart1: 'Welcome', subpart2: ' to the platform!' },
      contentPart1: 'Hello',
      contentPart2: 'Your admin account has been created.',
      contentPart3: {
        subpart1: 'Click here to activate your account: ',
        subpart2: 'Activate',
        subpart3: '.',
      },
      contentPart4: {
        subpart1: 'To set your password, click here: ',
        subpart2: 'Set password',
      },
    };

    const emailContent = await InviteAdminWithAccountTemplate({
      translation: translations,
      language: 'en',
      invitationHref: 'xxx',
      passwordHref: 'xxx',
      logoUrl: 'logo.png',
    });

    await this.emailSender.sendEmail(
      '[email protected]',
      'Admin Invitation',
      emailContent,
    );
  }
}

Done!

That's it! You've successfully integratedĀ nestjs-mailerĀ into your application.

For more details and advanced features, check out theĀ NestJS mailer GitHub repository.


Written by axotion | I’m a 2X-year-old tech dude from Poland, and this is my blog about tech stuff: NestJS, Node
Published by HackerNoon on 2025/01/21