📚

NestJSでメール送信 (SMTP)

2023/01/04に公開

はじめに

NestJSで nest-modules/mailer を使用してメール送信する方法をメモとして残しておく。

パッケージのインストール

NestJSアプリケーションに @nestjs-modules/mailer と ピュア依存である nodemailer を追加する。
また、メールのテンプレートを作成するために必要なテンプレートエンジンである handlebars, pug, ejs のいずれかを追加する。

$ yarn add @nestjs-modules/mailer nodemailer
$ yarn add @types/nodemailer --dev

# pick one template adapter and install
$ yarn add handlebars
# or
$ yarn add pug
# or
$ yarn add ejs

今回は、テンプレートエンジンに handlebars を使用する。

Mail Module

Nest CLI で mail モジュールとサービスを作成し、続いてテンプレートフォルダを作成する。

$ nest g module mail
$ nest g service mail --no-spec

$ mkdir src/mail/templates

MailerModule を MailModule にインポートし、SMTPでメール送信をするための設定を行う。

mail.module.ts
import { Module } from '@nestjs/common';
import { MailerModule } from '@nestjs-modules/mailer';
import { MailService } from './mail.service';
import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter';
import { join } from 'path';

@Module({
  imports: [
    MailerModule.forRoot({
      // SMPT の設定
      transport: {
        host: process.env.MAIL_HOST,
        auth: {
          user: process.env.MAIL_USER,
          pass: process.env.MAIL_PASSWORD,
        },
      },
       // デフォルトでの送信元メールアドレスの設定
      defaults: {
        from: process.env.MAIL_FROM,
      },
      // テンプレートの設定
      template: {
        dir: join(__dirname, '/templates'),
        adapter: new HandlebarsAdapter(),
        options: {
          strict: true,
        },
      },
    }),
  ],
  providers: [MailService],
  exports: [MailService],
})
export class MailModule {}

デフォルトの送信元メールアドレスは、後でオーバーライドできる。

テンプレートの設定

メール本文のテンプレートを作成するために、src/mail/templatestest.hbs を作成する。

test.hbs
<p>テストメール</p>
<p>Hello {{name}}!<p>

{{name}} の部分は handlebars の書き方。
メール送信時に name に入れる値を指定する。

ビルド時に .hbs ファイルを出力させるために nest-cli.json に設定を加える。

nest-cli.json
{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": ["mail/templates/**/*"], // 👈  or "**/*.hbs" all files ending with .hbs
    "watchAssets": true // 🤖 copy assets in watch mode
  }
}

Mail Service

MailerService を MailService に追加し、メール送信のロジックを実装する。
先ほど作成した test.hbs のテンプレートを使用してメール送信をしてみる。

mail.service.ts
import { Injectable } from '@nestjs/common';
import { MailerService } from '@nestjs-modules/mailer';

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

  async sendTest(mailAdress: string, name: string) {
    await this.mailerService.sendMail({
      to: mailAdress,
      subject: 'テストメール',
      template: './test',
      context: {
        name: 'テスト'
      },
    });
  }
}

test.hbs{{name}} 部分に入れる値の設定は、context オブジェクトで指定する。

参考記事

https://www.learmoreseekmore.com/2022/05/part-1-email-sending-in-nestjs-app.html
https://notiz.dev/blog/send-emails-with-nestjs

Discussion