Mengirim Email di NestJS
Membuat dan mengirim email sederhana di NestJS dengan menggunakan Nodemailer
Pada artikel kali ini kita akan membuat fitur untuk mengirim email sederhana di project NestJS
dengan menggunakan Nodemailer atau @nestjs-modules/mailer (NestJS). Untuk keperluan testing kali ini kita akan menggunakan fake SMTP service
yaitu ethereal.email .
Persiapan Project
Pertama kita install terlebih dahulu nesjs-cli
jika belum ada, dengan perintah ini
npm i -g @nestjs/cli
Setelah terinstall, kita buat sebuah project dengan nama email menggunakan perintah
nest new email
Setelah project kita buat, lalu kita install depedency
atau library
yang dibutuhkan, seperti Nodemailer
dan @nestjs-modules/mailer
npm i --save @nestjs-modules/mailer nodemailer
npm install --save-dev @types/nodemailer
Membuat Akun Fake SMTP Service Ethereal
Disini karena kita hanya untuk mencoba, kita akan menggunakan Fake SMTP Service
milik ethereal.email.
Pertama kita pergi ke halaman web https://ethereal.email/.
Lalu kita klik pada button Create Ethereal Account. Setelah itu akan muncul tampilan seperti ini.
Simpan baik-baik account credentials diatas, karena hal tersebut akan kita gunakan untuk konfigurasi pada project kita.
Membuat Mail Module
Setelah selesai menginstall depedency
yang dibutuhkan, selanjutnya kita bisa membuat file-file kebutuhan untuk mail, seperti Mail Module
, Mail Service
dan Mail Controller
.
Di NestJS, kita bisa menggunakan perintah
nest g module mail/mail
nest g service mail/mail
nest g controller mail/mail
untuk membuat sebuah module, service dan controller
. Dengan menggunakan perintah di atas NestJS akan otomatis akan membuatkan kita folder dan juga file module, service atau controller
kita di dalam folder /src
.
Atau jika kita ingin membuat sebuah module, service, controller, entity dan dto
secara langsung kita bisa menggunakan perintah.
nest g resource mail/mail
Setelah kita membuat file MailModule
, selanjutnya kita akan mengimport Mailer Module
milik @nestjs-modules/mailer
dan juga Nodemailer
di dalam MailModule
atau file mail.module.ts
yang telah kita buat/generate tadi.
Di dalam MailModule
ini kita akan konfigurasi untuk mail server melalui SMTP
.
import { Module } from '@nestjs/common';
import { MailService } from './mail.service';
import { MailController } from './mail.controller';
import { MailerModule } from '@nestjs-modules/mailer';
@Module({
imports: [
MailerModule.forRoot({
transport: {
host: 'smtp.ethereal.email',
port: 587,
auth: {
user: 'dock.haley@ethereal.email',
pass: 'SPEHmbUXgDZENCQGfW',
},
tls: {
rejectUnauthorized: false,
},
},
}),
],
providers: [MailService],
controllers: [MailController],
exports: [MailService], // Export Mail Service untuk digunakan sebagai Depedency Injection
})
export class MailModule {}
Untuk konfigurasi seperti host, port, auth dan tls
dapat disesuaikan dengan yang kita dapat ketika create account ethereal
yang telah kita buat.
Email Service
Nah untuk fungsi mengirim email kita akan buat di file mail.service.ts
import { MailerService } from '@nestjs-modules/mailer';
import { Injectable } from '@nestjs/common';
@Injectable()
export class MailService {
constructor(private mailerService: MailerService) {}
async sendEmail(email: string) {
const bodyEmail = 'Haloo, ini contoh kirim email';
await this.mailerService.sendMail({
from: 'rifqipratama9@gmail.com',
to: email,
subject: 'Contoh Kirim Email NestJS',
text: bodyEmail,
html: `<p>${bodyEmail}</p>`,
});
}
}
Pada file mail.service.ts
di atas kita menggunakan MailerService
agar kita bisa menggunakan method method yang ada pada MailerService
milik @nestjs-modules/mailer.
Contohnya pada kode di atas untuk mengirim email kita bisa menggunakan method sendMail
milik MailerService
yang didalamnya kita bisa mengatur seperti
from: nama atau asal pengirim email
to: tujuan email dikirimkan
subject: nama subject pada email yang dikirim
text: isi dari body email
html: isi dari body email dalam bentuk html
Untuk template email sendiri kita bisa menggunakan library untuk template adapter seperti Pug atau EJS. Namun, pada tulisan kali ini kita hanya mencoba untuk mengirim email sederhana saja. Apabila ada kesempatan di lain waktu kita akan mencoba menggunakan email template.
Memanggil Mail Service
MailService
yang telah kita buat bisa kita digunakan baik di service lain atau pun di controller
. Kali ini kita akan memanggilnya langsung di mail.controller.ts
.
import { Body, Controller, Post } from '@nestjs/common';
import { MailService } from './mail.service';
@Controller('mail')
export class MailController {
constructor(private mailService: MailService) {}
@Post('sendEmail')
sendEmail(@Body() body: { email: string }) {
try {
this.mailService.sendEmail(body.email);
return { message: 'Email berhasil dikirim' };
} catch (e) {
return e;
}
}
}
Pertama kita memanggil MailService
dengan menggunakan constructor
. Selanjutnya kita menggunakan method POST
untuk menggunakan atau mengirimkan email.
Pada method sendEmail
diatas kita menerima parameter
berupa body
dengan isi yaitu email
. Karena pada MailService
yang telah kita buat sebelumnya, pada method sendEmail
kita menerima parameter yaitu email. Email ini adalah nama alamat email yang akan kita kirim.
Di dalam MailController
diatas kita menggunakan try catch
, agar ketika terjadi error
program yang kita jalankan tidak akan crash
dan juga agar lebih mudah menangkap error yang terjadi.
Jika email berhasil dikirim, maka akan mereturn message
dengan isi "Email berhasil dikirim", apaila gagal maka akan mengirimkan pesan error.
Test Kirim Email
Sekarang jika kita jalankan server NestJS
kita
npm run start:dev
Lalu, kita panggil dengan menggunakan Postman
. Jika berhasil, maka akan muncul seperti tampilan dibawah.
Lalu, kita cek pada bagian message di website ethereal.email. Seharusnya email yang telah kita kirim tadi sudah muncul.
Apabila kita buka, maka isinya adalah sesuai dengan yang kita kirim pada MailService
atau mail.service.ts
Sekarang kita sudah berhasil mengirimkan email sederhana di project NestJS. Selanjutnya apabila ada kesempatan kita akan menggunakan template email baik itu menggunakan Pug ataupun EJS. Cukup sekian, Terima Kasih.