SMTPとはメール送信のためのプロトコルです。通信ポートは通常25番です。
基本的なSMTPの仕様は、RFC 821で規格化されています。さらに一部を拡張して、8bitデータの送受信を可能にしたり、メッセージサイズのネゴシエーションを可能にしたりしたものがRFC 1651〜1653で規格化されています。
→RFC 821 →SMTPコマンドまず、クライアントがサーバーに接続します。するとサーバーが挨拶を返します。
220 domain ESMTP
クライアントは、HELO (または EHLO) コマンドを送って応答を待ちます。
HELO test
すると、「250 OK」という250のメッセージが戻ってきます。それ以外の番号ではエラーになります。それを確認したら、次に送信元のアドレスを送信します。
MAIL FROM: <test@nadesi.com>
すると同じように「250 OK」が戻ってきます。次に送り先を送信します。
RCPT TO: <test@nadesi.com>
同じように250を確認したら、メールデータを送信する旨を送ります。
DATA
今度は、354 が戻ってきます。そして、メールのヘッダと本文を送信し、最後に、「.」+改行を送信します。
すると、250が戻ってきます。最後に、「QUIT」を送信して、221が返ってきたらメールの送信が成功です。
では実際にプログラムを書いてみます。前回利用した TCPユニットを使って書いてみました。
var
tcp: TKTcpClient;
begin
tcp := TKTcpClient.Create(nil);
try
tcp.Host := 'localhost';
tcp.Port := 25;
tcp.Open;
Writeln( tcp.recvln ); // 220 SMTP ready
tcp.SendLn('HELO ' + GetComputerName);
Writeln( tcp.recvln ); // 250 OK
tcp.SendLn('MAIL FROM: <test@nadesi.com>');
Writeln( tcp.recvln ); // 250 OK
tcp.SendLn('RCPT TO: <test@nadesi.com>');
Writeln( tcp.recvln ); // 250 OK
tcp.SendLn('DATA');
Writeln( tcp.recvln ); // 354 Enter mail,end with "." on a line by ltself
tcp.SendLn('Subject: test');
tcp.SendLn('');
tcp.SendLn('hello, this is test.');
tcp.SendLn('ok?');
tcp.SendLn('.');
Writeln( tcp.recvln ); // 250 OK
tcp.SendLn('QUIT');
Writeln( tcp.recvln ); // 221 delivering mail
tcp.Close;
finally
tcp.Free;
end;
readln;
end.