如何修改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();
修改细节说明
CSV结构定义:
- 表头设置为
Тип,Дата,День недели,Время(对应类型、日期、星期、时间),与Excel表格列一一对应 - 每条记录通过逗号分隔列,彻底解决原txt文件换行导致的格式混乱问题
- 表头设置为
数据格式化:
- 对小时和分钟使用
padStart(2, '0')补零,确保时间格式统一为两位数字(如09:05而非9:5) - 将日期整理为
日.月的展示形式,符合需求中的格式要求
- 对小时和分钟使用
错误处理优化:
- 添加
try/catch捕获连接、读取邮件、写入文件过程中的异常,便于快速排查问题
- 添加
代码可读性提升:
- 将函数名改为语义化的
exportAttendanceToCSV - 直接在遍历邮件时筛选并构建记录,减少中间数组的使用,提升运行效率
- 将函数名改为语义化的
内容的提问来源于stack exchange,提问作者Stanislav Shatalov
相关产品推荐
相关产品推荐

