MimeKit SMTP Client如何排除特定域的信封收件人
解决MimeKit发送邮件时信封收件人与邮件内容收件人分离的问题
不需要更换其他库,MimeKit的SmtpClient提供了重载的Send方法,允许你手动指定SMTP信封的收件人列表,完全不用修改原邮件内容里的To/Cc字段,刚好满足你的需求。
核心原理
SMTP协议中,信封层面的RCP TO指令与邮件内容里的To/Cc是相互独立的。MimeKit默认会将邮件的To、Cc、Bcc收件人全部加入RCP TO,但你可以通过重载方法自定义这个列表,实现“内容保留收件人,信封排除特定域”的效果。
修改后的代码
将原代码中的client.Send(message)替换为以下逻辑:
public void SendMessage(string emlFilePath, List<string> domainsToExclude) { // Load message EML file MimeMessage message; using(var stream = File.OpenRead(emlFilePath)) { message = MimeMessage.Load(stream); } using(var client = new SmtpClient(new ProtocolLogger(Console.OpenStandardOutput()))) { client.Connect("smtp_server", 587, SecureSocketOptions.StartTls); client.Authenticate("user", "pass"); // 构建信封收件人列表:排除指定域的收件人 var filteredRecipients = new List<MailboxAddress>(); // 处理To收件人 foreach (var addr in message.To.Mailboxes) { var domain = addr.Address.Split('@').LastOrDefault(); if (!domainsToExclude.Contains(domain, StringComparer.OrdinalIgnoreCase)) { filteredRecipients.Add(addr); } } // 处理Cc收件人 foreach (var addr in message.Cc.Mailboxes) { var domain = addr.Address.Split('@').LastOrDefault(); if (!domainsToExclude.Contains(domain, StringComparer.OrdinalIgnoreCase)) { filteredRecipients.Add(addr); } } // 使用自定义收件人列表发送,原邮件内容保持不变 client.Send(message, filteredRecipients); client.Disconnect(true); } }
效果说明
- 邮件内容里的To/Cc字段完全保留,Outlook等客户端打开邮件时仍能看到所有收件人(包括exclude.com域的);
- SMTP通信过程中,
RCP TO指令只会包含筛选后的收件人,exclude.com域的地址不会被发送到SMTP服务器。
内容的提问来源于stack exchange,提问作者Rafiq39
相关产品推荐
相关产品推荐

