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

在SMTP仅允许单一发件地址的场景下,如何用C#的MailMessage类实现「代表指定用户发送邮件」功能

在SMTP仅允许单一发件地址的场景下,如何用C#的MailMessage类实现「代表指定用户发送邮件」功能

我完全懂你的困扰——UAT环境的SMTP限制真的很磨人,既要遵守服务器的白名单规则,又得让收件人清楚是谁实际发起了操作。刚好你用的System.Net.Mail.MailMessage类就有现成的属性能实现「代表发送」的效果,不用额外复杂的配置。

核心解决方案:利用Sender属性实现「On-behalf of」

SMTP服务器只认noreply@domain.com作为发件地址,那我们就把这个地址设为From属性(这是服务器验证的必填项),然后用Sender属性来指定实际操作的用户邮箱——这个字段就是邮件客户端用来显示「代表谁发送」的关键。

当From和Sender不一致时,Outlook等主流邮件客户端会自动解析成「X on behalf of Y」的显示格式,完全符合你的需求。

完整代码示例

using System.Net.Mail;

// 初始化邮件对象
var mail = new MailMessage();

// 必须设置为SMTP允许的白名单地址(服务器验证用)
mail.From = new MailAddress("noreply@domain.com", "系统通知");

// 设置代表发送的用户信息——这就是实现"On-behalf of"的核心
mail.Sender = new MailAddress("abc@domain.com", "张三"); // 第二个参数是用户名,可优化显示

// 常规邮件配置
mail.To.Add(new MailAddress("收件人邮箱@example.com"));
mail.Subject = "【系统操作通知】你的申请已处理";
mail.Body = "这是一封由系统代表张三(abc@domain.com)发送的操作通知邮件";

// 发送邮件的SMTP客户端配置
using (var smtpClient = new SmtpClient("你的UAT-SMTP服务器地址", 587))
{
    smtpClient.Credentials = new System.Net.NetworkCredential("noreply@domain.com", "你的SMTP密码");
    smtpClient.EnableSsl = true; // 根据服务器要求调整
    smtpClient.Send(mail);
}

注意事项

  • 大多数SMTP服务器不会限制Sender字段的设置,因为它只是用于显示,实际发件人还是白名单里的noreply@domain.com,不会触发安全限制。
  • 如果不需要显示用户名,Sender可以只传邮箱地址:new MailAddress("abc@domain.com"),客户端会直接显示邮箱。
  • 这个方案只需要修改少量代码(替换原有的From设置,新增Sender配置),不需要调整白名单,也不会有垃圾邮件风险,完美平衡了合规性和用户体验。

备注:内容来源于stack exchange,提问作者GokuSS3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:44:34