Potete dare un'occhiata al nostro SynCrtSock
Open Source unit.
Implementa molte funzionalità (incluso un server HTTP/1.1 basato su HTTP.sys), ma ha anche alcuni file di testo virtuali da scrivere in un socket. È usato per es. implementare un client o server HTTP o SMTP (per inviare un messaggio di posta elettronica).
Sarà un buon esempio di come creare un "virtuale" TTextRec
, compresa la lettura del contenuto di scrittura & e anche la gestione degli errori. Anche la dimensione del buffer interno viene migliorata rispetto al suo valore predefinito: qui hai 1KB di cache per impostazione predefinita, invece di 128 byte.
Ad esempio, ecco come può essere utilizzato per inviare una richiesta tramite SMTP (codice sorgente estratta dall'unità):
function SendEmail(const Server: AnsiString; const From, CSVDest, Subject, Text: TSockData;
const Headers: TSockData=''; const User: TSockData=''; const Pass: TSockData='';
const Port: AnsiString='25'): boolean;
var TCP: TCrtSocket;
procedure Expect(const Answer: TSockData);
var Res: TSockData;
begin
repeat
readln(TCP.SockIn^,Res);
until (Length(Res)<4)or(Res[4]<>'-');
if not IdemPChar(pointer(Res),pointer(Answer)) then
raise Exception.Create(string(Res));
end;
procedure Exec(const Command, Answer: TSockData);
begin
writeln(TCP.SockOut^,Command);
Expect(Answer)
end;
var P: PAnsiChar;
rec, ToList: TSockData;
begin
result := false;
P := pointer(CSVDest);
if P=nil then exit;
TCP := Open(Server, Port);
if TCP<>nil then
try
TCP.CreateSockIn; // we use SockIn and SockOut here
TCP.CreateSockOut;
Expect('220');
if (User<>'') and (Pass<>'') then begin
Exec('EHLO '+Server,'25');
Exec('AUTH LOGIN','334');
Exec(Base64Encode(User),'334');
Exec(Base64Encode(Pass),'235');
end else
Exec('HELO '+Server,'25');
writeln(TCP.SockOut^,'MAIL FROM:<',From,'>'); Expect('250');
ToList := 'To: ';
repeat
rec := trim(GetNextItem(P));
if rec='' then continue;
if pos(TSockData('<'),rec)=0 then
rec := '<'+rec+'>';
Exec('RCPT TO:'+rec,'25');
ToList := ToList+rec+', ';
until P=nil;
Exec('DATA','354');
writeln(TCP.SockOut^,'Subject: ',Subject,#13#10,
ToList,#13#10'Content-Type: text/plain; charset=ISO-8859-1'#13#10+
'Content-Transfer-Encoding: 8bit'#13#10,
Headers,#13#10#13#10,Text);
Exec('.','25');
writeln(TCP.SockOut^,'QUIT');
result := true;
finally
TCP.Free;
end;
end;
Si produrrà solo Ansi contenuti, per definizione.
Si rivolge a Delphi da 5 a XE2, quindi includerà Delphi 2009 o XE.
+1 bella cattura. Immagino che l'unità FPC StreamIO sia per lo più la stessa ... Ma non sono sicuro che gestirà il testo Unicode. Probabilmente sarai stucked con il tipo di testo Ansi quando usi Writeln(). E non dimenticare di impostare {$ I-} per un processo molto più veloce, se sei sicuro che il tuo TStream di destinazione non fallirà. –
Nome della stessa unità, stesso nome della funzione, prendiamo questo, grazie mille :-) –
Potete per favore fornire qualche esempio su come utilizzare questa unità. – Branko