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

将新邮件存入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认证设置:
    1. 开启两步验证的账号,需前往Google账号安全页生成应用专用密码。
    2. 未开启两步验证的账号,需开启"低安全性应用访问"(不推荐,建议启用两步验证)。
  • 数据库适配:
    • 若user表的email字段是主键,ON CONFLICT (email) DO NOTHING可避免重复插入同一发件人信息。
    • 如需存储附件详情,可新增attachment表,通过context.id关联存储。
  • 邮件内容处理:优先存储mail.text纯文本内容,无纯文本时再用mail.html格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:40:27