前回の非同期通信では、ウィンドウメッセージを使ってデータの受け渡しを行いました。しかしこの方法では、メールの受信処理をするプログラムなどを作る場合、サーバーとのデータのやり取りが複雑になりがちです。
そこで、スレッドを使うことで、サーバーとの通信処理を単純に記述できるようにします。
例えば、メールの受信を例に取ると、メールの受信は以下のように行われます。
サーバーからクライアントは、→
クライアントからサーバーは、←
(接続)
→+OK POP3 xxx
(ユーザとパスワードを入力)
←USER test
→+OK Password required for test
←PASS abc123456
→+OK test has 2 message
(メールの一覧を取得)
←LIST
→+OK 2 1116
1 558
2 1524
.
(1番目のメールを取得)
←RETR 1
→+OK 1 558
From test@xxx.xx.jp
Subject test
test
.
これを、前回作ったようなTCPユニットを使って書くと以下のようになります。
var
tcp: TKTcpClient;
s: string;
begin
tcp := TKTcpClient.Create(nil);
try
tcp.Host := 'localhost'; // テスト用メールサーバーへの接続
tcp.Port := 110;
tcp.Open;
Writeln( tcp.recvln ); //受信結果> +OK POP3 xxx
tcp.sendln('USER test');
Writeln( tcp.recvln ); //受信結果> +OK Password required for test
tcp.sendln('PASS test');
Writeln( tcp.recvln ); //受信結果> +OK test has 2 message
tcp.sendln('LIST');
Writeln( tcp.RecvLn ); //受信結果> +OK 2 1116
Writeln( tcp.RecvLnToDot );// ...リスト...
tcp.sendln('RETR 1');
Writeln( tcp.RecvLn ) //受信結果> +OK 1 xxx
Writeln( tcp.RecvLnToDot );// ...メール本文...
tcp.Close;
finally
tcp.Free;
end;
readln;
end.
これをスレッドの中に組み込めば、意外とあっさりしたプログラムでメール受信などができるようになると思います。