You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Node.js代码从Outlook读取指定主题邮件并生成目标CSV

解决Outlook邮件导出为指定格式CSV文件的代码修改方案

需求:从Outlook邮箱读取主题为“Приход в офис”(到岗)和“Уход”(离岗)的邮件,生成符合指定格式的Excel兼容CSV文件。
当前问题:基于ImapFlow的Node.js代码生成的是txt文件,格式不符合预期。

核心修改点

  • 切换输出格式为CSV:CSV是Excel原生支持的文本格式,通过逗号分隔列,需先定义表头再按行写入数据
  • 重构数据存储逻辑:将分散的数组改为统一存储每条记录的对象数组,便于构建CSV行
  • 修正日期时间拼接格式:按照CSV列要求整理字段,避免换行导致格式混乱
  • 修复文件写入的异步逻辑:fs.promises.writeFile无需回调函数,直接使用await即可

修改后的完整代码

const { ImapFlow } = require('imapflow');
const fs = require("fs").promises;

// Exchange WebService (MAPI) 配置
const imap = new ImapFlow({
    host: "outlook.office365.com",
    port: 993,
    secure: true,
    auth: {
        user: "pug**y@outlook.com",
        pass: "****",     
    }    
});

async function exportAttendanceToCSV() {
    const days = ["", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
    // 存储每条符合条件的考勤记录
    const attendanceRecords = [];

    try {
        await imap.connect();
        const lock = await imap.mailboxOpen('INBOX'); // 读取收件箱,需读取已发送邮件可改为'SENT'
        
        // 遍历邮件并筛选指定主题的记录
        for await (let msg of imap.fetch('1:*', { envelope: true })) {
            const { subject, date } = msg.envelope;
            if (subject === 'Приход в офис' || subject === 'Уход') {
                const myDate = new Date(date);
                attendanceRecords.push({
                    type: subject,
                    day: myDate.getDate(),
                    month: myDate.getMonth() + 1,
                    dayOfWeek: days[myDate.getDay()],
                    hours: myDate.getHours().toString().padStart(2, '0'), // 补零保持两位数字格式
                    minutes: myDate.getMinutes().toString().padStart(2, '0')
                });
            }
        }

        await imap.logout();

        // 构建CSV内容:先写表头,再拼接每行数据
        const csvHeader = "Тип,Дата,День недели,Время\n";
        const csvRows = attendanceRecords.map(record => 
            `${record.type},${record.day}.${record.month},${record.dayOfWeek},${record.hours}:${record.minutes}`
        ).join('\n');
        const csvContent = csvHeader + csvRows;

        // 写入CSV文件
        await fs.writeFile("attendance.csv", csvContent, 'utf8');
        console.log("CSV文件导出完成!");
    } catch (error) {
        console.error("导出过程出错:", error);
    }
}

exportAttendanceToCSV();

修改细节说明

  1. CSV结构定义:

    • 表头设置为Тип,Дата,День недели,Время(对应类型、日期、星期、时间),与Excel表格列一一对应
    • 每条记录通过逗号分隔列,彻底解决原txt文件换行导致的格式混乱问题
  2. 数据格式化:

    • 对小时和分钟使用padStart(2, '0')补零,确保时间格式统一为两位数字(如09:05而非9:5)
    • 将日期整理为日.月的展示形式,符合需求中的格式要求
  3. 错误处理优化:

    • 添加try/catch捕获连接、读取邮件、写入文件过程中的异常,便于快速排查问题
  4. 代码可读性提升:

    • 将函数名改为语义化的exportAttendanceToCSV
    • 直接在遍历邮件时筛选并构建记录,减少中间数组的使用,提升运行效率

内容的提问来源于stack exchange,提问作者Stanislav Shatalov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:27:36