如何从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方法解析,即可获取标准化的邮件字段。
完整代码示例
- 安装依赖:
npm install mailparser busboy
- 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,提问作者מיכאל ברגינסקי
相关产品推荐
相关产品推荐

