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

如何从SendGrid入站解析Webhook提取邮件正文、发件人等详情

处理SendGrid入站Webhook邮件内容提取问题

问题背景

在Firebase Cloud Function中接收SendGrid入站解析Webhook传来的multipart/form-data格式payload,尝试用simpleParser等库提取邮件正文、发件人、收件人、主题等信息时失败。

解决方案

步骤1:先解析multipart/form-data payload

SendGrid的入站Webhook以multipart/form-data格式发送数据,其中email字段包含完整的RFC822格式邮件内容。必须先从请求中提取这个字段,再进行邮件解析。

推荐使用busboy库处理form-data解析(适配Firebase Cloud Function环境),也可以用multer中间件替代。

步骤2:解析邮件内容

提取到email字段的原始内容后,使用mailparser库的simpleParser方法解析,即可获取标准化的邮件字段。

完整代码示例

  1. 安装依赖:
npm install mailparser busboy
  1. Firebase Cloud Function代码:
const { simpleParser } = require('mailparser');
const Busboy = require('busboy');

exports.handleSendGridWebhook = async (req, res) => {
  // 仅处理POST请求
  if (req.method !== 'POST') {
    return res.status(405).send('Method Not Allowed');
  }

  // 初始化Busboy解析form-data
  const busboy = new Busboy({ headers: req.headers });
  let rawEmailContent = '';

  // 监听字段解析,提取email字段的内容
  busboy.on('field', (fieldName, value) => {
    if (fieldName === 'email') {
      rawEmailContent = value;
    }
  });

  // 解析完成后处理邮件内容
  busboy.on('finish', async () => {
    try {
      // 解析原始邮件字符串
      const parsedEmail = await simpleParser(rawEmailContent);

      // 提取所需的核心信息
      const extractedInfo = {
        from: parsedEmail.from.text, // 带名称的发件人(如"5WsApp Dev1 <5wsapp.dev1@gmail.com>")
        to: parsedEmail.to.text, // 收件人
        subject: parsedEmail.subject, // 邮件主题
        textBody: parsedEmail.text, // 纯文本正文
        htmlBody: parsedEmail.html // HTML格式正文
      };

      // 此处添加你的业务逻辑,比如存储到Firestore、触发通知等
      console.log('提取到的邮件信息:', extractedInfo);

      res.status(200).send('Webhook processed successfully');
    } catch (error) {
      console.error('邮件解析失败:', error);
      res.status(500).send('Failed to process webhook');
    }
  });

  // 将请求流导入Busboy开始解析
  req.pipe(busboy);
};

关键说明

  • 之前失败的核心原因是直接解析了整个请求体,而非提取form-data中的email字段内容。SendGrid的payload里,只有email字段才是符合标准邮件格式的完整内容,其他字段(如from、to)是SendGrid预先提取的简化版本,若需要更规范的信息,建议解析email字段。
  • 若仅需基础信息,也可以直接从form-data的from、to、subject字段获取,但这些字段的格式可能存在不统一的情况。

内容的提问来源于stack exchange,提问作者מיכאל ברגינסקי

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:40:29