Gmailから自動で電子メールを送信したい場面は意外と多いものの、Gmailのセキュリティは日に日に強化されており、気軽にメールを送信できないようになっています。そこで、今回は、Node.jsを使ってGmailを自動送信する方法をまとめてみます。
まだまだ現役のメール送信を自動化しよう
友人同士の連絡には、SNSやLINEなどが使われることが増えましたが、ビジネス用途ではまだまだ電子メールが積極的に利用されています。それで、チームメンバーや顧客に電子メールを一括送信したい場面というのは、意外と多いものです。
今回は、JavaScript実行エンジンのNode.jsをPCにインストールしてメールの自動送信システムを作ってみましょう。なお、Node.jsのインストールについては、本連載の第2回で紹介しています。まだインストールしていない人は、手順を参照してください。
Gmail側でアプリパスワードを取得しよう
なお、Gmailを使ってメール送信する際に大切なことですが、Gmail側で設定が必要になります。まず、Googleアカウントのセキュリティ設定画面にアクセスします。そして、「Googleへのログイン」にて「2段階認証プロセス」をオンに設定します。
続いて、アプリパスワードをクリックします。そして、改めてGoogleアカウントでログインします。それから、アプリパスワードの生成画面で、「メール」「Mac(またはWindows)」を選択して「生成」ボタンをクリックします。
すると、パスワードが生成されるので、このアプリパスワードをメモっておきましょう。なお、このアプリパスワードは手軽に作成と削除が可能です。メールの自動送信が必要なくなったら速やかにこのアプリパスワードを削除しましょう。
プログラムを作ろう
今回は、Nodemailerというパッケージを利用してメールを送信してみます。ターミナル(WindowsではPowerShell)を起動して、以下のコマンドを実行しましょう。
npm init -f
npm install nodemailer
すると、node_modulesというディレクトリが作成されて、Nodemailerがインストールされます。そこで、同じディレクトリに以下のプログラムを作成します。そして「testmail.js」という名前で保存しましょう。なお、★マークの部分は自身の設定に書き換える必要があります。
// Nodemailerを使う --- (*1)
const nodemailer = require('nodemailer')
// 認証情報などを設定してNodemailerオブジェクトを生成 --- (*2)
const porter = nodemailer.createTransport({
service: 'gmail',
port: 465,
secure: true,
auth: {
user: '★★★@gmail.com', // Gmailアカウント --- (*3)
pass: '★★★' // アプリパスワード --- (*4)
}
})
// メールを送信する --- (*5)
porter.sendMail({
from: '★★★@gmail.com', // Gmailアカウント --- (*6)
to: '★★★@example.com', // 送信先のアドレス --- (*7)
subject: 'テスト', // 件名
text: '送信テストです。' // メール本文
}, function (err, info) {
if (err) { // エラーの場合 --- (*8)
console.error(err)
return
}
// 正しく送信できた場合 --- (*9)
console.log('ok', info)
})
プログラムを実行するには、ターミナルで以下のコマンドを実行します。
node testmail.js
プログラムを実行して、正しくメールを送信すると、ターミナルに送信完了と送信情報が表示されます。そして、メールの送信先を開いてメールを受信したことを確認してください。
プログラムを確認してみましょう。(*1)ではNodemailerパッケージを使うように、requireでモジュールの取り込みを記述します。(*2)ではGmailの認証情報を指定して、Nodemailerのオブジェクトを生成します。読者の皆さんの書き換えが必要なのは、Gmailアカウントを指定する(*3)と先ほど取得したアプリパスワードを指定する(*4)の部分です。
(*5)の部分で実際にメールを送信します。(*6)には送信元のGmailアドレスを指定します。(*2)で指定したのと同じアドレスを指定します。(*7)には送信先のメールアドレスを指定します。それから、subjectには件名、textにはメールの本文を指定します。
なお、Nodemailerでは、メールの送信が完了した時にコールバック関数が実行されます。(*8)の部分にはメールの送信に失敗した時の処理を記述します。(*9)の部分には正しく送信できた時の処理を記述します。
添付ファイルをメールに付けたい場合
次に添付ファイルを付けたメールを送信したい場合のプログラムを確認してみましょう。以下のプログラムを「testattach.js」という名前で保存します。また、同じフォルダに「test.pdf」というPDFファイルを用意しておきましょう。
const nodemailer = require('nodemailer')
const path = require('path') // パスの指定に利用 --- (*1)
// 認証情報などを設定してNodemailerオブジェクトを生成
const porter = nodemailer.createTransport({
service: 'gmail',
port: 465,
secure: true,
auth: {
user: '★★@gmail.com', // Gmailアカウント
pass: '★★★' // アプリパスワード
}
})
// メールを送信する
porter.sendMail({
from: '★★★@gmail.com', // Gmailアカウント
to: '★★★@example.com', // 送信先のアドレス
subject: 'テスト', // 件名
text: '送信テストです。添付ファイルもご覧ください。', // メール本文
attachments: [ // 添付ファイルの指定 ---- (*2)
{
'filename': 'test.pdf', // 表示ファイル名
'path': path.join(__dirname, 'test.pdf') // ファイルのパス --- (*3)
}
]
}, function (err, info) {
if (err) { // エラーの場合
console.error(err)
return
}
console.log('ok', info) // 正しく送信できた場合
})
プログラムを実行するには、ターミナルから以下のコマンドを実行します。
node testattach.js
プログラムを実行すると以下のように添付ファイル付きのメールが送信されます。
プログラムを確認してみましょう。このプログラムでは、pathモジュールを使うため、(*1)ではpathモジュールを取り込みます。 (*2)以降の部分が添付ファイルをメールに付けるように必要な部分です。attachmentsというプロパティに、filenameとpathのオブジェクトを指定します。
なお、添付ファイルの指定ですが、(*3)のようにファイルのパスを指定します。間違えやすいのですが、filenameプロパティに表示ファイル名を指定して、pathプロパティに実際のファイルパスを指定します。ここでは、path.join(__dirname, 'test.pdf')と指定していますが、これは、プログラムと同じフォルダにあるtest.pdfという意味になります。
まとめ
以上、今回は、Node.jsとNodemailerパッケージを使って、Gmailを送信する方法を紹介しました。ここで見たように、添付ファイルの指定も非常に簡単です。ご覧の通りプログラム自体は簡単です。しかし、Gmailのセキュリティは年々強化されていますので、その設定を正しく行うことが、正しくメールを自動送信するのに必要な点です。業務自動化の参考にしてみてください。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。