将新邮件存入PostgreSQL数据库:代码无法打印新邮件信息
问题修复与邮件入库实现
一、原代码的问题排查
- debug配置错误:
debug: console.log()是立即执行函数,应改为debug: console.log(传递函数引用),否则无法输出调试信息。 - 搜索过滤器兼容问题:Gmail的IMAP对
NEW标签支持有限,建议改用UNSEEN监听未读邮件。 - 触发条件限制过严:原代码仅在邮件带附件时打印,无附件的邮件不会输出,易造成监听失效的误解。
- 缺少错误监听:未添加
error事件监听,无法排查连接失败、认证错误等问题。 - Gmail认证要求:若账号开启两步验证,必须使用应用专用密码,而非普通登录密码。
二、修复后的完整代码(含PostgreSQL入库)
先安装依赖:
npm install mail-listener-typescript pg
代码实现:
import { MailListener, IMailObject, IMailAttachment } from "mail-listener-typescript"; import { Pool } from "pg"; // PostgreSQL连接配置 const pool = new Pool({ user: "你的PG用户名", host: "localhost", database: "你的数据库名", password: "你的PG密码", port: 5432, }); const options = { username: "xxx@gmail.com", password: "你的Gmail应用专用密码", // 两步验证账号需用此密码,无验证可填普通密码 host: "imap.gmail.com", port: 993, tls: true, connTimeout: 10000, authTimeout: 5000, debug: console.log, // 修正debug配置为函数引用 tlsOptions: { rejectUnauthorized: false }, mailbox: "INBOX", searchFilter: ["UNSEEN"], // 改用UNSEEN兼容Gmail }; const MailListenerTS = new MailListener(options); // 监听连接错误 MailListenerTS.on("error", (err) => { console.error("邮件监听出错:", err); }); // 监听连接成功 MailListenerTS.on("server:connected", () => { console.log("已连接到IMAP服务器"); }); // 处理新邮件并入库 MailListenerTS.on("mail", async (mail: IMailObject) => { try { const sender = mail.from.value[0]; // 整理邮件数据 const mailInfo = { senderName: sender.name, senderEmail: sender.address, subject: mail.subject || "", message: mail.text || mail.html || "", date: new Date(mail.date), attachments: mail.attachments.map(att => ({ filename: att.filename, contentType: att.contentType, size: att.size })) }; console.log("收到新邮件:", mailInfo); // 插入user表(避免重复插入) await pool.query( "INSERT INTO user (email, name) VALUES ($1, $2) ON CONFLICT (email) DO NOTHING", [mailInfo.senderEmail, mailInfo.senderName] ); // 插入context表 const contextResult = await pool.query( "INSERT INTO context (subject, message) VALUES ($1, $2) RETURNING id", [mailInfo.subject, mailInfo.message] ); console.log("邮件已入库,context ID:", contextResult.rows[0].id); } catch (dbErr) { console.error("数据库入库失败:", dbErr); } }); MailListenerTS.start();
三、关键注意事项
- Gmail认证设置:
- 开启两步验证的账号,需前往Google账号安全页生成应用专用密码。
- 未开启两步验证的账号,需开启"低安全性应用访问"(不推荐,建议启用两步验证)。
- 数据库适配:
- 若
user表的email字段是主键,ON CONFLICT (email) DO NOTHING可避免重复插入同一发件人信息。 - 如需存储附件详情,可新增
attachment表,通过context.id关联存储。
- 若
- 邮件内容处理:优先存储
mail.text纯文本内容,无纯文本时再用mail.html格式。
内容的提问来源于stack exchange,提问作者Terra
相关产品推荐
相关产品推荐

