現象:
在使用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: