现象:
在使用TIdSMTP, TIdPOP3收发电子邮件时,第一步要验证,验证的时候出现错误,但错误信息是乱码,都是一些小方框,不知道是什么出错信息。
原因:
出错信息是中文的,采用的中文编码,但TIdSMTP, TIdPOP3是按英文来解析这些信息的,所以读出来的是乱码。
解决方法:
需要修改Indy的源码,下面三个文件需要修改,找到这三个文件后,将这三个文件跟当前工程源文件放在一起,然后添加到工程中就可以了,避免下次重新安装Delphi后被修改的文件内容丢失了。
1、IdSMTP.pas 大概355行的位置,将两个SendCmd函数后面增加参数 IndyTextEncoding_OSDefault
LEncoder := TIdEncoderMIME.Create(nil);
try
SendCmd('AUTH LOGIN', 334);
if SendCmd(LEncoder.Encode(Username), [235, 334], IndyTextEncoding_OSDefault) = 334 then begin //添加了参数 IndyTextEncoding_OSDefault
SendCmd(LEncoder.Encode(Password), 235, IndyTextEncoding_OSDefault); //添加了参数 IndyTextEncoding_OSDefault
end;
finally
LEncoder.Free;
end;
2、IdSMTPBase.pas 大概282行位置,将SendCmd函数后面增加参数 IndyTextEncoding_OSDefault
SendCmd(LCmd, MAILFROM_ACCEPT, IndyTextEncoding_OSDefault); //添加了参数 IndyTextEncoding_OSDefault
try
WriteRecipientsNoPipelining(ARecipients);
SendCmd(DATA_CMD, DATA_ACCEPT);
SendMsg(AMsg);
SendCmd('.', DATA_PERIOD_ACCEPT); {Do not Localize}
except
3、IdPOP3.pas 大概331,332行的位置,将两个SendCmd函数后面增加参数 IndyTextEncoding_OSDefault
patUserPass:
begin //classic method
SendCmd('USER ' + Username, ST_OK, IndyTextEncoding_OSDefault); //添加了参数 IndyTextEncoding_OSDefault
SendCmd('PASS ' + Password, ST_OK, IndyTextEncoding_OSDefault); //添加了参数 IndyTextEncoding_OSDefault
end;//if APOP
patSASL: