名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

Node.js で Gmail を使って smtp でメールを送る…(が思ったより大変だった)

思ったよりもタイヘンデシタネー;;

やったこと

主な流れとして

  • nodejs の nodemailer でメールを送る
    • node-sendmail を使おうとしたが、うまくいかなかった
    • いろいろしらべた & node.js awesomeを見ている感じでは、 nodemailer が人気ありそうな感じだった
  • googleの Oauth 認証を使う
    • ローカルから雑に送ろうとしたが、うまくいかない感じだったので
    • 現実的に Google の認証を通して送るのはあり得るユースケースだと思ったので
  • 変数に情報を直打ちしない
    • どう考えても危ないので
    • あとは開発環境を切り替えること想定での開発をしたほうが良いので
    • 環境変数からとってそれを反映する形にしたい

基本的にはこの記事が参考になりました。

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

gmail の認証周りの設定をしていく

最初ベタに mail address と password による認証を行うのですが、あまりに慣れていないので大変でした…。

やった手順は参考手順とほぼ一緒なので、箇条書きにだけすると

  • Google API Console へ行く
  • 必要に応じて新しいプロジェクトを作る
  • OAuth同意画面で、認証用アプリケーションを定義する(Test Applicationとかにした)
    • アプリケーションのテストユーザーに自分のアカウントを追加しておく必要があるかも(後段の認証プロセスで失敗したので)
  • 認証情報から OAuth クライアントIDを発行する
  • OAuth 2.0 Playground で各種設定をして、認証トークンを発行する
  • 発行されたトークンをメモっておく

表示名などは変わっているものもあったので、探すのが大変でした。

nodemailer で送信する

この辺を読んで実装する。

nodemailer.com

stackoverflow.com

stackoverflow.com

ポイント?としては下記です。

  • auth 用の dict を渡す必要がある
  • トークンは今まで集めたものをそれっぽく…(というか指定通り入れれば迷うことはないような気がする)
  • transporter の stmp は smtp.gmail.com にする
    • gmail となってるものをいくつか見た気がするが、自分はうまく動かなかった

直打ちをやめる

.env に書き出すようにして dotenv から読むようにしました。

特に語ることなし。トークン名がプログラム上から消えたので、安心してさらせるようになる。

できたもの

プログラムが短いのでブログにそのまま貼ってみる。

const nodemailer = require("nodemailer");
require("dotenv").config()

const auth = {
  type: "OAuth2",
  user: process.env.SENDER_EMAIL_ADDRESS,
  clientId: process.env.CLIENT_ID,
  clientSecret: process.env.CLIENT_SECRET,
  refreshToken: process.env.REFRESH_TOKEN,
}

const transporter = nodemailer.createTransport({      
  host: "smtp.gmail.com",
  secure: true,
  auth: auth,
});

const mailContent = {
  to: process.env.RECEIVER_EMAIL_ADDRESS,
  subject: "テストメール",
  text: "ほんぶんにゃ",
};

transporter.sendMail(mailContent, function (error, info) {
  if (error) {
    console.log(error);
  } else {
    console.log('Email sent: ' + info.response);
  }
});

ほか

一応参照した。

qiita.com

迷惑メールにいるかもね、とかパスワード間違ってるかもね、みたいなところで参照した。

qiita.com

感想

サクッとメール出したいだけだったのですが、思いのほかはまって大変でした。

そのうち postfix 入れてそこから投げる、みたいなことにも挑戦してみたいですね。

ただメール送信、メール受信に関しての知識がまだまだ薄いので、この辺りも一回がっつりと勉強してみたさがあります(実運用上は Saas を使うのが筋だと思いますが、ローカルでの開発とかデバッグとかで使えなくはなさそう)。

なんとなく postfixdovecot が大事なのは知っていますが、時代的にあっているかどうか、みたいなところとか、いろいろ気になる部分はあります。

いやでもあれかな、 AWSのSESとかでやってみるのが先なのかも…?

LINE や twitter といったところで最新情報を得るパターンもそれなりに増えてきましたが、メールマガジンのような流れにくく長い広告などはやっぱりメールで受け取る方がうれしいのかなと思います。

そういう意味でもまだまだメールに関して理解を深めていくのは価値があることかもしれないですね…(?)。

追記

コードはここに挙げた

https://github.com/yumechi/send-mail-sample