Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

目新しいことをしているわけではないんですが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を本登録処理に渡して本登録が実行できる
といった感じです

rh_taro
timee
日本の労働力の減少を若者の働き方改革で解決します。好きな時に好きなだけ働けるプラットフォームタイミーを作り、人々が好きなことをできる世界を実現します。
https://timee.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away