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

Node.js中通过SendGrid发信如何获取Ethereal邮件消息ID

解决方案

核心逻辑为主动给每封开发环境的测试邮件自定义唯一的Message-ID,发送后直接用该ID拼接Ethereal的邮件访问URL即可。

实现步骤

  • 安装uuid用于生成唯一ID:npm install uuid
  • 开发环境发送邮件时,在SendGrid的邮件参数中传入自定义Message-ID头,发送成功后直接拼接访问地址打印,代码示例如下:
const sgMail = require('@sendgrid/mail');
const { v4: uuidv4 } = require('uuid');

// 配置SendGrid使用Ethereal的SMTP服务(开发环境)
sgMail.setApiKey('你的SendGrid配置');
sgMail.setSmtpConfig({
  host: 'smtp.ethereal.email',
  port: 587,
  auth: {
    user: '你用nodemailer生成的Ethereal账号',
    pass: '你用nodemailer生成的Ethereal密码'
  }
});

async function sendTestMail() {
  // 生成符合RFC规范的唯一Message-ID
  const customMsgId = `<${uuidv4()}@dev.local>`;
  const mailOptions = {
    to: '收件人地址',
    from: '发件人地址',
    subject: '开发环境测试邮件',
    text: '测试邮件内容',
    html: '<p>测试邮件内容</p>',
    // 传入自定义邮件头
    headers: {
      'Message-ID': customMsgId
    }
  };

  await sgMail.send(mailOptions);
  // 去掉Message-ID首尾的<>拼接访问URL
  const pureMsgId = customMsgId.slice(1, -1);
  const visitUrl = `https://ethereal.email/message/${pureMsgId}`;
  console.log('测试邮件可直接访问:', visitUrl);
}

注意事项

  • 上述逻辑仅需要在NODE_ENV === 'development'的分支下执行,不要影响生产环境配置
  • 自定义Message-ID必须包裹在<>中,符合邮件协议的格式要求,否则Ethereal无法正常识别
  • 该方案稳定性远高于IMAP拉取最新邮件的逻辑,不存在时序不匹配的问题,也不需要额外做邮件匹配

原方法失败原因

你之前从SendGrid返回结果无法拿到正确ID,是因为SendGrid默认返回的是平台内部的业务ID,不是邮件协议层面的Message-ID;而IMAP拉取最新邮件的方式存在发送和接收的时序差,也无法100%准确匹配到刚发送的邮件,主动自定义Message-ID是当前最优的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:21:01