如何使用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
相关产品推荐
相关产品推荐

