这是我的代码
电子邮件正文有一些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
答案 0 :(得分:14)
这是设计上的。当设置ContentType
属性时,如果输入未明确指定字符集,则属性设置器可以使用默认值更新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';
答案 1 :(得分:3)
搞定了。事件顺序非常重要。
这个有效:
LMsg.ContentType:='text/plain';
LMsg.CharSet:='UTF-8';
这个没有:
LMsg.CharSet:='UTF-8';
LMsg.ContentType:='text/plain';
答案 2 :(得分:2)
在我的情况下,如果我添加附件,我必须只指定字符集:
pMsg->CharSet = "UTF-8";
邮件阅读器显示邮件的源代码。