LoginSignup
3
6

More than 5 years have passed since last update.

nodejsでメール受信処理とpuppeteerを組み合わせる

Last updated at Posted at 2018-02-28

目新しいことをしているわけではないんですがpuppeteerにメールを受け取る処理を組み合わせて
入力したメールアドレス宛に仮登録のメールが届くタイプのサイトの登録から退会までのフローのテストを自動化してます

パッケージインストール

メールパースに必要なパッケージは
inbox
iconv
mailparser
の3つです

$ npm install inbox iconv mailparser

仮登録処理

function preRegSite(email) {
    const puppeteer = require('puppeteer');
    puppeteer.launch({
        headless: false,
        slowMo: 50
    }).then(async browser => {
        // 新規タブ
        const page = await browser.newPage();

        // 仮登録ページへ移動
        await page.goto("https://sitedomain.com/regist/", {timeout: 120000, waitUntil: "domcontentloaded"});

        // 仮登録の処理諸々
        // 省略

        return ;
    });
}

本登録処理

function regSite(reg_url) {
    const puppeteer = require('puppeteer');
    puppeteer.launch({
        headless: false,
        slowMo: 50
    }).then(async browser => {
        // 新規タブ
        const page = await browser.newPage();

        // 本登録ページへ移動
        await page.goto(reg_url, {timeout: 120000, waitUntil: "domcontentloaded"});

        // 本登録の処理諸々
        // 省略

        return ;
    });

}

メールパース処理

const inbox = require('inbox');
const simpleParser = require('mailparser').simpleParser;
const iconv = require('iconv');
const conv = new iconv.Iconv("ISO-2022-JP", "UTF-8");

const email = "emailsample@gmail.com";
const emailPw = "password1234";

var client = inbox.createConnection(false, 'imap.gmail.com', {
    secureConnection: true,
    auth: {
        user: email,
        pass: emailPw
    }
});

client.on('connect', function() {
    console.log('mail server connected');
    client.openMailbox('INBOX', function(error) {
        if (error) throw error;
    });
});

client.on("new", function(message) {
    var stream = client.createMessageStream(message.UID);
    var from = message.from.address
    simpleParser(stream)
        .then(mail => { 
            // 本文取得
            var body = conv.convert(mail.text).toString();
            // メールアドレスチェック
            if (from.match(/登録メールのメアドをマッチさせる正規表現/)) {
                // 本文チェック
                var match = body.match(/本登録URLを見つける正規表現/);
                if (match) {
                    // 目的のメール受け取ったらメール受信は止める
                    client.close();

                    // メール受け取った時にしたい処理
                    // 取得した本登録URLはmatch[0]で使う
                }
            }
        })
        .catch(err => {
            console.log(err);
        });
});

組み合わせる

「仮登録処理」「本登録処理」「メールパース処理」を組み合わせて

preRegCard(); // 仮登録
client.connect(); // メール受け取ったら登録キック

と書いて
「メールパース処理」の// メール受け取った時にしたい処理の所に

regSite(match[0]);

と入れると

仮登録処理が走ってメールを受け取って本登録URLを本文から抽出して
そのURLを本登録処理に渡して本登録が実行できる
といった感じです

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6