?? smtpprot.pas
字號:
write FOnResponse;
property OnGetData : TSmtpGetDataEvent read FOnGetData
write FOnGetData;
property OnHeaderLine : TSmtpHeaderLineEvent read FOnHeaderLine
write FOnHeaderLine;
property OnProcessHeader : TSmtpProcessHeaderEvent
read FOnProcessHeader
write FOnProcessHeader;
property OnRequestDone : TSmtpRequestDone read FOnRequestDone
write FOnRequestDone;
property OnStateChange : TNotifyEvent read FOnStateChange
write FOnStateChange;
property OnSessionConnected : TSessionConnected
read FOnSessionConnected
write FOnSessionConnected;
property OnSessionClosed : TSessionClosed
read FOnSessionClosed
write FOnSessionClosed;
end;
{ Descending component adding MIME (file attach) support }
TSmtpCli = class(TCustomSmtpClient)
protected
FEmailBody : TStrings; { Message body text }
FEmailFiles : TStrings; { File names for attachment }
FCurrentFile : Integer; { Current file being sent }
FMimeBoundary : String; { Message parts boundary }
FFile : File;
FFileStarted : Boolean;
FBodyFlag : Boolean;
FBodyLine : Integer;
FOnAttachContentType : TSmtpAttachmentContentType;
FOnAttachHeader : TSmtpAttachHeader;
procedure TriggerAttachContentType(FileNumber : Integer;
var FileName : String;
var ContentType : String); virtual;
procedure TriggerAttachHeader(FileNumber : Integer;
FileName : String;
HdrLines : TStrings); virtual;
procedure TriggerGetData(LineNum : Integer;
MsgLine : PChar;
MaxLen : Integer;
var More : Boolean); override;
procedure TriggerHeaderLine(Line : PChar; Size : Integer); override;
procedure SetEMailFiles(newValue : TStrings);
procedure PrepareEMail;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
procedure Data; override;
published
property Host;
property Port;
property SignOn;
property FromName;
property RcptName;
property MailMessage;
property HdrFrom;
property HdrTo;
property HdrReplyTo;
property HdrReturnPath;
property HdrSubject;
property HdrSender;
property State;
property CharSet;
property ContentType;
property ErrorMessage;
property LastResponse;
property Tag;
property OnDisplay;
property OnCommand;
property OnResponse;
property OnGetData;
property OnHeaderLine;
property OnProcessHeader;
property OnRequestDone;
property OnSessionConnected;
property OnSessionClosed;
property EmailFiles : TStrings read FEmailFiles
write SetEmailFiles;
property OnAttachContentType : TSmtpAttachmentContentType
read FOnAttachContentType
write FOnAttachContentType;
property OnAttachHeader : TSmtpAttachHeader read FOnAttachHeader
write FOnAttachHeader;
end;
{ TSyncSmtpCli add synchronous functions. You should avoid using this }
{ component because synchronous function, apart from being easy, result }
{ in lower performance programs. }
TSyncSmtpCli = class(TSmtpCli)
protected
FTimeout : Integer; { Given in seconds }
FTimeStop : LongInt; { Milli-seconds }
FMultiThreaded : Boolean;
function WaitUntilReady : Boolean; virtual;
function Synchronize(Proc : TSmtpNextProc) : Boolean;
public
constructor Create(AOwner : TComponent); override;
function ConnectSync : Boolean; virtual;
function HeloSync : Boolean; virtual;
function VrfySync : Boolean; virtual;
function MailFromSync : Boolean; virtual;
function RcptToSync : Boolean; virtual;
function DataSync : Boolean; virtual;
function QuitSync : Boolean; virtual;
function RsetSync : Boolean; virtual;
function AbortSync : Boolean; virtual;
function OpenSync : Boolean; virtual;
function MailSync : Boolean; virtual;
published
property Timeout : Integer read FTimeout
write FTimeout;
property MultiThreaded : Boolean read FMultiThreaded
write FMultiThreaded;
end;
{ Function to convert a TDateTime to an RFC822 timestamp string }
function Rfc822DateTime(t : TDateTime) : String;
procedure Register;
implementation
{$B-} { Partial boolean evaluation }
type
TLookup = array [0..64] of Char;
const
Base64Out: TLookup =
(
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '='
);
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{$IFDEF VER80}
procedure SetLength(var S: string; NewLength: Integer);
begin
S[0] := chr(NewLength);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function RTrim(Str : String) : String;
var
i : Integer;
begin
i := Length(Str);
while (i > 0) and (Str[i] = ' ') do
i := i - 1;
Result := Copy(Str, 1, i);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function LTrim(Str : String) : String;
var
i : Integer;
begin
if Str[1] <> ' ' then { Petite optimisation: pas d'espace }
Result := Str
else begin
i := 1;
while (i <= Length(Str)) and (Str[i] = ' ') do
i := i + 1;
Result := Copy(Str, i, Length(Str) - i + 1);
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function Trim(Str : String) : String;
begin
Result := LTrim(Rtrim(Str));
end;
{$ENDIF}
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function stpblk(PValue : PChar) : PChar;
begin
Result := PValue;
while Result^ in [' ', #9, #10, #13] do
Inc(Result);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{$I+} { Activate I/O check (EInOutError exception generated) }
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.InitUUEncode(var hFile: File; sFile: string);
var
OldFileMode : Byte;
begin
AssignFile(hFile, sFile);
OldFileMode := FileMode;
FileMode := 0; { Force readonly }
try
Reset(hFile, 1);
finally
FileMode := OldFileMode;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.DoUUEncode(var hFile: File; var sLine: string; var More: boolean);
var
Count : integer;
DataIn : array [0..2] of byte;
DataOut : array [0..80] of byte;
ByteCount : integer;
i : integer;
begin
Count := 0;
{$I-}
while not Eof(hFile) do begin
{$I+}
BlockRead(hFile, DataIn, 3, ByteCount);
DataOut[Count] := (DataIn[0] and $FC) shr 2;
DataOut[Count + 1] := (DataIn[0] and $03) shl 4;
if ByteCount > 1 then begin
DataOut[Count + 1] := DataOut[Count + 1] +
(DataIn[1] and $F0) shr 4;
DataOut[Count + 2] := (DataIn[1] and $0F) shl 2;
if ByteCount > 2 then begin
DataOut[Count + 2] := DataOut[Count + 2] +
(DataIn[2] and $C0) shr 6;
DataOut[Count + 3] := (DataIn[2] and $3F);
end
else begin
DataOut[Count + 3] := $40;
end;
end
else begin
DataOut[Count + 2] := $40;
DataOut[Count + 3] := $40;
end;
for i := 0 to 3 do
DataOut[Count + i] := Byte(Base64Out[DataOut[Count + i]]);
Count := Count + 4;
if Count > 59 then
break;
end;
DataOut[Count] := $0;
sLine := StrPas(@DataOut[0]);
{$I-}
More := not Eof(hFile);
{$I+}
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.EndUUEncode(var hFile: File);
begin
CloseFile(hFile);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
constructor TCustomSmtpClient.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FWindowHandle := AllocateHWnd(WndProc);
FWSocket := TWSocket.Create(nil);
FWSocket.OnSessionClosed := WSocketSessionClosed;
FState := smtpReady;
FRcptName := TStringList.Create;
FMailMessage := TStringList.Create;
FPort := 'smtp';
FCharSet := 'iso-8859-1';
SetContentType(smtpPlainText);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
destructor TCustomSmtpClient.Destroy;
begin
if Assigned(FWSocket) then begin
FWSocket.Destroy;
FWSocket := nil;
end;
if Assigned(FHdrLines) then begin
FHdrLines.Destroy;
FHdrLines := nil;
end;
FMailMessage.Destroy;
FRcptName.Destroy;
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.WndProc(var MsgRec: TMessage);
begin
with MsgRec do begin
case Msg of
WM_SMTP_REQUEST_DONE : WMSmtpRequestDone(MsgRec);
else
Result := DefWindowProc(Handle, Msg, wParam, lParam);
end;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.WMSmtpRequestDone(var msg: TMessage);
begin
if Assigned(FOnRequestDone) then
FOnRequestDone(Self, FRequestType, Msg.LParam);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function GetInteger(Data : PChar; var Number : Integer) : PChar;
var
bSign : Boolean;
begin
Number := 0;
Result := StpBlk(Data);
if (Result = nil) then
Exit;
{ Remember the sign }
if Result^ in ['-', '+'] then begin
bSign := (Result^ = '-');
Inc(Result);
end
else
bSign := FALSE;
{ Convert any number }
while (Result^ <> #0) and (Result^ in ['0'..'9']) do begin
Number := Number * 10 + ord(Result^) - ord('0');
Inc(Result);
end;
{ Correct for sign }
if bSign then
Number := -Number;
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -