Indy组件含带ñ的国际化域名时邮件发送报错问题
含ñ字符的收件人域名导致Indy SMTP发送报错问题
当邮件收件人域名包含ñ这类非ASCII特殊字符时,执行以下代码添加收件人:
IdMessage.Recipients.Add.Text := 'algo@domainwithñ.com';
调用SMTP发送方法时会触发异常:
IdSMTP.Send(IdMessage);
错误提示:
Project EnvioEmail.exe raised exception class EIdSMTPReplyError with message 'Parameter unrecognized'.
问题原因
SMTP协议本身不直接支持包含非ASCII字符的国际化域名(IDN),必须将这类域名转换为Punycode编码格式才能被SMTP服务器识别。
解决方案
利用Indy自带的IdIdn单元将域名部分转换为Punycode,示例代码如下:
uses IdIdn; var EmailParts: TStringList; LocalPart, Domain: string; begin EmailParts := TStringList.Create; try EmailParts.Delimiter := '@'; EmailParts.StrictDelimiter := True; EmailParts.DelimitedText := 'algo@domainwithñ.com'; LocalPart := EmailParts[0]; // 将含特殊字符的域名转换为Punycode Domain := ToPunycode(EmailParts[1]); // 组装转换后的完整邮箱地址 IdMessage.Recipients.Add.Text := LocalPart + '@' + Domain; IdSMTP.Send(IdMessage); finally EmailParts.Free; end; end;
说明
- 转换后的Punycode域名以
xn--开头,例如domainwithñ.com会被转换为xn--domainwith-nza.com,SMTP服务器可正常识别该格式。 - 收件人收到邮件时,邮箱客户端会自动将Punycode转换回原始的可读域名,不影响收件体验。
- 确保使用的Indy版本包含
IdIdn单元,旧版Indy可能需要自行实现IDN转换逻辑。
内容的提问来源于stack exchange,提问作者ruben lopez
相关产品推荐
相关产品推荐

