Posted at

Mailgun を使って Node.js からメールを送信する

More than 1 year has passed since last update.


TL; DR



  • Mailgun を使うと、SMTP サーバー不要で容易ににメールを送信することができる


  • mailgun-js が最もメンテされ、公式も推奨しているライブラリ

  • callback スタイルと Promise スタイルのどちらでも使えて便利

  • 日本語は UTF-8 で送られるので、一部のレガシー環境にも送る場合は注意が必要


Mailgun とは ?

Mailgun はメール配信・受信を請け負うクラウドサービス (SaaS) です。

類似サービスでは、Amazon SES や SendGrid が日本では有名です。


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

以下の二種類の方法が用意されています 1


  1. Mailgun が用意した REST API を使う方法


    • メリット: 速い (公式曰く SMTP に比べ x3)、スケールし易い



  2. SMTP を使う方法


    • メリット: 既存のアプリに適応し易い、プロトコルがオープン



この記事では、前者の専用の API を叩く方法を説明します。


mailgun-js モジュールを使ってメールを送る方法

mailgun-js というライブラリが公式のチュートリアルで紹介されているため 2、これを使うのがおそらくベストだと考えられます。

メールを送信するには API キーが必要であるため、事前に Mailgun のアカウントを作成しドメインを登録しておきます。登録するドメインは、自らが所有しているドメインである必要があります 3

はじめに、現在のプロジェクトにライブラリをインストールします。

$ npm i -S mailgun-js

もしくは、

$ yarn add mailgun-js

続いて、メールを送るコードを記述します 4

'use strict'

const apiKey = 'key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
const domain = 'mydomain.com'

const mailgun = require('mailgun-js')({ apiKey, domain })

const data = {
from: 'Renge Miyauchi <postmaster@mydomain.com>',
to: 'Chitose Karasuma <chitose@kanzenshori.com>',
subject: 'nyanpass',
text: 'にゃんぱす〜',
}

mailgun.messages().send(data)
.then(body => console.log(body))
.catch(err => console.error(err)

正常に送信された場合、以下のように標準出力に表示されます。

{ id: '<2017020800000.12345.12345.XXXXXXXX@mydomain.com>',

message: 'Queued. Thank you.' }

コールバック形式として記述することもできます。その場合は、以下のように記述します。

mailgun.messages().send(data, (err, body) => {

if (err) { return console.error(err) }
console.log(body)
})

件名や本文として日本語を指定した場合は、UTF-8 として送信されます。

以下は実際に Mailgun から送信したメールのヘッダの抜粋です。件名は UTF-8 + Base64 の MIME ヘッダとして、本文は UTF-8 の quoted-printable として送られているようです。

Subject: =?utf-8?b?44Gr44KD44KT44Gx44GZ?=

Content-Type: text/plain; charset="utf-8"
Mime-Version: 1.0
Content-Transfer-Encoding: quoted-printable

=E3=81=AB=E3=82=83=E3=82=93=E3=81=B1=E3=81=99

UTF-8 が処理できない一部のレガシー環境にも届ける必要がある場合は、注意が必要そうです。


まとめ

Mailgun を使うと気軽にメールを送信することもできます。

メールの受信やフィルタを使った転送もできたりと意外に高機能なので、機会があれば使ってみて下さい。





  1. https://documentation.mailgun.com/quickstart-sending.html#how-to-start-sending-email 



  2. http://blog.mailgun.com/how-to-send-transactional-emails-in-a-nodejs-app-using-the-mailgun-api/ 



  3. ドメインを登録しなくても、制限付きのサンドボックス用アカウントから送ることもできます 



  4. 記事を書いた時点の最新の LTS である Node v6.9.4 で動作確認を行っています