NestJSでのメール送信をマスターする:Nodemailerを使ったステップバイステップガイド
著者:Okure U. Edet
NestJSを学んでいる最中、Nodemailerを使ってテストメールを送れるようになりたいと考えていました。しかし、NestJSアプリケーションの中でこれを実現するには苦労しました。インターネットで解決策を探し、さまざまな調査を重ねた結果、ついに答えを見つけました。実際にはとてもシンプルな方法だったのです。
この記事では、その解決策を紹介します。ぜひあなたのNestJSプロジェクトでも活用してください。
目次
- NestJSプロジェクトのセットアップ方法
- アプリへのNodemailer設定方法
- Nodemailerでメールを送信する方法
- まとめ
NestJSプロジェクトのセットアップ方法
理想的なユースケースとして、「パスワードを忘れた場合」のルートにユーザーがアクセスすると、そのユーザーのメールアドレスにリンクが送られ、そのリンクからパスワードを再設定できるという流れがあります。この記事では、Nodemailerを使ってこの仕組みを動作させるテストケースを紹介します。
お好みのIDEを開くか、ターミナルに移動して、以下のコマンドを入力してください。
$ npm i -g @nestjs/cli
$ nest new nodemailer-app
上記のコマンドにより、nodemailer-appという新しいプロジェクトが生成されます。
続いて、プロジェクトフォルダに移動し、Nodemailer関連のパッケージをインストールします。
$ npm i --save @nestjs-modules/mailer nodemailer
$ npm i --save-dev @types/nodemailer
最初のコマンドでメーラー本体とNestJS連携モジュールを、2つ目のコマンドでTypeScript用の型定義をインストールしています。
アプリへのNodemailer設定方法
作業を進める前に、mailtrap.ioのアカウントを持っていることを確認してください。アカウントをお持ちならログインし、Email Testing(メールテスト)に移動します。受信箱(inbox)がない場合は新しく作成しましょう。受信箱を開くと、アプリケーションでNodemailerを設定するために必要な認証情報が表示されます。
プロジェクトディレクトリにあるappモジュールファイルを開き、パッケージを設定します。
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthModule } from './auth/auth.module';
import { MailerModule } from '@nestjs-modules/mailer';
@Module({
imports: [
AuthModule,
MailerModule.forRoot({
transport: {
host: process.env.EMAIL_HOST,
auth: {
user: process.env.EMAIL_USERNAME,
pass: process.env.EMAIL_PASSWORD,
},
},
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
このコードでは、@nestjs-modules/mailerからMailerModuleをインポートし、そのforRoot()メソッドを呼び出しています。forRoot()メソッドの中では、ホスト情報と認証情報を含むtransportプロパティを指定します。
mailtrap.ioの受信箱に表示される認証情報から、ホスト・ポート・ユーザー名・パスワードを取得することを忘れないでください。
これらの認証情報は.envファイルにまとめて管理するのがおすすめです。NestJSで適切に.envファイルを読み込むために、以下のパッケージをインストールします。
$ npm i --save @nestjs/config
次に、app.module.tsファイルでConfigModuleをインポートします。
import { ConfigModule } from '@nestjs/config';
引き続き同じファイル内で、imports配列にConfigModuleを追加します。
// imports配列にconfigモジュールを含める
@Module({
imports: [
ConfigModule.forRoot({ envFilePath: '.env', isGlobal: true }),
],
controllers: [AppController],
providers: [AppService],
})
isGlobal: trueを指定することで、アプリケーション全体のどのモジュールからも環境変数にアクセスできるようになります。
Nodemailerでメールを送信する方法
Nodemailerの設定が完了したら、いよいよメールを送信してみましょう。
app.service.tsファイルに、以下のコードを貼り付けてください。
import { MailerService } from '@nestjs-modules/mailer';
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
constructor(private readonly mailService: MailerService) {}
sendMail() {
const message = `Forgot your password? If you didn't forget your password, please ignore this email!`;
this.mailService.sendMail({
from: 'Kingsley Okure <kingsleyokgeorge@gmail.com>',
to: 'joanna@gmail.com',
subject: `How to Send Emails with Nodemailer`,
text: message,
});
}
}
app.service.tsファイルでは、MailerServiceをコンストラクタ経由で注入(依存性注入)し、クラス内でメール送信に使用しています。MailerServiceが持つsendMail関数はオブジェクトを引数に受け取り、そのオブジェクトにはfrom(送信元)、to(宛先)、subject(件名)、text(本文)の各プロパティが含まれます。
続いて、app.controller.tsファイルに以下のコードを貼り付けます。
import { Controller, Get, Res } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
sendMailer(@Res() response: any) {
const mail = this.appService.sendMail();
return response.status(200).json({
message: 'success',
mail,
});
}
}
コントローラー側では、サービスで作成したsendMail関数を呼び出すGETリクエストを作成しているだけです。
本来、実際のアプリケーションでは、これらの処理はすべて「パスワードを忘れた場合」の機能内で行われます。ユーザーが該当のルートをクリックすると、メールが自動的に送信される仕組みです。
この簡単なセットアップをテストするには、Postmanを開いてlocalhost:3000にアクセスし、Sendをクリックします。
その後、mailtrap.ioの受信箱を確認すると、送信されたメッセージが届いているはずです。
まとめ
この記事では、複数の人に一度にメールを送信できるよう開発者を支援するソフトウェア「Nodemailer」を使ってメールを送信する方法を学びました。
また、NestJSアプリケーションの文脈でNodemailerをセットアップし、設定する方法についても理解できました。環境変数の管理や依存性注入といったNestJSの基本的なプラクティスも同時に身につけることができます。
著者とつながりたい方は、TwitterまたはLinkedInでフォローしてください。
無料でプログラミングを学ぼう。freeCodeCampのオープンソースカリキュラムは、40,000人以上の人々を開発者としての就職へと導いてきました。さあ、始めましょう。
-
Outlookのルール機能を活用してメール受信トレイを自動整理する方法
生活の中には面倒な「ルール」も存在しますが、Outlookのようなアプリケーションにおいては、ルールはまさに救世主です。時間を節約し、受信トレイの散らかりを防いでくれる強力な味方となります。デスクトップ版のOutlook 2016でも、Web版のOutlook.comでも、ルール機能を活用すればメールを常に整理された状態に保てます。 Outlookのルールとは? Outlookにおける「ルール」とは、メールの移動やフラグ付けを自動的に行ったり、特定のメールを受信した際に通知を表示したりできる便利なツールです。一度ルールを設定しておけば、受信トレイに届く新しいメッセージは、設定した条件に従って
-
【解決策】Gmailで「ウイルス警告」が表示され添付ファイルをダウンロードできない場合の対処法
Googleが添付ファイルに関するポリシーを厳格化したことに伴い、多くのユーザーがGmailで添付ファイルをダウンロードできなくなるという問題に直面しています。以前はダウンロードできた添付ファイルが、突然ブロックされるケースも報告されています。この変更は、ユーザーがうっかりマルウェア(悪意のあるファイル)をPCに取り込んでしまうことを防ぐ目的で行われたものです。通常、Zip形式の圧縮ファイルや、悪意のあるマクロが埋め込まれた文書ファイルなどは自動的にブロックされます。しかし実際には無害なファイルであっても、Googleのフィルターによって誤って遮断され、ダウンロードできないケースがあるのが現状