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

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;

注意事项

  1. 确保Edit1.Text、Edit10.Text中的希腊语文本是ISO-8859-7编码的AnsiString(Delphi 2007默认是AnsiString,只要系统区域设置支持希腊语,输入的文本就是正确编码)。
  2. 邮箱地址(From.Address、Recipients.EMailAddresses)本身不允许包含非ASCII字符,若你的业务需要显示带希腊语的邮箱别名,仍需通过From.Name字段设置并编码,邮箱地址部分必须是符合RFC标准的纯ASCII格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:42:38