📚
NestJSでメール送信 (SMTP)
はじめに
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/templates
に test.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
オブジェクトで指定する。
参考記事
Discussion