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

如何使用SendGrid转发入站邮件并保留原始发件人相关字段

问题解答

1. 能否通过SendGrid实现需求

可以实现,你遇到的报错是逻辑使用错误导致的。
SendGrid的发件人身份验证校验的是邮件信封层面的From地址,你当前用MimeMessage.ResentTo的方式做转发,没有修改原始邮件的From字段,自然会触发校验失败。
正确的实现逻辑如下:

  • 保留原始邮件的所有正文、头信息不做修改
  • 将信封发件人改为你已经在SendGrid完成验证的发件人地址
  • 把原始发件人地址填写到邮件的Reply-To头中,同时可以新增自定义头(比如X-Original-From、X-Original-To)存储原始收发件人信息
    Zoho Desk默认支持从Reply-To头识别实际诉求发起方,也支持配置读取自定义头字段填充工单属性,完全可以满足你保留原始信息的需求。

你原有代码的调整参考:

SmtpClient cli = new SmtpClient();
cli.Connect(_config["SendGrid:Server"], int.Parse(_config["SendGrid:Port"]), true);
cli.Authenticate(_config["SendGrid:Username"],_config["SendGrid:ApiKey"]);

// 新增:暂存原始收发件人
var originalFrom = message.From;
var originalTo = message.To;

// 修改信封发件人为验证过的地址
message.From.Clear();
message.From.Add(MailboxAddress.Parse(_config["SendGrid:From"]));

// 原始发件人放到Reply-To
message.ReplyTo.Clear();
message.ReplyTo.AddRange(originalFrom);

// 新增自定义头存储原始信息
message.Headers.Add("X-Original-From", originalFrom.ToString());
message.Headers.Add("X-Original-To", originalTo.ToString());

// 收件人改为Zoho Desk通道地址
message.To.Clear();
message.To.AddRange(from o in matches
                          select MailboxAddress.Parse((string)o.ticket_addr));

cli.Send(message);

2. 其他可选方案

  • 自建MTA转发:部署Postfix、Exim这类开源邮件传输代理,配置规则将SendGrid Inbound Parse投递过来的邮件原封不动转发到Zoho Desk,不存在发件人身份验证限制,不会修改任何原始邮件内容。
  • 双MX记录分流:在你的域名DNS配置中新增一条优先级更低的MX记录指向Zoho Desk的入站通道地址,所有发送到该域名的邮件会同时被SendGrid和Zoho Desk接收,不需要额外开发转发逻辑。
  • 邮件附件转发:将完整的原始邮件导出为.eml格式作为附件发送,发件人使用你在任意服务商验证过的地址,Zoho Desk侧可以直接下载附件查看完整的原始邮件信息。
  • 专门的邮件转发服务:使用支持入站中转功能的邮件服务,这类服务原生适配转发场景,不需要修改邮件头即可完成转发,不会触发发件人身份校验规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:24:00