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: '[email protected]',
            /** 这里填写的不是 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();
    }

猜你喜欢

转载自blog.csdn.net/weixin_43704471/article/details/126928094
今日推荐