📄 smtpprot.pas
字号:
property Tag : LongInt read FTag
write FTag;
property OwnHeaders : Boolean read FOwnHeaders
{ Angus V2.21 } write FOwnHeaders;
property OnDisplay : TSmtpDisplay read FOnDisplay
write FOnDisplay;
property OnCommand: TSmtpDisplay read FOnCommand
write FOnCommand;
property OnResponse: TSmtpDisplay read FOnResponse
write FOnResponse;
property OnGetData : TSmtpGetDataEvent read FOnGetData
write FOnGetData;
property OnHeaderLine : TSmtpHeaderLineEvent read FOnHeaderLine
write FOnHeaderLine;
property OnProcessHeader : TSmtpProcessHeaderEvent
read FOnProcessHeader
write FOnProcessHeader;
property OnRcptToError: TSmtpRcptToErrorEvent {AG 1/3/05}
read FOnRcptToError
write FOnRcptToError;
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 }
FFileStarted : Boolean;
FBodyFlag : Boolean;
FBodyLine : Integer;
FOnAttachContentType : TSmtpAttachmentContentType;
FOnAttachHeader : TSmtpAttachHeader;
FOnBeforeFileOpen : TSmtpBeforeFileOpenEvent; {A.G.}
FOnAfterFileOpen : TSmtpAfterFileOpenEvent; {A.G.}
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 : Pointer;
MaxLen : Integer;
var More : Boolean); override;
procedure TriggerHeaderLine(Line : Pointer; Size : Integer); override;
procedure SetEMailFiles(newValue : TStrings);
procedure PrepareEMail; virtual;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
procedure Data; override;
property AuthTypesSupported;
published
property ShareMode;
property Host;
property LocalAddr; {bb}
property Port;
property SignOn;
property Username;
property Password;
property AuthType;
property ConfirmReceipt; {AG}
property FromName;
property RcptName;
property MailMessage;
property HdrFrom;
property HdrTo;
property HdrCc;
property HdrReplyTo;
property HdrReturnPath;
property HdrSubject;
property HdrSender;
property HdrPriority;
property State;
property CharSet;
property ContentType;
property ErrorMessage;
property LastResponse;
property Tag;
property OwnHeaders ; { Angus V2.21 }
property OnDisplay;
property OnCommand;
property OnResponse;
property OnGetData;
property OnHeaderLine;
property OnProcessHeader;
property OnRcptToError; {A.G. 1/3/05}
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;
{A.G. start}
property OnBeforeFileOpen : TSmtpBeforeFileOpenEvent
read FOnBeforeFileOpen
write FOnBeforeFileOpen;
property OnAfterFileOpen : TSmtpAfterFileOpenEvent
read FOnAfterFileOpen
write FOnAfterFileOpen;
{A.G. end}
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;
procedure TriggerGetData(LineNum : Integer;
MsgLine : Pointer;
MaxLen : Integer;
var More : Boolean); override;
public
constructor Create(AOwner : TComponent); override;
function ConnectSync : Boolean; virtual;
function HeloSync : Boolean; virtual;
function EhloSync : Boolean; virtual;
function AuthSync : 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;
THtmlSmtpCli = class(TSmtpCli)
private
FPlainText : TStrings;
FEmailImages : TStrings;
FHtmlText : TStrings;
FStreamArray : TList;
FOutsideBoundary : String;
FInsideBoundary : String;
FMimeState : TSmtpMimeState;
FHtmlCharSet : String;
FLineOffset : Integer;
FImageNumber : Integer;
FsContentType : String;
FsFileName : String;
procedure SetPlainText(const newValue: TStrings);
procedure SetHtmlText(const newValue: TStrings);
function GetImageStream(Index: Integer): TStream;
procedure SetImageStream(Index: Integer; const Value: TStream);
function GetImageStreamCount: Integer;
protected
procedure SetEMailImages(newValue : TStrings);
procedure TriggerGetData(LineNum : Integer;
MsgLine : Pointer;
MaxLen : Integer;
var More : Boolean); override;
procedure TriggerProcessHeader(HdrLines : TStrings); override;
procedure GenerateBoundaries; virtual;
procedure PrepareEMail; override;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
procedure ClearImageStreamArray;
{ ImageStream is not completely implemented. Do not use ! }
property ImageStream[Index : Integer] : TStream
read GetImageStream
write SetImageStream;
property ImageStreamCount : Integer
read GetImageStreamCount;
published
property EmailImages : TStrings read FEmailImages
write SetEmailImages;
property PlainText : TStrings read FPlainText
write SetPlainText;
property HtmlText : TStrings read FHtmlText
write SetHtmlText;
end;
{ Function to convert a TDateTime to an RFC822 timestamp string }
function Rfc822DateTime(t : TDateTime) : String;
{ Function to parse a friendly email and extract friendly name and email }
{ "Fran鏾is PIETTE" <francois.piette@overbyte.be> }
{ The function returns as result the email address and in the var }
{ parameter the friendly name without quote, if any. }
{ The function take care of various common ways to build friendly email }
{ addresses, or even non friendly addresses. }
function ParseEmail(FriendlyEmail : String;
var FriendlyName : String) : String;
{ function to generate a unique message ID }
function GenerateMessageID : String; {AG}
{ List of separators accepted between email addresses }
const
SmtpEMailSeparators = [';', ','];
procedure Register;
implementation
{$B-} { Partial boolean evaluation }
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{$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.SetShareMode(newValue: TSmtpShareMode);
begin
{$IFNDEF VER80}{$WARNINGS OFF}{$ENDIF}
case newValue of
smtpShareCompat : FShareMode := fmShareCompat;
smtpShareExclusive : FShareMode := fmShareExclusive;
smtpShareDenyWrite : FShareMode := fmShareDenyWrite;
smtpShareDenyRead : FShareMode := fmShareDenyRead;
smtpShareDenyNone : FShareMode := fmShareDenyNone;
else
FShareMode := fmShareDenyWrite;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -