#!/usr/bin/env node // 邮件工具(IMAP 收发) // 通过 stdin 接收 JSON 参数 let input = ''; process.stdin.on('data', (chunk) => input += chunk); process.stdin.on('end', async () => { try { const params = JSON.parse(input.trim() || '{}'); const action = params.action || 'list_unread'; const limit = params.limit || 5; const host = process.env.EMAIL_IMAP_HOST; const port = parseInt(process.env.EMAIL_IMAP_PORT || '993'); const user = process.env.EMAIL_IMAP_USER; const password = process.env.EMAIL_IMAP_PASSWORD; if (!host || !user || !password) { console.log('请设置 EMAIL_IMAP_HOST, EMAIL_IMAP_USER, EMAIL_IMAP_PASSWORD'); process.exit(1); } // 使用 openssl s_client 连接 IMAP over SSL // 简单实现:列出收件箱最近 N 封邮件摘要 const net = require('net'); const tls = require('tls'); const socket = tls.connect(port, host, { rejectUnauthorized: false }, () => { let buf = ''; let step = 0; let tag = 0; function cmd(line) { tag++; socket.write(`A${tag} ${line}\r\n`); return `A${tag}`; } socket.on('data', (data) => { buf += data.toString('utf-8'); // 简化处理:等服务器就绪后依次发命令 if (step === 0 && buf.includes('OK')) { step = 1; cmd(`LOGIN "${user}" "${password}"`); } else if (step === 1 && buf.includes(`A1 OK`)) { step = 2; cmd('SELECT INBOX'); } else if (step === 2 && buf.includes(`A2 OK`)) { step = 3; cmd(`FETCH 1:${limit} (FLAGS INTERNALDATE BODY.PEEK[HEADER.FIELDS (SUBJECT FROM DATE)])`); } else if (step === 3 && buf.includes(`A3 OK`)) { step = 4; // 解析结果 const lines = buf.split('\n').filter(l => l.trim()); const results = []; let current = {}; for (const line of lines) { if (line.match(/^\* \d+ FETCH/)) { if (current.subject) results.push(current); current = {}; } const subjMatch = line.match(/^SUBJECT: (.+)$/i); const fromMatch = line.match(/^FROM: (.+)$/i); const dateMatch = line.match(/^DATE: (.+)$/i); if (subjMatch) current.subject = subjMatch[1].trim(); if (fromMatch) current.from = fromMatch[1].trim(); if (dateMatch) current.date = dateMatch[1].trim(); } if (current.subject) results.push(current); console.log(`最近 ${results.length} 封邮件:`); results.forEach((r, i) => { console.log(`\n${i+1}. 主题: ${r.subject || '(无主题)'}`); console.log(` 发件人: ${r.from || '未知'}`); console.log(` 时间: ${r.date || '未知'}`); }); cmd('LOGOUT'); } }); }); socket.setTimeout(15000, () => { console.log('连接 IMAP 超时'); process.exit(1); }); } catch (e) { console.log(`邮件查询失败: ${e.message}`); process.exit(1); } });