Indy发送电子邮件时,收件人含有UTF-8字符

4
我正在尝试使用Indy 10中的TIdSMTP组件发送电子邮件,我的收件人列表中包含Unicode字符(例如Роман Безяк <roman_bezjak@yahoo.com>)。但是当邮件发送后,在电子邮件的To头中我看到这个:"?????????" <roman_bezjak@yahoo.com>。有人能帮我解决这个编码问题吗?
这是我的过程的样子:
procedure TMailClientForm.btnSendEmailClick(Sender: TObject);
var
  mes : TIdMessage;
  i : Integer;
begin
  with SMTPClient do begin
    Host := serverHost;
    Port := SmtpServerPort;
    Username := myUserName;
    Password := myPassword;
    UseTLS := utUseImplicitTLS;
  end;
  try 
    mes := tidmessage.Create(nil);
    try
      with mes do begin
        ContentType := 'text/plain';
        ClearBody;
        Body.Text := memoEmailBody.Text;
        Subject := txtEmailSubject.text;
        From.Address := SMTPClient.Username; 
        From.Name := myName; // cyrillic symbols!
        Recipients.Add.Address := myReceiver; // cyrillic symbols! like 'Роман Безяк <roman_bezjak@yahoo.com>'
        CharSet := 'utf-8';
      end;
      if fileNames.Count > 0 then // attachments - the files are in the stringlist fileNames
        mes.ContentType := 'multipart/mixed';
      for i := 0 to fileNames.count - 1 do begin
        if FileExists(fileNames[i]) then
          TIdAttachmentFile.Create(mes.MessageParts, fileNames[i]);
      end;
      try
        try
          try
            SMTPClient.Connect;
          except
            on e : Exception do begin
              MessageDlg('ERROR=' + SMTPClient.LastCmdResult.Text.Text, mtError,   [mbOK], 0);
              Exit;
            end;
          end;
          try
            SMTPClient.Send(mes);            
          except
            on e : Exception do begin
              MessageDlg('ERROR=' + SMTPClient.LastCmdResult.Text.Text, mtError, [mbOK], 0);
              Exit;
            end;
          end;
        finally
          if SMTPClient.Connected then
            SMTPClient.Disconnect;
        end;
        fileNames.clear;
      except
        on e:exception do begin
          MessageDlg(e.message, mtError, [mbOK], 0);
        end;
      end;
    finally
      mes.Free;
    end;
  except
    on e:exception do begin
      MessageDlg(e.message, mtError, [mbOK], 0);
    end;
  end;
end;

Delphi的哪个版本? - J...
版本是“XE7”。 - Viktor Anastasov
1个回答

4
Recipients.Add.Address := myReceiver; // cyrillic symbols! like 'Роман Безяк <roman_bezjak@yahoo.com>'
如果myReceiver同时包含姓名和电子邮件地址,则需要使用TIdEMailAddressItem.Text属性而不是TIdEMailAddressItem.Address属性:
Recipients.Add.Text := myReceiver; // cyrillic symbols! like 'Роман Безяк <roman_bezjak@yahoo.com>'
// Name becomes 'Роман Безяк'
// Address becomes 'roman_bezjak@yahoo.com'...
TIdEmailAddressItem.Text属性设置方法会解析输入的字符串,并相应地将其分割为TIdEmailAddressItem.NameTIdEmailAddressItem.Address属性。 TIdEmailAddressItem.Address属性根本没有设置方法,因此无论您分配什么都会按原样使用。
在编码电子邮件时,如果存在任何非ASCII字符,则TIdEmailAddressItem.Name值将根据RFC 2047进行MIME编码。由于假定电子邮件地址只包含ASCII字符(虽然Unicode电子邮件地址确实存在但尚未普及),因此TIdEmailAddressItem.Address值不会得到MIME编码。电子邮件标题必须是ASCII格式,因此您看到Роман Безяк变成了?????????,因为您把它放在了TIdEmailAddressItem.Address属性中,并且它被按原样转换为ASCII(其中非ASCII字符变成了?)而没有被MIME编码。
因此,通过将NameAddress分开,您应该可以正确处理Роман Безяк

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接