nodejs自动接收新邮件进行处理

简介: 通过imap 来接收邮箱新邮件,类似客户端系列,不过比较简单的,目前只有新邮件,后续也可以通过这个来做一个自己的邮件客户端。

需求

客户会发送一些信息到邮箱中,但是还需要这些信息录入到另外的一个管理系统中,由于每天都有邮件,所以想把邮件的内容提取到然后推送到管理系统中。(不要问为啥不直接对接... )

处理思路

通过imap来登录邮箱,然后读取邮箱中未读的邮件,并将邮件内容进行解析获得,然后提交到指定的接口中。

使用模块

  • imap
  • mailparser

主要就是这两个。

代码

引入及配置
var Imap = require('imap');
var fs = require('fs');
var path = require('path');
var MailParser = require('mailparser').MailParser;
var axios = require('axios');
var moment = require('moment');
//=================信息配置======================================================

//邮箱地址,需要开启imap服务
var emailAccount = '邮箱账户';
//邮箱密码
var emailPwd = '邮箱密码';
//设置的邮件数量判断,不能超过邮箱内所有邮件数量
var emailCount = 3;
//设置多久未链接收件箱进行重启
var delayTime = 10 * 1000;//10s 未连接上,自动重连
//提交到服务器的地址
var posturl = `提交到的接口地址`
经过多次实际使用测试后的代码
var userInfo = {
    user: emailAccount,
    password: emailPwd,
    host: 'imap.qq.com',
    port: 993,
    tls: true
};
var data = {
    start: 0
};
//数据存储。
function store(data) {
    var filePath = path.join(__dirname, 'config.json');
    fs.writeFileSync(filePath, JSON.stringify(data));
}
var inflag = false;
function start (){
    console.log('-----进入启动函数-----'+moment().format('YYYY-MM-DD HH:mm:ss')+'-------------------------------------');
    var imap = new Imap(userInfo);
    imap.once('ready', function () {
        console.log(`已经成功连接服务器.`)
        setTimeout(function(){
            if(!inflag){
                //重启
                console.log(`无法连接收件箱,进行重新连接。`)
                imap.end();
            }
        },delayTime)
        imap.openBox('INBOX', false, function(){
            inflag = true;
            console.log('进入邮件收件箱')
            imap.once('mail',function(num){
                console.log('ddddddddddddd-----'+num)
            })
            //检查时间,如果当前时间是晚上10点,则进行一次检索,同时把当天的检索记录保留一下。
            var d = new Date();
            var daystr = moment().format('YYYY-MM-DD');
            var dh = d.getHours();
            //检查当天是否已经读取过了,如果读取过的话,则调过,没有则继续。
            if(dh == 22 && (!data.day || data.day[daystr] == null || data.day[daystr] == undefined || data.day[data.str] == false)){
                var timestr = (new Date(+new Date() - (5 * 60 * 1000))).toISOString();
                imap.search(['UNSEEN', ['SINCE', timestr]], function (err, results) {
                    if (err) {
                        console.log(`当前无邮件${err.message}`)
                        data.day[daystr] = true;
                        store(data);
                        imap.end();
                    }else{
                        try{
                            console.log('检索到结果:'+results);
                            var f = imap.fetch(results, {
                                bodies: ''
                            });
                            var maxno = 0;
                            f.on('message', function (msg, seqno) {
                                
                                console.log(`新邮件:[${seqno}]`)
                                var prefix = '(#' + seqno + ') ';
                                msg.on('body', function (stream, info) {
                                    var parser = new MailParser();
                                    stream.pipe(parser);
                                    //当邮件头部流全部传入mailparser后触发
                                    parser.on("data", function (data) {
                                        console.log(`邮件内容:[${data.text}]`)
                                        //读取结束
                                        console.log('--------------------结束检索邮件--------------------') 
                                        //提交到服务器。
                                        if(posturl){
                                            axios.post(posturl,{data :data.text}).then(function(rs){
                                                console.log('服务器返回:'+rs.data+moment().format('YYYY-MM-DD HH:mm:ss'));
                                            });
                                        }
                                        
                                    });
                                });
                                msg.once('end', function () { });
                                
                            });
                            f.once('error', function (err) {
                                console.log(`收取邮件报错:${err.message}`)
                                imap.end();
                            });
                            f.once('end', function () {
                                data.day[daystr] = true;
                                store(data);
                                imap.end();
                            });
                        }catch(e){
                        }
                        
                    }
                    
                });
            }
        });
    });
    imap.on('mail',function(num){
        console.log(`收到新邮件数量为:`+num)
        if(num > emailCount)return;//一次超过10,不算。
        var timestr = (new Date(+new Date() - (5 * 60 * 1000))).toISOString();
        console.log(timestr);
        //开始检索邮件
        console.log(`---------开始检索邮件------------`)
        imap.search(['UNSEEN', ['SINCE', timestr]], function (err, results) {
            if (err) {
                console.log(`当前无邮件${err.message}`)
                imap.end();
            }else{
                try{
                    console.log('检索到结果:'+results);
                    var f = imap.fetch(results, {
                        bodies: ''
                    });
                    var maxno = 0;
                    f.on('message', function (msg, seqno) {
                        maxno = Math.max(seqno,maxno);
                        if (seqno <= data.start) { //新邮件
                        } else {
                            console.log(`新邮件:[${seqno}]`)
                            var prefix = '(#' + seqno + ') ';
                            msg.on('body', function (stream, info) {
                                var parser = new MailParser();
                                stream.pipe(parser);
                                //当邮件头部流全部传入mailparser后触发
                                parser.on("data", function (data) {
                                    console.log(`邮件内容:[${data.text}]`)
                                    //读取结束
                                    console.log('--------------------结束检索邮件--------------------') 
                                    //提交到服务器。
                                    if(posturl){
                                        axios.post(posturl,{data :data.text}).then(function(rs){
                                            console.log('服务器返回:'+rs.data+moment().format('YYYY-MM-DD HH:mm:ss'));
                                        });
                                    }
                                    
                                });
                            });
                            msg.once('end', function () { });
                        }
                    });
                    f.once('error', function (err) {
                        console.log(`收取邮件报错:${err.message}`)
                        imap.end();
                    });
                    f.once('end', function () {
                        data.start = maxno; //更新文件
                        store(data);
                        imap.end();
                    });
                }catch(e){
                    console.log('当前无未读邮件!'+e.message)
                    imap.end();
                }
                
            }
            
        });
    })
    imap.once('error', function (err) {
        console.log(`链接失败,重新链接。${err.message}`);
        start();
    });
    imap.once('end', function () {
        console.log('当前轮次连接结束,启动下一次连接。')
        start();
    });
    imap.connect();
    //每隔5分钟重新建立连接
    setTimeout(function(){
        imap.end();//结束连接。
    },5 * 60 * 1000)
}

//第一次先读取
var filePath = path.join(__dirname,'config.json');
if(fs.existsSync(filePath)){
    data = JSON.parse(fs.readFileSync(filePath));
}
start();

代码写的很简陋,虽然使用一段时间,不过也一直没有做优化,所以看起来比较乱。不过直接拿着代码放在node环境下是可以直接跑的,等后面有时间了,做一个简易的邮箱客户端练练手。顺手练练electron.

相关文章
|
3月前
|
前端开发 JavaScript
node接收前端上传的图片,单文件、多文件同name、多文件不同name
本文介绍了在Node.js中使用multer模块接收前端上传的图片,包括单文件上传、多文件上传(同name和不同name)以及任意类型文件上传的方法。
88 0
|
4月前
|
大数据 数据处理 分布式计算
JSF 逆袭大数据江湖!看前端框架如何挑战数据处理极限?揭秘这场技术与勇气的较量!
【8月更文挑战第31天】在信息爆炸时代,大数据已成为企业和政府决策的关键。JavaServer Faces(JSF)作为标准的 Java Web 框架,如何与大数据技术结合,高效处理大规模数据集?本文探讨大数据的挑战与机遇,介绍 JSF 与 Hadoop、Apache Spark 等技术的融合,展示其实现高效数据存储和处理的潜力,并提供示例代码,助您构建强大的大数据系统。
55 0
|
4月前
|
JavaScript 安全 数据安全/隐私保护
深入Node.js与Express:从表单接收到数据验证的完整指南——实战技巧揭秘后端开发中的表单处理流程
【8月更文挑战第31天】在Web开发中,处理表单数据至关重要。本文通过实例详细讲解了如何利用Node.js与Express框架接收和验证表单数据。首先,搭建环境并初始化一个简单的Express应用;接着,演示如何接收用户注册表单中的`username`和`email`字段;最后,引入`joi`模块进行数据验证,确保数据安全准确。掌握这些技能有助于开发者构建更安全、友好的Web应用。随着Node.js和Express的不断进步,未来将有更多高级功能值得期待。
116 0
【Node】—接收参数 插入数据 实现注册功能
【Node】—接收参数 插入数据 实现注册功能
|
JavaScript
node.js:Inquirer.js接收命令行交互输入
node.js:Inquirer.js接收命令行交互输入
301 0
node.js:Inquirer.js接收命令行交互输入
|
26天前
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
26 2
2024年5月node.js安装(winmac系统)保姆级教程
|
24天前
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
75 2
|
3月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装
|
2月前
|
JavaScript 开发工具 git
已安装nodejs但是安装hexo报错
已安装nodejs但是安装hexo报错
38 2
|
2月前
|
JavaScript 算法 内存技术
如何降低node.js版本(nvm下载安装与使用)
如何降低node.js版本(nvm下载安装与使用)