node.jsのいろいろなモジュール3 – Nodemailer

2011.07.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

メール送信

今回ご紹介するモジュールは、メール送信のためのモジュールです。
このモジュールを使用すると、 node.js上から簡単にメールの送信ができます。
メールの送信方法は、SMTPを使用するか、sendmailを使用するかプログラム上で指定できるようになっています。
Nodemailerは以下のような特徴を持っています。

  • Unicodeを使用可能
  • テキストの他にHTMLメールも送信できる
  • 添付ファイルが使用できる
  • HTMLに画像埋め込みができる
  • SSL/ TLSを使用して、セキュアなメール送信が可能


最低限必要な機能は揃っていますね。ではインストールして動かしてみましょう。
なお、本記事での動作確認環境は下記の通りです。

  • OS : MacOS X 10.6.8
  • Node.js : v0.4.8
  • npm : 1.0.14
  • nodemailer : 0.1.18
    • まずはnpmを使用してモジュールをインストールします。

      $ npm install nodemailer

      Nodemailerのソースはgithub上にあります。
      こちらも参照してみてください。

      次に、同じディレクトリにメール送信プログラムをmail.jsという名前で記述します。
      メールを送信するには、send_email()メソッドを使うか、EmailMessageオブジェクトを使用します。
      今回はsend_email()を使用してメールを送信してみましょう。
      ※SMTPサーバーやアカウント等の設定情報は、適宜自分の使用できるものに置き換えてください

      まずは今回のサンプルプログラム全文をごらんください。
      github上のexampleにあるソースほぼそのまま使用しています。
      このプログラムでは、添付ファイルをつけて画像を埋め込んだメールを送信しています。

      //モジュールロード
      var nodemailer = require("nodemailer");
      //埋め込み画像のファイル名に使用
      var cid = Date.now()+".image.png";
      
      //SMTPサーバーの設定
      nodemailer.SMTP = {
          host: "something.smtp.com",
          port: 25,
          ssl: true,
          use_authentication: true,
          user: "your mail account",
          pass: "your mail password"
      };
      
      //メール情報の作成
      var message = {
          sender: 'Sender Name <yourmailaddress@mail.com>',
          to: '"Receiver Name" <receiveraddress@mail.com>',
          subject: "Nodemailer is unicode friendly ✔",
          body: "Hello to myself!",
          html:"<p><b>Hello</b> to myself <img src=\"cid:"+cid+"\"/></p>",
          debug: true,
          attachments:[
              {
                  filename: "notes.txt",
                  contents: "Some notes about this e-mail"
              },
              {
                  filename: "image.png",
                  contents: new Buffer("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/"+
                                       "//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U"+
                                       "g9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC", "base64"),
                  cid: cid
              }
          ]
      };
      
      // メール送信のコールバック関数
      var callback = function(error, success){
          if(error){
              console.log("Error occured");
              console.log(error.message);
              return;
          }
          if(success){
              console.log("Message sent successfully!");
          }else{
              console.log("Message failed, reschedule!");
          }
      };
      
      // メール送信
      var mail;
      try{
          mail = nodemailer.send_mail(message, callback);
      }catch(e) {
          console.log("Caught Exception",e);
      }

      では上から順番にみていきましょう。
      モジュールのロードとファイル名設定のところは省略。
      ロードしたモジュールのメンバにSMTPサーバーの設定をしています。

      //SMTPサーバーの設定
      nodemailer.SMTP = {
          host: "something.smtp.com",
          port: 25,
          ssl: true,
          use_authentication: true,
          user: "your mail account",
          pass: "your mail password"
      };

      host名やポート番号、ssl使用などを設定しています。
      テスト時にはsmtp.gmail.com:465に対して、sslをtrueにした状態でGmaiのIDとパスワードで送信できることを確認しました。

      次はメールについての情報を作成します。

      //メール情報の作成
      var message = {
          sender: 'Sender Name <yourmailaddress@mail.com>',
          to: '"Receiver Name" <receiveraddress@mail.com>',
          subject: "Nodemailer is unicode friendly ✔",
          body: "Hello to myself!",
          html:"<p><b>Hello</b> to myself <img src=\"cid:"+cid+"\"/></p>",
          debug: true,
          attachments:[
              {
                  filename: "notes.txt",
                  contents: "Some notes about this e-mail"
              },
              {
                  filename: "image.png",
                  contents: new Buffer("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/"+
                                       "//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U"+
                                       "g9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC", "base64"),
                  cid: cid
              }
          ]
      };

      sender(送信元アドレス)とto(送信先アドレス)はメールアドレスをそのまま設定することもできますし、"名前"<メールアドレス>形式でカンマ区切りで複数記述することもできます。
      bodyはplaintextのメール本文、htmlはHTMLメールのときのメール本文になります。 debug=trueにしていると、メール送信時に詳細な情報が出力されます。
      最後のattachmentsは添付ファイルの指定で、ここではテキストの添付ファイルとHTMLにイメージの埋め込みを行っています。
      上記以外にもccやbccが設定可能です。

      最後にコールバック関数を定義し、メール送信をしています。

      // メール送信のコールバック関数
      var callback = function(error, success){
          if(error){
              console.log("Error occured");
              console.log(error.message);
              return;
          }
          if(success){
              console.log("Message sent successfully!");
          }else{
              console.log("Message failed, reschedule!");
          }
      };
      
      // メール送信
      var mail;
      try{
          mail = nodemailer.send_mail(message, callback);
      }catch(e) {
          console.log("Caught Exception",e);
      }

      コールバック関数ではメール送信成功・失敗でメッセージ出力内容を変更しているだけです。
      メール送信部分ではsend_mail()関数にメール情報とコールバック関数を渡して、メールを送信しています。

      $ node mail.js

      少し時間があいた後、メール送信結果メッセージが表示されます。
      送信されたメールを見ると、添付ファイルとHTMLイメージの埋め込みも確認できると思います。

      まとめ

      今回はメール送信モジュールについてご紹介しました。
      Nodemailer以外にもメール関連のモジュールはたくさんあるので、いろいろ調べてみてください。
      ではまた次回。

      参考サイトなど