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

Postfix服务器下如何在SMTP RCPT TO命令中使用扩展ASCII字符?

解决Postfix下PowerShell/.NET发送含非ASCII收件人地址的报错问题

问题根源

错误核心是旧的PowerShell/.NET SMTP客户端不支持SMTPUTF8协议扩展,导致包含英镑符号£的收件人地址无法被正确编码为UTF-8格式,触发Postfix的语法校验错误。而Outlook客户端原生支持SMTPUTF8,能正确处理这类地址,所以可以发送成功。

解决方案

1. 替换过时的System.Web.Mail.SmtpMail类

System.Web.Mail.SmtpMail是.NET Framework的老旧废弃类,完全不支持SMTPUTF8。改用System.Net.Mail命名空间下的类,它支持显式启用SMTPUTF8:

# 构建邮件对象
$mailMessage = New-Object System.Net.Mail.MailMessage
$mailMessage.From = "sender@yourdomain.com"
$mailMessage.To.Add("livelink+264096812$£&@mytenant.onmicrosoft.com")
$mailMessage.Subject = "Test Email"
$mailMessage.Body = "Test content"

# 配置SMTP客户端并启用SMTPUTF8
$smtpClient = New-Object System.Net.Mail.SmtpClient("your-postfix-server", 587)
$smtpClient.EnableSsl = $true # 根据你的Postfix配置调整
$smtpClient.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$smtpClient.DeliveryMethod = [System.Net.Mail.SmtpDeliveryMethod]::Network
$smtpClient.UseDefaultCredentials = $false
$smtpClient.SmtpClientOptions = [System.Net.Mail.SmtpClientOptions]::EnableSmtpUtf8 # 关键:启用SMTPUTF8

# 发送邮件
try {
    $smtpClient.Send($mailMessage)
    Write-Host "邮件发送成功"
} catch {
    Write-Host "发送失败: $_"
}

# 清理资源
$mailMessage.Dispose()
$smtpClient.Dispose()

2. 使用现代邮件库MailKit(推荐)

System.Net.Mail.SmtpClient已被标记为过时,更推荐使用跨平台、原生支持SMTPUTF8的MailKit库,兼容性更好:

步骤1:安装MailKit模块

Install-Module -Name MailKit -Scope CurrentUser -Force

步骤2:发送邮件示例

using namespace MailKit.Net.Smtp
using namespace MimeKit

# 构建邮件
$message = New-Object MimeMessage
$message.From.Add([MailboxAddress]::Parse("sender@yourdomain.com"))
$message.To.Add([MailboxAddress]::Parse("livelink+264096812$£&@mytenant.onmicrosoft.com"))
$message.Subject = "Test Email with UTF-8 Recipient"
$message.Body = New-Object TextPart("plain") { Text = "Test content" }

# 配置SMTP客户端并发送
$client = New-Object SmtpClient
try {
    $client.Connect("your-postfix-server", 587, [SecureSocketOptions]::StartTls)
    $client.Authenticate("username", "password")
    $client.Send($message)
    Write-Host "邮件发送成功"
} catch {
    Write-Host "发送失败: $_"
} finally {
    $client.Disconnect($true)
    $client.Dispose()
}

3. 再次确认Postfix的SMTPUTF8配置

虽然你提到已配置,但可以再检查main.cf中的以下参数,确保生效:

smtputf8_enable = yes # 必须设置为yes
smtpd_smtputf8_restrictions = permit_sasl_authenticated, permit_mynetworks

修改后重启Postfix:systemctl restart postfix

关键说明

  • SMTPUTF8是专门用于支持非ASCII邮件地址的SMTP扩展,必须客户端和服务器同时支持才能生效。
  • 旧工具(如Send-MailMessage、System.Web.Mail.SmtpMail)不支持SMTPUTF8,所以无法处理含非ASCII的收件人地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:18:27