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-mailer
package 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: 'your-email@example.com',
}),
],
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(
'test@test.com',
'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.
Top comments (0)