Delphi2005 & indy9 でのメール送信
特定の条件メールを送信するシステムを作成しています。
いままで特に問題なくメール送信できていたのですが、
納入先の数か所のうち、1箇所だけメール送信時にフリーズする現象に悩まされています。
普段システムの画面にはIdSMTPStatusイベントで取得できる文字列をステータスバーに下記の通り表示をしているのですが、
procedure TForm_Main.IdSMTPStatus(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: string);
begin
StatusBar.Panels[1].text := 'SMTP:'+AStatusText;
StatusBar.Update;
end;
フリーズするときは
Resolving hostname ***.co.jp
Connenting to ***.***.***.***
Connected.
Encoding Text ←で止まっています。
納入先とはLAN環境、メールアカウントも違うせいか再現はせず困っています。
本文のサイズは80kbくらいになることもありますが、他の納入先でもさほどかわりません。
添付ファイルは使用していません。
本文に特定の文字があると止まる等のことがあるのでしょうか?
indy9をindy10に替えたら如何でしょう。
もし、本当にIndy9のSend関数を実行中にフリーズしているのなら、
IdMessageClient.pasを自分のプロジェクトのフォルダにコピーして、
以下のように自前のStatusメッセージを出すように追加して実行すれば、
メール本文のどの行をEncode中に止まってるのかをチェックできるよ。
納入先での実行時のStatusをモニタするならStatusメッセージをファイルに
書き出す方が良いけど。
procedure TIdMessageClient.SendBody(AMsg: TIdMEssage);
var
...................
begin
...................
else begin
DoStatus(hsStatusText, [RSMsgClientEncodingText]);
// Write out Body
//TODO: Why just iso2022jp? Why not someting generic for all MBCS? Or is iso2022jp special?
if TransferEncoding = iso2022jp then
begin
for i := 0 to AMsg.Body.Count - 1 do
begin
if Copy(AMsg.Body[i], 1, 1) = '.' then
begin
DoStatus(hsStatusText, [Format('Encoding %d line:%s',[i, AMsg.Body[i]])]); // これを追加
WriteLn('.' + Encode2022JP(AMsg.Body[i]));
end
else begin
DoStatus(hsStatusText, [Format('Encoding %d line:%s',[i, AMsg.Body[i]])]); // これを追加
WriteLn(Encode2022JP(AMsg.Body[i]));
end;
end;
end
else begin
WriteBodyText(AMsg);
end;
end;
DoStatus(hsStatusText, ['SendBody Complete']); // これを追加
finally
EndWork(wmWrite);
end;
end;
ツイート | ![]() |