qq邮箱发送或者接收文件

发布时间 2023-11-03 11:46:42作者: 蔚蓝Azure

qq邮箱发送或者接收文件

const nodemailer = require("nodemailer");

//发送邮件服务器: smtp.qq.com,使用SSL,端口号465或587
const transporter = nodemailer.createTransport({
    host: "smtp.qq.com",
    port: 587,
    secure: false,
    auth: {
        user: 'xxx@qq.com',
        pass: 'xxx' // 授权码
    },
});

async function send() {
    const info = await transporter.sendMail({
        from: {
            address: 'xxx@qq.com'
        },
        to: "xxx@163.com",
        subject: "测试标题",
        text: "测试内容"
    });

    console.log("邮件发送成功:", info.messageId);
}

send().catch(console.error);

const { MailParser } = require('mailparser');
const notifier = require('node-notifier');
const path = require('path');
const Imap = require('imap');
// 接收邮件服务器: imap.qq.com,使用SSL,端口号993
const imap = new Imap({
    user: 'xxx@qq.com',
    password: 'xxx', // 授权码
    host: 'imap.qq.com',
    port: 993,
    tls: true
});

// 添加指定邮箱关键词
const fromMailText = 'jd';

// 连接到IMAP服务器
imap.connect();

// 当连接成功时
imap.once('ready', () => {
    // 打开收件箱
    imap.openBox('INBOX', true, (err, box) => {
        if (err) throw err;
        console.log('Connected to INBOX');

        // 获取今天启动时间
        const today = new Date();
        today.setHours(0, 0, 0, 0);
        const startDate = today.toISOString();

        // 构建搜索条件,搜索从今天启动时间之后的新邮件
        const searchCriteria = ['UNSEEN', ['SINCE', startDate]];

        // 监听新邮件事件
        imap.on('mail', () => {
            console.log('Received new message(s)');

            // 搜索未读邮件 添加搜索条件
            imap.search(searchCriteria, (err, results) => {
                if (err) throw err;

                // 获取最新的邮件
                const f = imap.fetch(results, { bodies: '' });
                f.on('message', (msg, seqno) => {
                    const mailparser = new MailParser();
                    msg.on('body', (stream) => {
                        const info = {};
                        stream.pipe(mailparser);
                        mailparser.on("headers", (headers) => {
                            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 = headers.get('date').toLocaleString();
                        });

                        mailparser.on("data", (data) => {
                            // 添加判断逻辑
                            if (info.form.toString().includes(fromMailText)) {
                                let text = data.text
                                let regex;
                                const regexCn = /验证码是\n+\s*\n+(\d+)\n+/;
                                const regexEn = /code is\n+\s*\n+(\d+)\n+/;
                                regex = text.includes('验证码') ? regexCn : regexEn;
                                const match = text.match(regex);
                                const verificationCode = match ? match[1] : '';

                                notifier.notify({
                                    title: info.form,
                                    message: verificationCode,
                                    icon: path.join(__dirname, 'mail.png')
                                });
                                console.warn(verificationCode); // 输出验证码
                            }

                            // 文件类型判断自动下载到指定文件夹
                            // if (data.type === 'text') {
                            //     info.html = data.html;
                            //     info.text = data.text;

                            //     const filePath = path.join(__dirname, 'mails', info.theme + '.html');
                            //     fs.writeFileSync(filePath, info.html || info.text)

                            //     console.log(info);
                            // }
                            // if (data.type === 'attachment') {
                            //     const filePath = path.join(__dirname, 'files', data.filename);
                            //     const ws = fs.createWriteStream(filePath);
                            //     data.content.pipe(ws);
                            // }

                        })
                    });
                });

                // 标记邮件为已读
                f.on('end', () => {
                    imap.addFlags(results, 'Seen', (err) => {
                        if (err) console.error(err);
                    });
                });
            });
        });
    });
});

// 连接错误处理
imap.once('error', (err) => {
    console.error(err);
});

// 连接断开处理
imap.once('end', () => {
    console.log('Connection ended');
});