/nestjs-mailer-react-adapter

๐Ÿ“จ Build and send emails in Nest framework using React.js

Primary LanguageTypeScriptMIT LicenseMIT

Nest Logo

๐Ÿ“จ Build and send emails in Nest framework using React.js

NPM Version Package License NPM Downloads

Features

  • ๐Ÿฆพ Write your email templates in React and TypeScript

  • ๐Ÿ“ฌ No more template not found / sending blank emails.

  • ๐Ÿ”ฐ No more missing context / variables from template.

  • ๐Ÿงช Write testable templates intended for email clients.

  • ๐Ÿ’Œ Built on top of react-email โ€” the next generation of writing emails.

Installation

This library is an adapter for the @nestjs-modules/mailer module, so we'll install the dependencies alongside by running the command below.

npm i @webtre/nestjs-mailer-react-adapter @nestjs-modules/mailer nodemailer

Getting Started

To add support for React to your project, modify tsconfig.json

{
  "compilerOptions": {
    // add this line
    "jsx": "react-jsx"
  }
}

Configuration

// src/app.module.ts
import { Module } from "@nestjs/common";
import { MailerModule } from "@nestjs-modules/mailer";
import { ReactAdapter } from "@webtre/nestjs-mailer-react-adapter";

@Module({
  imports: [
    MailerModule.forRoot({
      transport: {
        host: "smtp.domain.com",
        port: 2525,
        secure: false,
        auth: {
          user: "user@domain.com",
          pass: "password",
        },
      },
      defaults: {
        from: '"Webtre Technologies" <hello@domain.com>',
      },
      template: {
        dir: __dirname + "/templates",
        // Use the adapter
        adapter: new ReactAdapter(),

        // Or with optional config
        adapter: new ReactAdapter({
          pretty: false,
          plainText: true,
          htmlToTextOptions: {
            wordwrap: 130,
            limits: {
              ellipsis: "...",
            },
          },
        }),
      },
    }),
  ],
})
export class AppModule {}

To see more options that can be passed to the htmlToTextOptions object, click here.

Service Provider

import { Injectable } from '@nestjs/common';
import { MailerService } from '@nestjs-modules/mailer';

@Injectable()
export class ExampleService {
  constructor(private readonly mailerService: MailerService) {}

  async public example(): Promise<void> {
    await this.mailerService
      .sendMail({
        to: 'john@domain.com',
        subject: 'Testing react template',
        template: 'welcome', // The compiled extension is appended automatically.
        context: { // Data to be passed as props to your template.
          code: '123456',
          name: 'John Doe',
        },
      });
  }
}

React Template

// src/templates/welcome.tsx
interface Props {
  code: string;
  name: string;
}

export default function Welcome({ name, code }: Props) {
  return (
    <div>
      Hi {name}, thanks for signing up. Your code is {code}
    </div>
  );
}

Examples

You could also check the examples folder in this repo for a working usage example and how to set it up with SWC using gulp.

Credits

License

MIT License ยฉ 2022 Webtre Technologies