使用PowerShell调用MailKit发送邮件报relay not permitted错误求助
PowerShell调用MailKit发送邮件提示「relay not permitted」的解决方案
你遇到的错误本质是内部SMTP服务器拒绝为当前请求提供邮件中继服务,排除网络、服务端本身故障后,问题出在MailKit的默认配置与SMTP服务的中继校验规则不匹配,可按以下步骤修复:
- 配置正确的EHLO域名:绝大多数内部SMTP服务会校验SMTP握手阶段客户端发送的EHLO/HELO域名,MailKit默认使用本地主机名,若该名称不在服务端的允许中继列表中就会被拦截,需要手动指定合法的内部域名,通常和发件人后缀保持一致即可。
- 确认发件人地址有效性:不要使用测试用的虚构发件人地址,替换为该SMTP服务实际允许的发件人地址,多数内部中继服务会校验发件人域名是否为内部授信域名。
- 移除不必要的认证机制:MailKit默认会自动探测支持的认证方式,即使未配置账号密码,也可能触发服务端的认证校验逻辑,可手动移除不需要的认证机制(如OAuth2)避免误判。
修复后的完整脚本如下:
Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.2.15.1\lib\net50\MimeKit.dll" Add-Type -Path "C:\Program Files\PackageManagement\NuGet\Packages\MailKit.2.15.0\lib\net50\MailKit.dll" $SMTP = New-Object MailKit.Net.Smtp.SmtpClient $Message = New-Object MimeKit.MimeMessage $TextPart = [MimeKit.TextPart]::new("plain") $TextPart.Text = "MailKit test message" # 替换为实际可用的内部发件人地址 $Message.From.Add("user1@你公司的真实内部域名.com") $Message.To.Add("user2@domain.com") $Message.Subject = 'Test' $Message.Body = $TextPart $SMTP.Connect('172.xx.xx.x', 25, $False) # 新增:指定EHLO阶段发送的合法内部域名,和发件人后缀一致即可 $SMTP.LocalDomain = "你公司的真实内部域名.com" # 新增:移除不需要的认证机制,避免无密码场景下触发认证校验 $SMTP.AuthenticationMechanisms.Remove("XOAUTH2") $SMTP.Send($Message) $SMTP.Disconnect($true) $SMTP.Dispose()
如果修改后仍然报错,可开启SMTP交互日志定位具体规则:
# 新增日志记录,将完整SMTP交互过程写入本地文件 $logger = New-Object MailKit.Net.ProtocolLogger("C:\smtp_interaction_log.txt") $SMTP = New-Object MailKit.Net.Smtp.SmtpClient($logger)
运行脚本后查看日志文件中的服务端返回的详细拒绝信息即可定位问题。
内容的提问来源于stack exchange,提问作者Bartosz X
相关产品推荐
相关产品推荐

