LINE BOT(Node.jsで実装)で手軽に会社に勤怠連絡メールを送りたくて、OAuth認証でGmailからメールを送ろうと思いました。パスワード認証だと2段階認証にしてるとダメらしくて、これのために2段階認証を解除するのもナンセンスだと思ったので、nodemailer(Node.jsのメール送信のためのモジュール)を使ってOAuth認証でメールを送ろうと思ったのですが、ハマった点があったので共有です。
Node.jsでGmailからメールをOAuth認証で送信する流れ
- Google Developers ConsoleでOAuth認証のための情報(トークン等)を取得
- nodemailerで、1で取得した情報を使ってメールを送信
基本的にはnode.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送るがとてもわかりやすくて、書かれていることを順番にやっていけば大丈夫です。しかし、リンク先ではxoauth2というモジュールを使っているのですが、メール送信を試みても認証エラーが怒られてしまいます。トークン等が間違ってるんじゃないかと思って何回も確認しましたがそんなことはなかったので、しばらくハマりました。
解決策
xoauth2を使うのをやめて、authに直接指定する。
具体的には以下のようにコードを修正する。
var nodemailer = require('nodemailer')
// メッセージ
var message = {
from : '送信元',
to : '送信先',
subject : 'タイトル',
text : '本文'
};
// 認証情報
var auth = {
type : 'OAuth2',
user : 'ユーザ名@gmail.com',
clientId : 'クライアントID',
clientSecret : 'クライアントシークレット',
refreshToken : 'リフレッシュトークン'
};
// トランスポート
var transport = {
service : 'gmail',
auth : auth
};
var transporter = nodemailer.createTransport(transport);
transporter.sendMail(message, function(err, response) {
console.log(err || response);
});
原因
わからん\(^o^)/
nodemailerの仕様変わった?