Node.js
mail
nodemailer

node.jsで 投票済み証明書を添付したメールを 御用労働組合へ 選挙がなくても送信する

【プログラム実行動画(youtube)】

+gmail

https://youtu.be/sRcW6WGvobw

+icloud Mail

https://youtu.be/DH1plPmJ3J0

<もくじ>

+令和元年6月9日(日)

+令和元年6月8日(土)

+令和元年6月7日(金)

+令和元年6月6日(木)

+令和元年6月5日(水)


令和元年6月10日(月) ↑戻る

1.ネタ切れ。次の作戦を練る。

→twitter APIが簡単そうなので、

 他人へのコメントができるか

 調査する。


令和元年6月9日(日) ↑戻る

今日の宿題

1.icloudメールの送信限界テスト

こたえ.icloudメールの送信制限は仕様通り、1000通/day

2.英語苦手なのでvscodeを日本語化する

参考サイト→https://qiita.com/ntkgcj/items/e77331932c7983dea830


宿題1 icloudメールの送信限界

→メールアドレス取得完了toyocop@icloud.com

→smtp設定方法を調べる。

→仮面ライダー見るので中断

→メールの設定はアップルのサイトにある

https://support.apple.com/ja-jp/HT202304

Gmailと似ているので

gメール用のプログラムが流用できる。

(IDがメアド全体)

だが、アカウントを複数取得するのはめんどくさい。

iCloud有料プランならイケル?→ダメ



送信制限規定

https://support.apple.com/ja-jp/HT202305

ちなみに

お名前.comのメールサービスは

1万通送信できる。

(独自ドメインを使用)

送信メールサーバの SMTP 情報

サーバ名:smtp.mail.me.com
SSL:必要
SSL を使うとエラーメッセージが表示される場合は、TLS または STARTTLS を使ってみてください。
ポート:587
SMTP 認証:必要
ユーザ名:お使いの iCloud メールアドレス全体 (たとえば、emilyparker ではなく emilyparker@icloud.com)
パスワード:受信メールサーバの設定時に作成した App 用パスワードを使います。

・APPパスワードを作成します。

https://support.apple.com/ja-jp/HT204397

mail13.jpg

・エラーが出ました。

Error : 3074565888:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:../deps/openssl/openssl/ssl/s3_pkt.c:337:

mail14.jpg

gmailとはsmtpの設定が違ってた。

        {//設定A-0

host: 'smtp.mail.me.com',
secure: false, // SSL
port: 587,
auth: {
user: 'toyocop@icloud.com',
//アプリパスワード(二段階認証対策)
pass: 'APPパスワード'
},
tls: {ciphers:"SSLv3"}
},

・メール撃てました。動画はこちら

20190609_213207.jpg

・限界は1000通。(996通以降エラー。実験前に試射したため。)

mail17.jpg


宿題2 vscode日本語化

左のアイコン列の下の方、EXTENSIONSをクリック。

Serch Extensions in Marketplace

Japanese Language Packを検索してinstallするだけ。

jsonファイルの修正は不要だった。

・適用前

mail12.jpg

・適用後

mail18.jpg


令和元年6月8日(土) ↑戻る


今日の宿題

1.複数のgメールアドレスを切り替えて送信できるようにする。(完了)

実行動画→https://twitter.com/i/status/1137160544396255232

2.コードエディタについて調べる。今さら。

3.パスコードのわからないアイホン発掘

 初期化する→パスコード不明→AppleID不明→アクティベーションロックされてる(断念)

 →ロック解除成功→icloudメール取得(今ここ)

参考サイト→https://boxil.jp/beyond/a5077/?page=3#5077-2

4.icloudのテスト→メールアドレス取得完了toyocop@icloud.com(後日持越し)

 smtp設定方法を調べる。


宿題2 nodejs用エディタ

https://qiita.com/sensuikan1973/items/74cf5383c02dbcd82234


宿題1 複数gメアド切替対応

SMTP設定を多次元配列に格納して forカウンタで切り替える

var smtp = mailer.createTransport(setting[0]);

//SMTPの設定

var setting = [

{//設定0
host: 'smtp.gmail.com',
secure: true, // SSL
port: 465,

auth: {
user: 'mail.bomb0000@gmail.com',
//アプリパスワード(二段階認証対策)
pass: '??????'
},
tls: {rejectUnauthorized: false}
},

{//設定1
host: 'smtp.gmail.com',
secure: true, // SSL
port: 465,

auth: {
user: 'mail.bomb0001@gmail.com',
//アプリパスワード(二段階認証対策)
pass: '?????'
},
tls: {rejectUnauthorized: false}
}

];


令和元年6月7日(金) ↑戻る


今日の宿題

1.送信間隔、送信通数の限界を調べる。

→制限はサーバーごとに違う。1分あたり〇〇通、1日あたり〇〇通といった規定がある。

→ドコモメールは、一旦ロックされると一日中送信不可になる。

→ドコモメールは、Nodemailarで送信すると、送信ボックスに残らないので合計通数は不明。

→gmailはデイリー超過エラーが出ても、12時間後には送信できた。232通。

→gmailのsmtpから送信したメールの1日トータル通数は、約1200通。(2019/6/7調査)

2.画像の添付方法を調べる。

→テスト完了、画像添付は成功。

3.送信量限界を突破するための対策を検討する。

→gmailとicouldメールのアカウントを複数取得して送信のたびに切り替える。

3-1.icouldメールアドレスを取得する。

→windowsとandroidだけでは不可。

→壊れかけのiphone4が倉庫にあるはず。捜索する。

3-2.icouldメールのsmtpの限界を調べる。

→後日実施。

3-3.gmail追加アカウントの取得

mail.bomb0000@gmail.com

mail.bomb0001@gmail.com

mail.bomb0002@gmail.com


宿題3-1 icloudメールを取得する。

1.APPLE idを取得 (gmail可)

2.windows用ICLOUDをインストール

mail6.jpg

3.icloudメールの利用にはiphone本体が必要であることに今更気づく。

mail7.jpg


宿題3:送信制限突破方法検討

(採用!)対策案3.携帯キャリアやgmailなど、

利用者が多いドメインからメールを送信すればドメインブロックされにくい。

また、USER IDさえ変更すれば再度送信できる。

対策案2.AWSなどを利用して独自ドメインでSMTPサーバを立てる。

→ドメインブロックされたら意味がない。

  

対策案1.SMTPサーバを自前で立てる。→没

参考サイト

http://d.hatena.ne.jp/dai_yamashita/20130627/1372325344

BlackJumboDogのダウンロード

https://forest.watch.impress.co.jp/library/software/blackjmbdog/

上記サイトを参考に、設定していきます。

mail4.jpg

nodejs側で設定しない場合、bjdのクライアントから見たポートを587に設定します。

サーバーのログに原因不明のエラー

ルータの設定?bjdの設定がまずい??

それ以前にwindows10home上でbjdがまともに動作しないので諦める。

mail5.jpg

//SMTP(送信)サーバー接続のための設定

var setting = {}; // defaultを使用


宿題2:画像添付

Attachmentオプションを使う

jsファイルと同じフォルダに置きます。

画像ファイル→voted.jpg

voted.jpg

→参考サイト

 https://www.yoshi-net.tokyo/%E6%8A%80%E8%A1%93%E3%83%8D%E3%82%BF/86/

→ドコモメールも、gメールも送信しすぎてテストができない。

 送信前に受信しないとダメなんかな(←関係なさそ)

→ドコモメール、スマホアプリからも送信不可。受信は可。

 送信だけロックされている。


宿題2のソースコード(動作確認済み)

fsモジュールを追加します。

const fs = require("fs");

//メールの内容

var mailOptions = {
from: '*****@docomo.ne.jp',
to: '****@toyota-boshoku.com',
subject: '慰謝料請求',
html: '<H1>FUCK YOU</H1>' ,//HTMLタグが使えます
//画像の添付(jsファイルと同一フォルダに画像あり)
attachments:[{
filename: "voted.jpg", //画像ファイル名
content: fs.readFileSync("voted.jpg")
}]
};

20190607_211724.jpg


宿題1:送信間隔

200通連続送信できたら合格とする。

<gmail ('smtp.gmail.com')>

5秒2通→合格

2秒2通→不合格

3秒2通→不合格

4秒2通→新しいエラー発生のため中断(quota exceeded)

4秒2通→再テスト→130通目でエラー発生のため中断(quota exceeded)

<ドコモメール('smtp.spmode.ne.jp')>

2秒2通→合格

1秒2通→合格

1秒20通→不合格 unknown user エラー(12時間経過してもロック解除されず。)

gmailで1日の送信量を超過しましたとエラー

mail3.jpg


令和元年6月6日(木) ↑戻る


今日の宿題

1.gmailアカウント準備(完了)

mail.bomb0001@gmail.com

2.とにかく メールを送信(完了)

参考サイト

nodemailerとg-mailでメールする

https://qiita.com/hshimo/items/ac599f5f25a3fa105ddd

3.メールの送信を繰り返す。(完了)

forループ以外を使ってみよう。(諦めた)

4.画像を添付してみよう

 頭が悪いので保留

5.重大トラブル発生

 メール送信を何度も繰り返すと、

 アカウントが一時的にロックされることが

 わかりました。

 gmail、ドコモメールにて確認。

→メールの送信間隔を5秒/通にすると

 エラーは出ない。

→送信間隔をどこまで詰められるのか

 調査する。

 


宿題3 ループを追加

while で ループさせたら

カウンターだけ回ってメールが送信されない。


結果3-1

Twitterの動画をご覧ください。

https://twitter.com/i/status/1136598941313654784


対策3-1

for ループを使う。

//ループの設定

for (let i = 0; i<10; i++){
//while(counter < 100000000000000000000){


結果2-2 成功

アプリパスワードだけではだめだった。

自己署名証明書を許可する を設定すること。

(送信側)

mail2.jpg

(受信側)

Screenshot_20190606-102842_Yahoo! Mail.jpg

応答メッセージがundefinedなのは、

コードが間違っているから。設定できるのは下記。

resのところをinfoに読み替えてください。

console.log('Message sent: ' + res.message);//間違い

console.log('Message sent: ' + res.messageId);//ok

console.log('Message sent: ' + res.response);//ok

infoには結果が含まれます。正確な形式は、使用されるトランスポートメカニズムによって異なります。

info.messageIdほとんどのトランスポートは、このプロパティで使用される最後のMessage-Id値を返すべきです。

info.envelopeにはメッセージのエンベロープオブジェクトが含まれています

info.acceptedは、SMTPトランスポートによって返される配列です(サーバーによって受け入れられた受信者アドレスを含む)。

info.rejectedは、SMTPトランスポートによって返された配列です(サーバーによって拒否された受信者アドレスを含む)。

info.pendingは、ダイレクトSMTPトランスポートによって返される配列です。サーバーの応答と共に一時的に拒否された受信者アドレスを含みます

responseはSMTPトランスポートによって返される文字列で、サーバーからの最後のSMTP応答を含みます。


host: 'smtp.gmail.com',
secure: true, // SSL
port: 465,

auth: {
user: 'mail.bomb0001',
//アプリパスワード(二段階認証対策)
pass: 'アプリパス'
},
//以下追加
tls: {
    // do not fail on invalid certs
rejectUnauthorized: false
}

};


結果2-1 送信エラー

mail0.jpg


対策2-1

2段階認証を設定しているので

アプリパスワードを設定してみる。

mail1.jpg


コード2-1

var mailer = require('nodemailer');

//SMTPの設定
var setting = {
/*
//SMTPサーバーを使う場合
host: 'SMTPホスト',
auth: {
user: 'ユーザ名',
pass: 'パスワード',
port: 'SMTPポート番号'
}
*/

/*
//Webサービスを使う場合
service: 'サービス名', //'Gmail'、'Hotmail'、'Yahoo Mail'など
auth: {
user: 'アカンと名',
pass: 'パスワード',
port: 'ポート番号' //'25'など
}
*/

host: 'smtp.gmail.com',
secure: true, // SSL
auth: {
user: 'mail.bomb0001@gmail.com',
pass: 'パスワード',
port: 465
}
};

//メールの内容
var mailOptions = {
from: 'mail.bomb0001@gmail.com',
to: '相手のメアド',
subject: '慰謝料請求',
html: '<H1>FUCK YOU</H1>' //HTMLタグが使えます
};

//SMTPの接続
//var smtp = mailer.createTransport('SMTP', setting);
var smtp = mailer.createTransport(setting);

//メールの送信
smtp.sendMail(mailOptions, function(err, res){
//送信に失敗したとき
if(err){
console.log(err);
//送信に成功したとき
}else{
console.log('Message sent: ' + res.message);
}
//SMTPの切断
smtp.close();
});


令和元年6月5日(水) ↑戻る

今日の宿題

1)nodeでメール送信できることが

わかったので、参考サイトを探す。

2)送信先メールアドレスを調べる。

→調べはついた。メールを送るだけ。百万回。


宿題1

参考サイト

https://qiita.com/yoh-nak/items/1e433b0075e3ebdef9e3

SMTP認証なし

https://qiita.com/VA_nakatsu/items/fcf02825e56973cffc95

Nodemailerモジュールの紹介

https://dev.classmethod.jp/server-side/node-mail/

http://tech-blog.rakus.co.jp/entry/2017/09/07/110411

https://www.yoshi-net.tokyo/%E6%8A%80%E8%A1%93%E3%83%8D%E3%82%BF/86/