这是我的代码
电子邮件正文中有一些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/