nodemailer でメールを送信する方法

ここでは Node.js 上で実行される JavaScript アプリケーションから、nodemailer というモジュールを利用してメールを送信する方法を説明します。

nodemailer とは?

Nodemailer は Node.js アプリケーションからメールを送信するためのモジュールです。 オープンソースで公開されており、MIT ライセンスで誰でも利用できます。

特徴として、依存モジュールが無い上に、TLS サポート、HTML メールのサポート、添付ファイルをサポートするなどとても多機能です。

インストールは次のコマンドです。

npm install nodemailer

さっそくメールの送信のテストをしてみましょう。

尚、メールを送信するためには、メールサーバー (SMTP サーバー) が必要です。ここではシンプルな SMTP サーバーが利用できるものとして説明します。 クラウドで利用できる各種メールサービスもありますが、その場合はそれぞれのサービスの作法に従って設定が必要な場合が多いです。そちらのマニュアルを確認してください。

nodemailer を使ったメールの送信方法

nodemailer を用いたメール送信例は次の通りです。

みてわかるように、ほとんどメールサーバーの設定やメールの設定だけです。メール送信のコードは 36,37 行目だけといっても過言ではありません。

const nodemailer = require('nodemailer');

//
// SMTP の設定
//
const options = {
  host: 'YOUR SMTP SERVER', // メールサーバー
  port: 25, // ポート番号 25 など
  secure: false, // 465 番ポートを使う場合。それ以外は false
  requireTLS: false,
  tls: {
    rejectUnauthorized: false,
  },
  auth: { // 認証情報
    user: 'YOUR USERNAME', // ユーザー名
    pass: 'YOUR PASSWORD', // パスワード
  },
};

//
// メールメッセージ
//
const mail = {
  from: 'foo@example.com', // 送信元メールアドレス
  to: 'bar@example.com', // 送信先メールアドレス
  subject: 'Email Test Mail',
  text: `Email was sent!`,
  html: `<p>Email was sent!</p>`,
};

//
// メールの送信
//
(async () => {
  try {
    const transport = nodemailer.createTransport(options);
    const result = await transport.sendMail(mail);
    console.log('+++ Sent +++');
    console.log(result);
  } catch (err) {
    console.log('--- Error ---');
    console.log(err);
  }
})();

SMTP サーバーの情報やメールの送信元、送信先のアドレスは適宜書き換えてください。内容はコメントに書いた通りです。

これを node で実行すれば、メールが送信されるはずです。

(無名関数)(); という形式は IIFE と言われる形式です。nodemailer にはこのような形式が必要なわけではありません。ここでは単に async/await を使いたかったのでこうしています。

nodemailer で画像付きのHTMLメールを送信する方法

画像付きのHTMLメールを送信する例を紹介します。

この例では次のようなメールを送ります。

ロゴ画像は assets/images/logo.png として保存しています。

ポイントはたった二つです。

ひとつは上記の mail にて、html プロパティに HTML でメールの内容を記述することです。

もうひとつは、配列として記述する attachments プロパティに画像の情報を記載することです。ここでファイル名、パス名、cid を指定します。この cid を使って、HTML 中の img タグの src 属性で cid を指定します。

少しはきれいなメールを送らないとわざわざ HTML にする意味がないと思ったので、整えるためにやや HTML が長くなってます。

適当な画像を用意して、上記のコードで mail 定数だけを差し替えることで、上のスクリーンショットのようなメールが送信されるはずです。(Gmail で表示しています)

const mail = {
  from: 'foo@example.com', // 送信元メールアドレス
  to: 'bar@example.com', // 送信先メールアドレス
  subject: 'Email Test Mail',
  text: `Email was sent!`,
  html: `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html>
   <head>
    <title>Email was sent</title>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
    <meta content="width=device-width" name="viewport"/>
    <style type="text/css">
      body { width:100%; height:100%; margin:0; background-color:white; font-family:sans-serif; }
      .main { width:80%; padding: 30px; background-color:#f5f5f5;margin: auto; margin-top: 50px; text-align:center; }
      h1 { color:#008800; }
    </style>
   </head>
   <body>
    <div class="main">
     <div><img src="cid:logo"/></div>
     <h1>Email was sent!</h1>
    </div>
   </body>
  </html>`,
  attachments: [
    {
      filename: 'logo.png',
      path: 'assets/images/logo.png',
      cid: 'logo',
    },
  ],
};

以上で nodemailer を使ってメールを送信する基本的な方法と、画像付きの HTML メールを送信する方法を説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Node.js 入門