?? smtpprot.pas
字號:
if aBias < 0 then
Result[1] := '+';
end;
end;
{$ENDIF}
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function Rfc822DateTime(t : TDateTime) : String;
var
I : Integer;
SaveShortDayNames : array[1..7] of string;
SaveShortMonthNames : array[1..12] of string;
const
MyShortDayNames: array[1..7] of string =
('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
MyShortMonthNames: array[1..12] of string =
('Jan', 'Feb', 'Mar', 'Apr',
'May', 'Jun', 'Jul', 'Aug',
'Sep', 'Oct', 'Nov', 'Dec');
begin
if ShortDayNames[1] = MyShortDayNames[1] then
Result := FormatDateTime('ddd, d mmm yyyy hh:mm:ss', t) +
' ' + TimeZoneBias
else begin
{ We used a localized Delphi version, the day and month names are no }
{ more english names ! We need to save and replace them }
for I := Low(ShortDayNames) to High(ShortDayNames) do begin
SaveShortDayNames[I] := ShortDayNames[I];
ShortDayNames[I] := MyShortDayNames[I];
end;
for I := Low(ShortMonthNames) to High(ShortMonthNames) do begin
SaveShortMonthNames[I] := ShortMonthNames[I];
ShortMonthNames[I] := MyShortMonthNames[I];
end;
Result := FormatDateTime('ddd, d mmm yyyy hh:mm:ss', t) +
' ' + TimeZoneBias;
for I := Low(ShortDayNames) to High(ShortDayNames) do
ShortDayNames[I] := SaveShortDayNames[I];
for I := Low(ShortMonthNames) to High(ShortMonthNames) do
ShortMonthNames[I] := SaveShortMonthNames[I];
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.TriggerProcessHeader(HdrLines : TStrings);
begin
if Assigned(FOnProcessHeader) then
FOnProcessHeader(Self, HdrLines);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.TriggerCommand(Msg : String);
begin
if Assigned(FOnCommand) then
FOnCommand(Self, Msg);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.TriggerResponse(Msg : String);
begin
if Assigned(FOnResponse) then
FOnResponse(Self, Msg);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.ClearErrorMessage;
begin
FErrorMessage := '';
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomSmtpClient.SetErrorMessage;
begin
if FErrorMessage = '' then
FErrorMessage := FLastResponse;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
constructor TSmtpCli.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FEmailBody := TStringList.Create;
FEmailFiles := TStringList.Create;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
destructor TSmtpCli.Destroy;
begin
if Assigned(FEmailBody) then begin
FEMailBody.Destroy;
FEMailBody := nil;
end;
if Assigned(FEmailFiles) then begin
FEmailFiles.Destroy;
FEmailFiles := nil;
end;
inherited Destroy;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TSmtpCli.TriggerAttachContentType(
FileNumber : Integer;
var FileName : String;
var ContentType : String);
begin
if Assigned(FOnAttachContentType) then
FOnAttachContentType(Self, FileNumber, FileName, ContentType);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TSmtpCli.TriggerAttachHeader(
FileNumber : Integer;
FileName : String;
HdrLines : TStrings);
begin
if Assigned(FOnAttachHeader) then
FOnAttachHeader(Self, FileNumber, FileName, HdrLines);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TSmtpCli.TriggerGetData(
LineNum : Integer;
MsgLine : PChar;
MaxLen : Integer;
var More : Boolean);
var
sLine : String;
FileName : String;
sFileName : String;
sContentType : String;
begin
if FEmailBody.Count > 0 then begin
StrPCopy(MsgLine, FEmailBody[0]);
FEmailBody.Delete(0);
More := TRUE;
Exit;
end;
if FBodyFlag then begin
Inc(FBodyLine);
inherited TriggerGetData(FBodyLine, MsgLine, MaxLen, More);
if More then
Exit;
FBodyFlag := FALSE;
end;
if not FFileStarted then begin
if (not Assigned(FEMailFiles)) or
(FEmailFiles.Count <= FCurrentFile) then begin
{ No file to send }
More := FALSE;
Exit;
end;
StrPCopy(MsgLine, '');
FileName := FEmailFiles[FCurrentFile];
InitUUEncode(FFile, FileName);
sFileName := ExtractFileName(FileName);
sContentType := 'application/octet-stream';
TriggerAttachContentType(FCurrentFile, sFileName, sContentType);
FEmailBody.Add('--' + FMimeBoundary);
FEmailBody.Add('Content-Type: ' + sContentType + ';');
FEmailBody.Add(#9'name="' + sFileName + '"');
FEmailBody.Add('Content-Transfer-Encoding: base64');
FEmailBody.Add('Content-Disposition: attachment;');
FEmailBody.Add(#9'filename="' + ExtractFileName(FileName) + '"');
TriggerAttachHeader(FCurrentFile, sFileName, FEmailBody);
FEmailBody.Add('');
FFileStarted := TRUE;
More := TRUE;
Exit;
end;
DoUUEncode(FFile, sLine, More);
StrPCopy(MsgLine, sLine);
if not More then begin { we hit the end of file. }
EndUUEncode(FFile);
FFileStarted := FALSE;
Inc(FCurrentFile);
if (FEmailFiles.Count <= FCurrentFile) then begin
FEmailBody.Add('');
FEmailBody.Add('--' + FMimeBoundary + '--');
end;
More := TRUE;
Exit;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TSmtpCli.TriggerHeaderLine(Line : PChar; Size : Integer);
begin
{ if we have a MIME type message, then replace the content-type }
{ header with the proper MIME content-type. }
if FMimeBoundary <> '' then begin
if StrLIComp('CONTENT-TYPE:', Line, 13) = 0 then
StrPCopy(Line, 'Content-Type: multipart/mixed;'#13#10#9'boundary="'
+ FMimeBoundary + '"');
end;
inherited TriggerHeaderLine(Line, Size);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TSmtpCli.SetEMailFiles(newValue : TStrings);
var
I : Integer;
FilePath : String;
begin
FEMailFiles.Clear;
if not Assigned(newValue) then
Exit;
for I := 0 to newValue.Count - 1 do begin
FilePath := Trim(newValue.Strings[I]);
{ Ignore any empty file name (a very common error !) }
if FilePath > '' then begin
{ Check if file exists and raise an exception if not }
if FileExists(FilePath) then
FEMailFiles.Add(FilePath)
else
raise SmtpException.Create('File not found ''' + FilePath + '''');
end;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TSmtpCli.Data;
begin
PrepareEMail;
inherited Data;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TSmtpCli.PrepareEMail;
var i : integer;
begin
FBodyFlag := TRUE;
FCurrentFile := 0;
FBodyLine := 0;
FFileStarted := FALSE;
FEmailBody.Clear;
if Assigned(FEMailFiles) and (FEmailFiles.Count > FCurrentFile) then begin
FMimeBoundary := '= Multipart Boundary '
+ FormatDateTime('mmddyyhhnn', Now);
FEmailBody.Add('This is a multipart MIME message.');
FEmailBody.Add('');
FEmailBody.Add('--' + FMimeBoundary);
FEmailBody.Add('Content-Type: ' + FContentTypeStr + '; charset="' + FCharSet + '"');
FEmailBody.Add('Content-Transfer-Encoding: 7bit');
FEmailBody.Add('');
end
else
FMimeBoundary := '';
for i := 0 to FMailMessage.Count - 1 do
FEmailBody.Add(FMailMessage.Strings[I]);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
constructor TSyncSmtpCli.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FTimeout := 15;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TSyncSmtpCli.WaitUntilReady : Boolean;
begin
Result := TRUE; { Suppose success }
FTimeStop := Integer(GetTickCount) + FTimeout * 1000;
while TRUE do begin
if FState = smtpReady then begin
{ Back to ready state, the command is finiched }
Result := (FRequestResult = 0);
break;
end;
if Application.Terminated or
((FTimeout > 0) and (Integer(GetTickCount) > FTimeStop)) then begin
{ Application is terminated or timeout occured }
inherited Abort;
FErrorMessage := '426 Timeout';
FStatusCode := 426;
Result := FALSE; { Command failed }
break;
end;
{$IFNDEF VER80}
if FMultiThreaded then
FWSocket.ProcessMessages
else
{$ENDIF}
Application.ProcessMessages;
{$IFNDEF VER80}
{ Do not use 100% CPU, but slow down transfert on high speed LAN }
Sleep(0);
{$ENDIF}
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TSyncSmtpCli.Synchronize(Proc : TSmtpNextProc) : Boolean;
begin
try
Proc;
Result := WaitUntilReady;
except
Result := FALSE;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TSyncSmtpCli.ConnectSync : Boolean;
begin
Result := Synchronize(Connect);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TSyncSmtpCli.HeloSync : Boolean;
begin
Result := Synchronize(Helo);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TSyncSmtpCli.VrfySync : Boolean;
begin
Result := Synchronize(Vrfy);
end;
{* * * * * * * * *
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -