这是我的代码

电子邮件正文中有一些Unicode字符

  LSMTP := TIdSMTP.Create(nil);
  try
    LMsg := TIdMessage.Create(LSMTP);
    try
      with LMsg do
      begin
        Subject := Subj;
        Recipients.EMailAddresses := Email;
        WriteToLog(cInformation,'To: '+Recipients.EMailAddresses);
        From.Address := ReplaceVariables(From_Address);
        From.Name    := ReplaceVariables(From_Name);
        Body.Text    := EmailMessage;
        ContentTransferEncoding := '8bit';
        CharSet := 'UTF-8';
        ContentType := 'text/plain';
     end;

这就是我得到的
Content-Type: text/plain; charset=us-ascii <<<<< WRONG
Content-Transfer-Encoding: 8bit
Date: Fri, 23 Mar 2012 17:53:19 +0000

使用delphi 2009

最佳答案

那是设计使然。当设置ContentType属性时,如果输入未明确指定字符集,则属性 setter 可能会使用默认值更新CharSet属性。某些内容类型,特别是在text/领域中,具有特定的字符集默认值,这些默认值由各种RFC规定。 Indy会尽力遵守这些规则。这样,您已经设置了CharSet属性后,需要将ContentType属性设置为预期的值,这已经发现:

//LMsg.CharSet := 'UTF-8';
LMsg.ContentType := 'text/plain';
LMsg.CharSet := 'UTF-8';

您也可以这样做:
LMsg.ContentType := 'text/plain; charset=UTF-8';

更新:自2019年7月23日起,ContentType属性 setter 将保留相应的CharSet属性值(如果已设置)并且未在新的ContentType值中指定字符集。因此,成对的ContentType + CharSet属性的设置顺序不再是问题。

关于delphi - 无法使用Delphi Indy发送UTF-8电子邮件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9844250/

10-11 00:29