Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neguse11/bc09d86e7acbd6442cd4 to your computer and use it in GitHub Desktop.
Save neguse11/bc09d86e7acbd6442cd4 to your computer and use it in GitHub Desktop.
node.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送る

node.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送る

OAuth 2.0 のための ID を得る

目標:「ClientID」「Client secret」「Refresh token」を得る

  • Google Developers Console へ登録
  • ホーム画面が出る
  • とりあえずプロジェクトを作成する
    • 名前は「My Project」のまま
  • 左のメニューから「APIと認証」の下にある「認証情報」を選択
    • 「OAuth 同意画面」タブを選択
      • 「メールアドレス」は自分のアドレスのままにする
      • 「サービス名」は「TEST APP」
      • 下にある「保存」を押す
    • ふたたび「認証情報」画面で「認証情報」タブを選択
      • 「認証情報を追加」を押してメニューから「OAuth 2.0 クライアントID」を選択
      • 「クライアントIDの作成」画面になる
        • 「アプリケーションの種類」から「ウェブアプリケーション」を選択
        • 「承認済みのリダイレクトURI」に「https://developers.google.com/oauthplayground」を入れる
        • 「作成」を押す
        • 「OAuthクライアント」ダイアログが出るので「Client ID」と「Client secret」をメモし、「OK」を押して閉じる
  • ここまでのウィンドウはそのままにして、新しいウィンドウでhttps://developers.google.com/oauthplaygroundを開く
    • 右上の歯車ボタンを押して「OAuth 2.0 configuration」を出し、以下のように設定
項目
OAuth flow Server-side
OAuth endpoints Google
Access token location Authorization header w/ Bearer prefix
Access type Offline
Force approval prompt [X](チェックをつける)
Use your own OAuth credentials [X](チェックをつける)
OAuth Client ID さきほど取得した Client ID
OAuth Client secret さきほど取得した Client secret
  • 「Step 1」の下部にある「Input your own scopes」に「https://mail.google.com/」を入力し「Authorize APIs」を押す
    • 「TEST APP が次の許可をリクエストしています」と出るので、「許可」を押す
  • 「Step 2」に進んだら「Exchange authorization code for tokens」を押す
    • ここで「Refresh token」をメモする

ここまでの手順で目標の「ClientID」「Client secret」「Refresh token」が得られた

テスト用コードを実行

この gist 内の server.js を配置して、以下の行を適宜書き換える

var gmail = {
      user         : "ユーザ名@gmail.com"
    , clientId     : "クライアントID"
    , clientSecret : "クライアントシークレット"
    , refreshToken : "リフレッシュトークン"
};

その後、以下を実行する

npm init -f
npm install nodemailer --save
npm install xoauth2 --save
npm start

成功すると、"ユーザ名@gmail.com"で指定したユーザーが自分自身に「Hello」というメールが送られる

エラー集

SELF_SIGNED_CERT_IN_CHAIN

Error: self signed certificate in certificate chain]
code: 'SELF_SIGNED_CERT_IN_CHAIN'

たぶんアンチウィルスかファイアウォール系でブロックされているので、一時的に解除するなりしてみる

EAUTH

[Error: unauthorized_client]
code: 'EAUTH'

単純に認証に失敗している。ユーザー名、クライアントID、クライアントシークレット、リフレッシュトークンの組が間違っていないか確認する

Too many login attempts

SMTP Error: 454 4.7.0
Too many login attempts, please try again later.

ログイン試行回数が多すぎる。1分に1回程度でも出るようなので、できるだけ間をあけて試したほうが良いかも

EENVELOPE

[Error: No recipients defined]
code: 'EENVELOPE'

メールを送信するのに必要な項目が欠けている。「to」がundefinedになっていたりとか

参考

var nodemailer = require('nodemailer')
, xoauth2 = require('xoauth2')
;
var gmail = {
user : "ユーザ名@gmail.com"
, clientId : "クライアントID"
, clientSecret : "クライアントシークレット"
, refreshToken : "リフレッシュトークン"
};
var message = {
to : gmail.user
, subject : 'Hello'
, text : 'Hello world'
};
var generator = function() {
var g = xoauth2.createXOAuth2Generator(gmail);
g.on('token', function(token) {
console.log('New token for %s: %s', token.user, token.accessToken);
});
return g;
};
var transport = {
service : 'gmail'
, auth : { xoauth2: generator() }
};
var transporter = nodemailer.createTransport(transport);
transporter.sendMail(message, function(err, response) {
console.log(err || response);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment