Puede echar un vistazo a nuestro SynCrtSock
Open Source unit.
Implementa muchas características (incluido un servidor HTTP/1.1 basado en http.sys), pero también tiene algunos archivos de texto virtual para escribir en un socket. Se usa, p. implementar un cliente o servidor HTTP, o SMTP (para enviar un correo electrónico).
Será una buena muestra de cómo crear un "virtual" TTextRec
, incluida la lectura de contenido de escritura &, y también la manipulación de errores. El tamaño del búfer interno también se mejora a partir de su valor predeterminado: aquí tiene 1 KB de almacenamiento en caché de forma predeterminada, en lugar de 128 bytes.
Por ejemplo, aquí es cómo se puede utilizar para enviar un correo electrónico a través de SMTP (código fuente extrae de la unidad):
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;
Se producirá solamente ANSI contenido, por definición.
Dirige Delphi 5 hasta XE2, por lo que incluirá Delphi 2009 o XE.
+1 retén agradable. Supongo que la unidad de FPC StreamIO es básicamente la misma ... Pero no estoy seguro de que maneje texto Unicode. Probablemente se sorprenderá con el tipo de texto Ansi cuando use Writeln(). Y no olvide configurar {$ I-} para un proceso mucho más rápido, si está seguro de que su destino TStream no fallará. –
Nombre de la misma unidad, el mismo nombre de función, tomaremos esto, muchas gracias :-) –
Puede darnos algún ejemplo de cómo usar esta unidad. – Branko