Delphi2007/Indy10 SMTP客户端:发件人名称与主题希腊文乱码
问题原因分析
邮件正文能正常显示是因为你在TIdText组件中设置了Charset := 'GREEK_CHARSET',Indy会自动将正文内容按指定字符集编码为符合MIME标准的字节流,收件端能正确解析。
但发件人名称(From.Name)、邮件主题(Subject)属于RFC 822邮件头字段,这类字段不允许直接包含非ASCII字符(比如希腊语),必须按照RFC 2047标准进行编码——将非ASCII文本转换为Base64或QP(quoted-printable)格式,并附加字符集标识。你的代码直接给这些字段赋值希腊语文本,没有做编码处理,导致收件端无法正确解析,显示为乱码。
修复方案
使用Indy提供的EncodeHeader函数对希腊语的发件人名称和主题进行编码,指定字符集为ISO-8859-7(GREEK_CHARSET对应的标准字符集名称)。
修改后的代码如下:
with IdMsg do begin clear; contentType := 'multipart/mixed'; Charset := 'ISO-8859-7'; // 统一用标准字符集名称,避免歧义 with TidText.Create(MessageParts) do begin ContentType := 'text/plain'; Charset := 'ISO-8859-7'; Body.Text := Memo1.Text; end; // 编码发件人名称 if Edit1.Text = '' then From.name := EncodeHeader('你的默认希腊语发件人名称', 'ISO-8859-7') else From.name := EncodeHeader(Edit1.Text, 'ISO-8859-7'); if Edit2.Text = '' then From.Address := 'myEmail@asdf.gr' else From.Address := Edit2.Text; // 邮箱地址本身不能包含非ASCII字符,若有需确认合法性 Recipients.EMailAddresses := '收件人邮箱地址'; // 编码邮件主题 if edit10.Text = '' then subject := EncodeHeader('你的默认希腊语主题', 'ISO-8859-7') else Subject := EncodeHeader(edit10.Text, 'ISO-8859-7'); IdSMTP1.Connect; IdSMTP1.Send(IdMsg); end;
注意事项
- 确保
Edit1.Text、Edit10.Text中的希腊语文本是ISO-8859-7编码的AnsiString(Delphi 2007默认是AnsiString,只要系统区域设置支持希腊语,输入的文本就是正确编码)。 - 邮箱地址(From.Address、Recipients.EMailAddresses)本身不允许包含非ASCII字符,若你的业务需要显示带希腊语的邮箱别名,仍需通过
From.Name字段设置并编码,邮箱地址部分必须是符合RFC标准的纯ASCII格式。
内容的提问来源于stack exchange,提问作者user3140961
相关产品推荐
相关产品推荐

