(*@\\\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; 
|