NodeJS 实时收发 QQ 邮件

安装依赖 pnpm i mailparser imap moment

import { MailParser } from 'mailparser';
import * as Imap from 'imap';
import { createWriteStream, readFileSync, unlinkSync } from 'fs';
import { join } from 'path';
import * as moment from 'moment';

async QQ() {
		const imap = new Imap({
			/** QQ 邮箱 */
            user: 'xxx@qq.com',
            /** 这里填写的不是 QQ邮箱的密码,这里是 pop3 的密钥 */
            password: 'xxxxx',
            host: 'pop.qq.com',
            tls: false,
            authTimeout:1000,
            tlsOptions: { rejectUnauthorized: false }
        });
        const search = () => imap.search([['UNSEEN', ['SINCE', (new Date(+new Date() - (5 * 60 * 1000))).toISOString()]]], (err, results) => {
            if (!err) {
                try {
                    const f = imap.fetch(results, { 
                        markSeen: false,
                        bodies: '',
                        struct: true,
                    });
                    f.on('message', (msg) => {
                        const mailparser = new MailParser();
                        const info = {
                            theme: '',
                            form: '',
                            mailName: '',
                            to: '',
                            datatime: '',
                            html: null,
                            text: null,
                            uid: null,
                            buffer: null,
                        };
                        let status = 0;
                        const next = (data: any) => {
                            imap.setFlags([data.uid], 'SEEN', () => {});
                            /** 这里拿到的 data 可以直接进行数据库存储 */
                            console.log(data);
                        }
                        msg.on('body', (stream) => {
                            stream.pipe(mailparser);
                            mailparser.on("headers", (headers: any) => {
                                info.theme = headers.get('subject');
                                info.form = headers.get('from').value[0].address;
                                info.mailName = headers.get('from').value[0].name;
                                info.to = headers.get('to').value[0].address;
                                info.datatime = moment(headers.get('date')).format('YYYY-MM-DD HH:mm:ss');
                                status ++;
                                if (status === 3) {
                                    next(info);
                                }
                            });
                            mailparser.on("data", (data) => {
                                if (data.type === 'text') {
                                    status ++;
                                    info.html = data.html;
                                    info.text = data.text;
                                    if (status === 3) {
                                        next(info);
                                    }
                                }
                                if (data.type === 'attachment') {
                                    const path = join(__dirname, '..', '..', '..', '..', 'public', 'mailer', `${new Date().valueOf()}.${data.filename.split('.')[data.filename.split('.').length - 1]}`);
                                    const ws = createWriteStream(path);
                                    ws.on('close', () => {
                                        status ++;
                                        info.buffer = readFileSync(path);
                                        unlinkSync(path);
                                        if (status === 3) {
                                            next(info);
                                        }
                                    });
                                    data.content.pipe(ws);
                                    data.release();
                                }
                            });
                        });
                        msg.on('attributes', (data) => {
                            info.uid = data.uid;
                            status ++;
                            if (status === 3) {
                                next(info);
                            }
                        });
                    });
                } catch(err) {}
            } else {
                throw err;
            }
        });
        let init = true;        
        imap.once('ready', () => {
            imap.openBox('INBOX', true, (err) => {
                if (!err) {
                    init = false;
                    search();
                } else {
                    throw err
                }
            });
        });
        imap.on('mail', () => {
            if (!init) {
                search()
            }
        });
        imap.connect();
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甘宇辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值