TCP/IP(七)

原创 2001年07月30日 16:45:00

(*@///0000000501*)

(*@/// procedure t_smtp.action; *)
procedure t_smtp.action;
var
  i,j: integer;
  s: string;
begin
  if (f_receipts=NIL) or (f_receipts.count=0)
    or (f_body=NIL) or (f_body.count=0) or (f_user='') then  EXIT;
    (* not all necessary data filled in *)
  login;
  f_host:=my_hostname;
(*@///   Open Connection and submit header data *)
self.response;   (* Read the welcome message *)

self.SendCommand('HELO '+f_host);   (* open connection *)
self.response;
if f_status_nr>=300 then
  raise EProtocolError.Create('SMTP',f_status_txt,f_status_nr);

self.SendCommand('MAIL FROM: <'+address_from(f_user,1)+'>');   (* send header data *)
self.response;
if f_status_nr>=300 then
  raise EProtocolError.Create('SMTP',f_status_txt,f_status_nr);


for i:=0 to f_receipts.count-1 do begin
  j:=0;
  while true do begin
    inc(j);
    s:=address_from(f_receipts.strings[i],j);
    if s<>'' then begin
      self.SendCommand('RCPT TO: <'+s+'>');   (* submit the receipts *)
      self.response;
      (* Log error users for later check ? *)
      end
    else BREAK;
    end;
  end;

self.SendCommand('DATA');   (* ready to send the mail *)
self.response;
if f_status_nr=354 then begin
  for i:=0 to f_body.count-1 do begin
    if f_body.strings[i]='.' then f_body.strings[i]:=',';
    self.write_s(f_socket,f_body.strings[i]+#13#10);
    end;
  self.write_s(f_socket,'.'+#13#10);
  self.response;
  end;
if f_status_nr>=300 then
  raise EProtocolError.Create('SMTP',f_status_txt,f_status_nr);
(*@///*)
  end;
(*@///0000000A17*)
(*@/// procedure t_smtp.response; *)
procedure t_smtp.response;
var
  s: string;
begin
  s:=self.read_line(f_socket);
  if assigned(f_tracer) then
    f_tracer(s,tt_proto_get);
  f_status_nr:=strtoint(copy(s,1,3));
  f_status_txt:=copy(s,5,length(s));
  (* if the answer consists of several lines read and discard all the following *)
  while pos('-',s)=4 do begin
    s:=self.read_line(f_socket);
    if assigned(f_tracer) then
      f_tracer(s,tt_proto_get);
    end;
  end;
(*@///0000000801*)

(*@/// procedure t_smtp.SetBody(Value: TStringList); *)
procedure t_smtp.SetBody(Value: TStringList);
begin
  if value=NIL then
    f_body.clear
  else
    f_body.assign(value);
  end;
(*@///0000000603*)
(*@/// procedure t_smtp.SetRecipients(Value: TStringList); *)
procedure t_smtp.SetRecipients(Value: TStringList);
begin
  if value=NIL then
    f_receipts.clear
  else
    f_receipts.assign(value);
  end;
(*@///0000000603*)
(*@///0000000401*)
(*@/// class t_pop3(t_tcpip) *)
type
(*@///   t_reply=class(TObject) *)
t_reply=class(TObject)
public
  index: integer;
  length: integer;
  from: string;
  subject: string;
  end;
(*@///0000000601*)

(*@/// constructor t_pop3.Create(Aowner:TComponent); *)
constructor t_pop3.Create(Aowner:TComponent);
begin
  inherited create(Aowner);
  f_list:=NIL;
  f_mail:=TStringlist.Create;
  f_list:=TList.Create;
  f_socket_number:=110;
  end;
(*@///0000000501*)
(*@/// destructor t_pop3.Destroy; *)
destructor t_pop3.Destroy;
begin
  f_mail.free;
  try
    if f_list<>NIL then
      while f_list.count>0 do begin
        TObject(f_list.items[0]).Free;
        f_list.delete(0);
        end;
  except
    end;
  f_list.free;
  inherited destroy;
  end;
(*@///0000000C01*)

(*@/// procedure t_pop3.action; *)
procedure t_pop3.action;
begin
  login;
  if f_list.count<>0 then
    getmail(1);
  logout;
  end;
(*@///0000000501*)
(*@/// procedure t_pop3.response; *)
procedure t_pop3.response;
var
  s: string;
begin
  s:=self.read_line(f_socket);
  if assigned(f_tracer) then
    f_tracer(s,tt_proto_get);
  if copy(s,1,3)='+OK' then
    { everything OK }
  else if copy(s,1,4)='-ERR' then
    raise EProtocolError.Create('POP3',s,500)
  else
    raise EProtocolError.Create('POP3',s,999);
  end;
(*@///0000000701*)

(*@/// procedure t_pop3.Login;                         // USER, PASS, LIST *)
procedure t_pop3.Login;
var
  s: string;
  h: t_reply;
begin
  inherited login;
  self.response;
  self.SendCommand('USER '+f_user);   (* open connection *)
  self.response;
  self.write_s(f_socket,'PASS '+f_pass+#13#10);
  if assigned(f_tracer) then
    f_tracer('PASS *****',tt_proto_sent);
  self.response;
  self.SendCommand('LIST');   (* open connection *)
  self.response;
  while true do begin
    s:=self.read_line(f_socket);
    if s='.' then BREAK;
    h:=t_reply.Create;
    h.index:=strtoint(copy(s,1,pos(' ',s)-1));
    h.length:=strtoint(copy(s,pos(' ',s)+1,length(s)));
    h.from:='';
    h.subject:='';
    f_list.add(h);
    end;
  end;
(*@///*)
(*@/// procedure t_pop3.GetHeaders;                    // TOP *)
procedure t_pop3.GetHeaders;
var
  i: integer;
  h: t_reply;
  s: string;
begin
  f_mail.clear;
  for i:=f_list.count-1 downto 0 do begin
    h:=t_reply(f_list.items[i]);
    self.SendCommand('TOP '+inttostr(h.index)+' 1');
    try
      self.response;   (* this may give a EProtocolError on older POP server *)
      while true do begin
        s:=self.read_line(f_socket);
        if s='.' then BREAK;
        if pos('From:',s)=1 then
          h.from:=copy(s,7,length(s));
        if pos('Subject:',s)=1 then
          h.subject:=copy(s,10,length(s));
        end;
      if h.subject<>'' then
        f_mail.insert(0,h.from+#7+h.subject)
      else
        f_mail.insert(0,h.from)
    except
      on EProtocolError do
        f_mail.insert(0,inttostr(h.index));
      (* ignore errors due to unimplemented TOP *)
      end;
    end;
  end;
(*@///*)
(*@/// procedure t_pop3.Logout;                        // QUIT *)
procedure t_pop3.Logout;
begin
  if f_logged_in then begin
    self.SendCommand('QUIT');
    self.response;
    end;
  inherited logout;
  if f_list<>NIL then
    while f_list.count>0 do begin
      TObject(f_list.items[0]).Free;
      f_list.delete(0);
      end;
  end;
(*@///0000000401*)
(*@/// procedure t_pop3.GetMail(index: integer);       // RETR *)
procedure t_pop3.GetMail(index: integer);
var
  s: string;
begin
  if not f_logged_in then login;
  self.SendCommand('RETR '+inttostr(index));
  self.response;
  f_mail.clear;
  while true do begin
    s:=self.read_line(f_socket);
    if s='.' then BREAK;
    f_mail.add(s);
    end;
  end;
(*@///0000000601*)
(*@/// procedure t_pop3.DeleteMail(index:integer);     // DELE *)
procedure t_pop3.DeleteMail(index:integer);
begin
  if not f_logged_in then login;
  self.SendCommand('DELE '+inttostr(index));
  self.response;
  end;
(*@///0000000401*)
(*@///0000000801*)
(*@/// class t_nntp(t_tcpip) *)
(*@/// function nntpdate(date:TDateTime):string; *)
function nntpdate(date:TDateTime):string;
begin
  result:=formatdatetime('yymmdd hhnnss',date);
  end;
(*@///0000000330*)

(*@/// constructor t_nntp.Create(Aowner:TComponent); *)
constructor t_nntp.Create(Aowner:TComponent);
begin
  inherited create(Aowner);
  f_news:=TStringlist.Create;
  f_newsgroups:=TStringlist.Create;
  f_socket_number:=119;
  end;
(*@///0000000401*)
(*@/// destructor t_nntp.Destroy; *)
destructor t_nntp.Destroy;
begin
  f_news.free;
  f_newsgroups.free;
  inherited destroy;
  end;
(*@///0000000501*)
(*@/// procedure t_nntp.SetNews(value:TStringlist); *)
procedure t_nntp.SetNews(value:TStringlist);
begin
  if value=NIL then
    f_news.clear
  else
    f_news.assign(value);
  end;
(*@///0000000603*)

(*@/// procedure t_nntp.action; *)
procedure t_nntp.action;
begin
  login;
  (* ??? *)
  logout;
  end;
(*@///0000000401*)

(*@/// procedure t_nntp.Login; *)
procedure t_nntp.Login;
begin
  inherited login;
  self.response;
  self.SendCommand('MODE READER');   (* some NNTP servers need this *)
  try
    self.response;
  except
    (* ignore if the server doesn't understand this *)
    end;
  end;
(*@///0000000508*)
(*@/// procedure t_nntp.Logout;                                          // QUIT *)
procedure t_nntp.Logout;
begin
  if f_logged_in then begin
    self.SendCommand('QUIT');
    self.response;
    end;
  inherited logout;
  end;
(*@///0000000306*)

(*@/// procedure t_nntp.GetArticleID(msgid:string);                      // ARTICLE *)
procedure t_nntp.GetArticleID(const msgid:string);
begin
  if not f_logged_in then login;
  if msgid[1]<>'<' then
    self.SendCommand('ARTICLE <'+msgid+'>')
  else
    self.SendCommand('ARTICLE '+msgid);
  self.response;
  f_news.clear;
  GetArticleInternally;
  end;
(*@///0000000301*)
(*@/// procedure t_nntp.PostArticle;                                     // POST *)
procedure t_nntp.PostArticle;
var
  i:integer;
begin
  if not f_logged_in then login;
  self.SendCommand('POST');
  self.response;
  for i:=0 to f_news.count-1 do begin
    if f_news.strings[i]='.' then
      write_s(f_socket,'..'+#13#10)
    else
      write_s(f_socket,f_news.strings[i]+#13#10);
    end;
  write_s(f_socket,'.'+#13#10);
  self.response;
  end;
(*@///0000000601*)
(*@/// procedure t_nntp.GetAllNewsgroups;                                // LIST *)
procedure t_nntp.GetAllNewsgroups;
var
  s: string;
begin
  if not f_logged_in then login;
  f_newsgroups.clear;
  self.SendCommand('LIST');
  self.response;
  while true do begin
    s:=read_line(f_socket);
    if s<>'.' then
      f_newsgroups.add(copy(s,1,pos(' ',s)-1))
    else
      BREAK;
    end;
  end;
(*@///0000000601*)
(*@/// procedure t_nntp.GetNewNewsgroups(since:TDateTime);               // NEWGROUPS *)
procedure t_nntp.GetNewNewsgroups(since:TDateTime);
var
  s: string;
begin
  if not f_logged_in then login;
  f_newsgroups.clear;
  self.SendCommand('NEWGROUPS '+nntpdate(since));
  self.response;
  while true do begin
    s:=read_line(f_socket);
    if s<>'.' then
      f_newsgroups.add(copy(s,1,pos(' ',s)-1))
    else
      BREAK;
    end;
  end;
(*@///0000000601*)
(*@/// procedure t_nntp.SetGroup(group:string; low,high,count: integer); // GROUP *)
procedure t_nntp.SetGroup(const group:string; var low,high,count: integer);
var
  s1,s2,s3: integer;
begin
  if not f_logged_in then login;
  self.SendCommand('GROUP '+group);
  self.response;
  s1:=pos(' ',f_status_txt);
  s2:=posn(' ',f_status_txt,2);
  s3:=posn(' ',f_status_txt,3);
  count:=strtoint(copy(f_status_txt,1,s1-1));
  low:=strtoint(copy(f_status_txt,s1+1,s2-s1-1));
  high:=strtoint(copy(f_status_txt,s2+1,s3-s2-1));
  end;

tcp/ip(七)

下载第7章Ping程序7.1 引言“p i n g”这个名字源于声纳定位操作。P i n g程序由Mike Muuss编写,目的是为了测试另一台主机是否可达。该程序发送一份I C M P回显请求报文给...
  • ttaitt
  • ttaitt
  • 2010年04月14日 20:55
  • 131

TCP/IP(七)

一、SNMP:简单网络管理协议   基于TCP/IP的网络管理包括两部分:网络管理站(manager)和被管理的网络单元(被管设备)。这些被管设备的共同点就是都运行TCP/IP协议。管理进程和代...
  • jiangyiaxiu
  • jiangyiaxiu
  • 2011年09月27日 16:39
  • 284

TCP/IP学习笔记(七)

TCP/IP学习笔记(七)一、SNMP:简单网络管理协议  基于TCP/IP的网络管理包括两部分:网络管理站(manager)和被管理的网络单元(被管设备)。这些被管设备的共同点就是都运行TCP/IP...
  • Micro_lee
  • Micro_lee
  • 2006年10月16日 16:31
  • 890

TCP和TCP/IP的区别

TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议, 又叫网络通讯协议,这个协议是Internet国际互联网络的...
  • oro99
  • oro99
  • 2016年04月20日 09:38
  • 1959

TCP协议中的三次握手和四次挥手(图解)&&TCP/IP 七层网络模型

建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示: 先来看看如何建立连接的。 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为...
  • u012211419
  • u012211419
  • 2015年08月04日 20:45
  • 1001

tcp/ip协议详解及重点知识整理

一、TCP/IP参考模型   ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。如图2-1所示,是TCP/IP参考模型和...
  • Doraemon___
  • Doraemon___
  • 2016年09月30日 14:43
  • 3236

TCP/IP 原理详解

协议实际上就是一种解决某些问题的策略和模式,在经典的TCP/IP协议中就有很多策略和模式值得学习。归纳起来有以下一些(随着学习深入逐步添加): 分层封装和分用可靠连接 分层 分层是TCP/IP乃至网...
  • Vincent_ceso
  • Vincent_ceso
  • 2016年10月02日 10:44
  • 1776

TCP/IP常见面试题

1.OSI与TCP/IP各层的结构和功能,协议和作用。      OSI七层模型对应TCP/IP四层模型,只是分法不同而已。      应用层:提供应用层服务,文件传输(FTP),电子邮件(SMTP)...
  • hyp1977
  • hyp1977
  • 2016年08月08日 11:13
  • 1612

TCP/IP详解(一)---入门知识

什么是TCP/IP? 我们常说的TCP/IP协议并不是单指TCP协议和IP协议,而是指一组协议簇,其中包含了但不仅限于:TCP协议、IP协议、ICMP协议、POP协议、SMTP协议、FTP协议等。关于...
  • wh1511995112
  • wh1511995112
  • 2016年05月10日 11:09
  • 2045

面试笔试--TCP/IP知识点

下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: 7 应用层 例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、W...
  • hyqwmxsh
  • hyqwmxsh
  • 2016年09月05日 10:02
  • 6767
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCP/IP(七)
举报原因:
原因补充:

(最多只允许输入30个字)