Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

SmtpSock.pas

01.01.2007
unit SmtpSock;
 
{
 
CrtSocket for Delphi 32
 
Copyright (C) 1999-2001  Paul Toth <tothpaul@free.fr>
  http
://tothpaul.free.fr
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU
General Public License
as published by the Free Software Foundation; either version 2
of the
License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY
; without even the implied warranty of
MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public License
along
with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
}
 
interface
 
Uses
 
CrtSock,Classes;
 
Function SmtpOpen(Server:string):integer;
Function SmtpError:string;
Procedure SmtpClose;
Function SmtpFrom(Email:string):boolean;
Function SmtpTo(Email:string):boolean;
 
Function SmtpHead(From,Rcpt,Subject:string):boolean;
Function SmtpSend(From,Rcpt,Subject:string; Msg:TStrings):boolean;
procedure
SmtpJoin(Name:string; Stream:TStream; Count:integer);
Function SmtpDone:boolean;
 
implementation
 
var
 sin
,sout:TextFile;
 
last:string;
 
Function ReadString:string;
 
begin
  repeat
   readln
(sin,Result);
//   writeln(result);
 
until (Length(Result)<4)or(Result[4]<>'-');
 
last:=Result;
 
end;
 
Procedure WriteString(s:string);
 
begin
//  writeln('>>>',s);
 
WriteLn(sout,s);
 
end;
 
Function Status:char;
 
var
  s
:string;
 
begin
  s
:=ReadString;
 
if s='' then Status:='?' else Status:=s[1];
 
end;
 
Function Exec(cmd:string):char;
 
begin
 
Writestring(cmd);
 
Result:=Status;
 
end;
 
Function SmtpOpen(Server:string):integer;
 
begin
 
Last:='Server not found';
 
Result:=CallServer(Server,25);
 
if Result>0 then begin
   
AssignCrtSock(Result,sin,sout);
   
if Status='2' then begin
   
if Exec('HELO MySoft.Delphi')='2' then exit;
   
Disconnect(Result);
   
Result:=-3;
   
end else begin
   
Disconnect(Result);
   
Result:=-2;
   
end;
 
end;
 
end;
 
Function SmtpError:string;
 
begin
 
Result:=Last;
 
end;
 
Procedure SmtpClose;
 
begin
 
CloseFile(sout);
 
end;
 
Function SmtpFrom(Email:string):boolean;
 
begin
 
Result:=(Exec('MAIL '+'From: '+EMail)='2');
 
end;
 
Function SmtpTo(EMail:string):boolean;
 
begin
 
Result:=(Exec('RCPT To:'+Email)='2');
 
end;
 
Function SmtpHead(From,Rcpt,Subject:string):boolean;
 
begin
 
Result:=False;
 
if Exec('DATA')<>'3' then exit;
 
WriteString('From: '+From);
 
WriteString('To: '+Rcpt);
 
WriteString('Subject: '+Subject);
 
WriteString('Content-Type: text/plain; charset=ISO-8859-1');
 
WriteString('Content-Transfer-Encoding: 8bit'#13#10);
 
WriteString('');
 
Result:=True;
 
end;
 
Function SmtpSend(From,Rcpt,Subject:string; Msg:TStrings):boolean;
 
begin
 
Result:=False;
 
if not SmtpHead(From,Rcpt,Subject) then exit;
 
WriteString(Msg.Text);
 
Result:=SmtpDone;
 
end;
 
function uchr(b:byte):char;
 
begin
 
if b=0 then result:=#96 else result:=chr(b+32);
 
end;
 
procedure
SmtpJoin(Name:string; Stream:TStream; Count:integer);
 
var
  s
:string[76];
  size
:integer;
  u
:string;
  ss
:integer;
  c1
,c2:byte;
  x
:integer;
 
begin
 
WriteString('begin 600 '+Name);
  size
:=45;
 
while Count>0 do begin
   
if size>Count then size:=count;
   dec
(count,size);
   
Stream.Read(s[1],size);
   u
:=uchr(size);
   ss
:=2;
   c2
:=0;
   
for x:=1 to size do begin
    c1
:=ord(s[x]);
    u
:=u+uchr(c2 or (c1 shr ss));
    c2
:=(c1 shl (6-ss)) and 63;
    ss
:=(ss+2) and 7;
   
if ss=0 then begin
     ss
:=2;
     u
:=u+uchr(c2);
     c2
:=0;
   
end;
   
end;
   
if (ss>2) then begin
    u
:=u+uchr(c2)+#96;
   
if ss=4 then u:=u+#96;
   
end;
   
WriteString(u);
 
end;
  writeString
('end');
 
end;
 
Function SmtpDone:boolean;
 
begin
 
Result:=(Exec('.')='2');
 
CloseFile(sout);
 
end;
 
end.