Nodejs 邮件系统踩坑记

   因为经常在网上查看资料,想过,要是没有了那些经常写技术博客的人,那岂不是很难搞了?所以我也做一下共享吧,记录一下我在邮件系统踩的坑。

   首先,这是一个很常用的功能,毕竟有时候你想要收到某个及时的通知,而且又是免费的。微信,微信现在不方便了,微信的网页登录被禁了,qq就不用想了。所以很多情况下,我们的选择就只有邮件了。

   这篇文章是主要针对nodejs的。 首先要介绍要用的包:

"mail-notifier": "^0.5.0",
"nodemailer": "^6.5.0",

nodeemailer 是发邮件的,发邮件很简单,几行代码就搞定了。 难的是收邮件,不过你不一定找到对应的包。你可能会找到imap, 那个有点难搞,会有不少坑。 虽然功能都是能实现的,但是因为你的连接可能会中断。一中断就难搞了,所以要是用imap的话,一开始就要设计好重启的步骤。其实用对了包之后,就方便很多了,我其实可以直接贴代码了。我下面是实现收发邮件的代码,收邮件是接收最新的3封邮件,所以我直接吧mail-notifier这个包的源码拿来改成我需要的了。代码如下,供参考:

"use strict";
const nodemailer = require("nodemailer");
const notifier = require('./notifier');
const cfg = require("./config");
const utils = require("./utils");
const { isString } = require("util");
const global = require('./global');
const n = notifier(imap);
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
    host: "smtp.qq.com",
    port: 25,
    secure: false, // true for 465, false for other ports
    auth: {
        user: cfg.mail_account, // generated ethereal user
        pass: cfg.mail_password // generated ethereal password
    }
});


var imap = {
    user: cfg.mail_account,
    password: cfg.mail_password,
    host: 'imap.qq.com',
    port: 993,
    tls: true,
    connTimeout:20000,
    authTimeout:10000
};

var REC_RES=-1;

async function sendMail(ctx) {
    let content = utils.img2base64('C:/sixiaoren.jpg');
    // setup email data with unicode symbols
    let mailOptions = {
        from: `"真的是挂" <${cfg.mail_account}>`, // sender address
        to: cfg.mail_sendto, // list of receivers
        subject: "四小人", // Subject line
        //   text: ecode, // plain text body
        html: `<img src="https://img-blog.csdnimg.cn/2022010611225280767.jpeg">`// html body
    };
    REC_RES=-1;
    // send mail with defined transport object
    await transporter.sendMail(mailOptions);
    return ctx.body='ok';
}

async function waitAnswer(ctx){  
    var it = setInterval(() => {
        n.scan(x=>x);        
    }, 10000);
    
    for(let i=0;i<10000;i++){
        if(REC_RES!=-1){
            clearInterval(it);
            return ctx.body = REC_RES;
        }
        await utils.wait(10);
    }
    clearInterval(it);
    return ctx.body = REC_RES;
}

const handleMail = (res)=>{
    console.log('res uid  is',res.uid);
    if(res.uid>global.mail_uid) global.mail_uid=res.uid;

    let from = res.from[0].address;
    let time = new Date(res.date);
    let subject = res.subject;
    let tg = Date.now() - time.getTime();
    if(tg<360000 && from.match(/653@qq|804@qq|575@qq|ada@qq/)){
        REC_RES = subject.trim();
        console.log("have handle new email from ", from, " and the answer is: ",REC_RES);
    }
}

n.on('end', () => n.start()) // session closed
  .on('mail', handleMail)
  .on('error',e=>{console.log(e);})
  .start();

module.exports = {
    sendMail,
    waitAnswer
};

// sendMail({})

notifier.js 我就改了一部分,代码比较多我就不全贴了:


Notifier.prototype.scan = function (callback) {
    var self = this, search = [['UID', global.mail_uid-2 + ':*']];
    self.dbg('scanning %s with filter `%s`.', self.options.box,  search);
    self.imap.search(search, function (err, seachResults) {
        if (err) {
            self.emit('error', err);
            callback();
			return;
        }

global.mail_uid是一个全局变量,代码仓库在:
源码   当然上面有很多不相关的代码。邮件部分就主要在mail.js里。

最后,网易邮箱imap连接有问题,建议不要注册网易邮箱

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值