下载此文件时,.txt文件的编码已从UTF-8更改为ANSI
使用TIdAttachmentFile ,文件的原始字节按TIdAttachmentFile发送。 Indy不会更改附件的编码。
TIdAttachmentFile根据传递给构造函数的文件名的扩展名默认其ContentType属性值。 在这种情况下,扩展名为.txt因此ContentType应该默认为text/plain 。 text/...媒体类型具有与之关联的charset属性,但是您没有在代码中设置附件的Charset属性。 否则,接收者将使用默认charset解释数据(通常是RFC 822中的us-ascii )。 因此,收件人很可能正在检测缺少charset的text/plain媒体类型,并以ASCII / ANSI格式显示文件数据,因为它不知道数据实际上是UTF-8编码的(因为文件是附件) ,如果将附件保存到新文件中,则收件人应按原样保存原始字节)。
如果您知道要附加的文件是使用UTF-8编码的事实,则应该对其进行明确说明:
if FileExists(PathString) then
begin
Attachment := TIdAttachmentFile.Create(IdMessage.MessageParts, PathString);
Attachment.ContentType := 'text/plain';
Attachment.Charset := 'utf-8';
end;
并在彼此相邻而不是彼此下方的行中显示其内容。
这听起来更像是换行问题而不是编码问题。 例如,如果Android上的原始文件使用LF换行符,但是收件人仅支持CRLF换行符。
如果需要,您可以让Indy将换行符标准化为CRLF 。 您只需将文件数据加载到TIdText而不是TIdAttachmentFile ,然后确保将TIdText.ContentDisposition属性设置为attachment (否则它将默认设置为inline ),并设置TIdText.FileName ,因此仍会处理数据作为收件人的附件:
if FileExists(PathString) then
begin
Attachment := TIdText.Create(IdMessage.MessageParts, nil);
Attachment.Body.LoadFromFile(PathString, TEncoding.UTF8);
Attachment.ContentType := 'text/plain';
Attachment.Charset := 'utf-8';
Attachment.ContentDisposition := 'attachment';
Attachment.FileName := ExtractFileName(PathString);
end;
现在,尽管如此,您在使用Indy组件时通常还会遇到一些其他小的编码问题。 我建议改成这样:
try
IdSMTP := TIdSMTP.Create(nil);
try
SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdSMTP);
IdSMTP.IOHandler := SSLHandler;
IdSMTP.UseTLS := utUseExplicitTLS;
IdSMTP.Host := 'smtp.gmail.com';
IdSMTP.Port := 587;
IdSMTP.AuthType := satDefault;
IdSMTP.Username := AppData.MailAddrSender;
IdSMTP.Password := Appdata.MailPassword;
IdMessage := TIdMessage.Create(nil);
try
IdMessage.From.Name := aName;
IdMessage.From.Address := AppData.MailAddrSender;
IdMessage.Subject := 'E-mail subject';
IdEmailAddressItem := IdMessage.Recipients.Add;
IdEmailAddressItem.Address := AppData.MailAddrReceiver;
IdMessage.Body.Add('Mail todays log,');
PathString := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, PathString + 'Log.txt');
if FileExists(PathString) then
begin
// or TIdText...
Attachment := TIdAttachmentFile.Create(IdMessage.MessageParts, PathString);
Attachment.ContentType := 'text/plain';
Attachment.Charset := 'utf-8';
end;
IdSMTP.Connect;
try
IdSMTP.Send(IdMessage);
finally
IdSMTP.Disconnect;
end;
finally
IdMessage.Free;
end;
finally
IdSMTP.Free;
end;
except
on E: Exception do
//exception handling here
end;