Difference between revisions of "Unit SMTP"

From Ultibo.org
Jump to: navigation, search
 
(4 intermediate revisions by the same user not shown)
Line 5: Line 5:
 
----
 
----
  
'''Ultibo SMTP interface unit'''
+
'''Ultibo SMTP Interface unit'''
 
+
''To be documented''
+
  
 
=== Constants ===
 
=== Constants ===
Line 30: Line 28:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
<div style="font-size: 14px; padding-left: 12px;">'''SMTP status constants''' <code> SMTP_STATUS_* </code></div>
+
<div style="font-size: 14px; padding-left: 12px;">'''SMTP status''' <code> SMTP_STATUS_* </code></div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
Line 67: Line 65:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
<div style="font-size: 14px; padding-left: 12px;">'''SMTP command constants''' <code> SMTP_COMMAND_* </code></div>
+
<div style="font-size: 14px; padding-left: 12px;">'''SMTP command''' <code> SMTP_COMMAND_* </code></div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
Line 111: Line 109:
 
<br />  
 
<br />  
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
<div style="font-size: 14px; padding-left: 12px;">'''SMTP sub command constants''' <code> SMTP_SUB_COMMAND_* </code></div>
+
<div style="font-size: 14px; padding-left: 12px;">'''SMTP sub command''' <code> SMTP_SUB_COMMAND_* </code></div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
Line 125: Line 123:
 
<br />  
 
<br />  
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
<div style="font-size: 14px; padding-left: 12px;">'''SMTP string constants''' <code> SMTP_STRING_* </code></div>
+
<div style="font-size: 14px; padding-left: 12px;">'''SMTP string''' <code> SMTP_STRING_* </code></div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
Line 294: Line 292:
 
<br />  
 
<br />  
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
<div style="font-size: 14px; padding-left: 12px;">'''SMTP logging constants''' <code> SMTP_LOG_* </code></div>
+
<div style="font-size: 14px; padding-left: 12px;">'''SMTP logging''' <code> SMTP_LOG_* </code></div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
Line 303: Line 301:
 
| <code>SMTP_LOG_LEVEL_INFO = LOG_LEVEL_INFO;</code>
 
| <code>SMTP_LOG_LEVEL_INFO = LOG_LEVEL_INFO;</code>
 
| SMTP informational messages
 
| SMTP informational messages
 +
|-
 +
| <code>SMTP_LOG_LEVEL_WARN = LOG_LEVEL_WARN;</code>
 +
| SMTP warning messages
 
|-
 
|-
 
| <code>SMTP_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;</code>
 
| <code>SMTP_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;</code>
Line 386: Line 387:
  
  
'''SMTP buffer'''
+
'''SMTP helper classes'''
  
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
<code>TSMTPBuffer = class(TObject)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
| [[TSMTPBuffer|<code>TSMTPBuffer = class(TObject)</code>]]
|-
+
| <code>constructor Create(ASize:LongWord);</code>
+
| style="width: 50%;"|&nbsp;
+
|-
+
| <code>destructor Destroy; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
|-
+
| <code>FLock:TCriticalSectionHandle;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FData:Pointer;</code>
+
| &nbsp;
+
|-
+
| <code>FSize:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FCount:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FStart:LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function AcquireLock:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function ReleaseLock:Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetCount:LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>property Count:LongWord read GetCount;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function ReadData:Char;</code>
+
| &nbsp;
+
|-
+
| <code>function WriteData(AChar:Char):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function WriteLock(var ASize:LongWord):Pointer;</code>
+
| &nbsp;
+
|-
+
| <code>function WriteUnlock(ACount:LongWord):Boolean;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
 
  
'''SMTP client'''
+
'''SMTP client classes'''
  
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
<code>TSMTPClient = class(TWinsock2TCPClient)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
| [[TSMTPClient|<code>TSMTPClient = class(TWinsock2TCPClient)</code>]]
|-
+
| <code>constructor Create;</code>
+
| style="width: 50%;"|&nbsp;
+
|-
+
| <code>destructor Destroy; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
|-
+
| <code>FOnRequest:TSMTPClientNotifyEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnReply:TSMTPClientNotifyEvent;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FOnRequestStart:TNotifyEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnRequestEnd:TNotifyEvent;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FAuthenticated:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>FBuffer:TSMTPBuffer;</code>
+
| Buffer for received data
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''protected'''</div>
+
|-
+
| <code>function GetReply(var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function SendRequest(const ARequest:String):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>property OnRequest:TSMTPClientNotifyEvent read FOnRequest write FOnRequest;</code>
+
| &nbsp;
+
|-
+
| <code>property OnReply:TSMTPClientNotifyEvent read FOnReply write FOnReply;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property OnRequestStart:TNotifyEvent read FOnRequestStart write FOnRequestStart;</code>
+
| &nbsp;
+
|-
+
| <code>property OnRequestEnd:TNotifyEvent read FOnRequestEnd write FOnRequestEnd;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property Authenticated:Boolean read FAuthenticated;</code>
+
| &nbsp;
+
|-
+
| <code>property Buffer:TSMTPBuffer read FBuffer;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function DoConn(const AHost,APort:String; var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoHelo(const AHost:String; var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoEhlo(const AHost:String; var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoAuth(const AProtocol,AUsername,APassword:String; var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoMail(const ASender:String; var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoRcpt(const AReceiver:String; var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoVrfy(const AAddress:String; var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoBeginData(var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoSendData(const AData:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoEndData(var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoQuit(var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoRset(var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoTime(var AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function DoNoop(var AReply:String):Boolean;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div> 
 
  
'''SMTP connection'''
+
'''SMTP server classes'''
  
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
<code>TSMTPConnection = class(TListObject)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
| [[TSMTPConnection|<code>TSMTPConnection = class(TListObject)</code>]]
|-
+
| <code>constructor Create;</code>
+
| style="width: 50%;"|&nbsp;
+
|-
+
| <code>destructor Destroy; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
|-
+
| <code>FLock:TCriticalSectionHandle;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FHandle:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FRxByteCount:Int64;</code>
+
| Bytes Recv Count from Connection
+
|-
+
| <code>FTxByteCount:Int64;</code>
+
| Bytes Sent Count to Connection
+
|-
+
| <code>FRequestCount:Int64;</code>
+
| Requests Recv Count from Connection
+
|-
+
| <code>FReplyCount:Int64;</code>
+
| Replies Sent Count to Connection
+
|-
+
| <code>FRequestTime:TDateTime;</code>
+
| Last Request Time
+
|-
+
| <code>FReplyTime:TDateTime;</code>
+
| Last Reply Time
+
|-
+
| <code>FRemoteAddress:String;</code>
+
| Address of Remote Client
+
|-
+
| <code>FStatus:LongWord;</code>
+
| None,Conn,Auth,Helo,Mail,Rcpt,Data etc
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FAuthenticated:Boolean;</code>
+
| Current authentication state
+
|-
+
| <code>FUsername:String;</code>
+
| Current Username
+
|-
+
| <code>FPassword:String;</code>
+
| Current Password
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FThread:TThread;</code>
+
| TWinsock2TCPServerThread
+
|-
+
| <code>FBuffer:TSMTPBuffer;</code>
+
| Buffer for received data
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function AcquireLock:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function ReleaseLock:Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>procedure SetHandle(AHandle:LongWord);</code>
+
| &nbsp;
+
|-
+
| <code>function GetRxByteCount:Int64;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetRxByteCount(const ARxByteCount:Int64);</code>
+
| &nbsp;
+
|-
+
| <code>function GetTxByteCount:Int64;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetTxByteCount(const ATxByteCount:Int64);</code>
+
| &nbsp;
+
|-
+
| <code>function GetRequestCount:Int64;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetRequestCount(const ARequestCount:Int64);</code>
+
| &nbsp;
+
|-
+
| <code>function GetReplyCount:Int64;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetReplyCount(const AReplyCount:Int64);</code>
+
| &nbsp;
+
|-
+
| <code>function GetRequestTime:TDateTime;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetRequestTime(const ARequestTime:TDateTime);</code>
+
| &nbsp;
+
|-
+
| <code>function GetReplyTime:TDateTime;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetReplyTime(const AReplyTime:TDateTime);</code>
+
| &nbsp;
+
|-
+
| <code>function GetRemoteAddress:String;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetRemoteAddress(const ARemoteAddress:String);</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetStatus(AStatus:LongWord);</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>procedure SetAuthenticated(AAuthenticated:Boolean);</code>
+
| &nbsp;
+
|-
+
| <code>function GetUsername:String;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetUsername(const AUsername:String);</code>
+
| &nbsp;
+
|-
+
| <code>function GetPassword:String;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetPassword(const APassword:String);</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>procedure SetThread(AThread:TThread);</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>property Handle:LongWord read FHandle write SetHandle;</code>
+
| &nbsp;
+
|-
+
| <code>property RxByteCount:Int64 read GetRxByteCount write SetRxByteCount;</code>
+
| &nbsp;
+
|-
+
| <code>property TxByteCount:Int64 read GetTxByteCount write SetTxByteCount;</code>
+
| &nbsp;
+
|-
+
| <code>property RequestCount:Int64 read GetRequestCount write SetRequestCount;</code>
+
| &nbsp;
+
|-
+
| <code>property ReplyCount:Int64 read GetReplyCount write SetReplyCount;</code>
+
| &nbsp;
+
|-
+
| <code>property RequestTime:TDateTime read GetRequestTime write SetRequestTime;</code>
+
| &nbsp;
+
|-
+
| <code>property ReplyTime:TDateTime read GetReplyTime write SetReplyTime;</code>
+
| &nbsp;
+
|-
+
| <code>property RemoteAddress:String read GetRemoteAddress write SetRemoteAddress;</code>
+
| &nbsp;
+
|-
+
| <code>property Status:LongWord read FStatus write SetStatus;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property Authenticated:Boolean read FAuthenticated write SetAuthenticated;</code>
+
| &nbsp;
+
|-
+
| <code>property Username:String read GetUsername write SetUsername;</code>
+
| &nbsp;
+
|-
+
| <code>property Password:String read GetPassword write SetPassword;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property Thread:TThread read FThread  write SetThread;</code>
+
| &nbsp;
+
|-
+
| <code>property Buffer:TSMTPBuffer read FBuffer;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>procedure IncrementRxByteCount(const ARxByteCount:Int64);</code>
+
| &nbsp;
+
|-
+
| <code>procedure IncrementTxByteCount(const ATxByteCount:Int64);</code>
+
| &nbsp;
+
|-
+
| <code>procedure IncrementRequestCount;</code>
+
| &nbsp;
+
|-
+
| <code>procedure IncrementReplyCount;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
'''SMTP listener'''
+
 
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
 
+
<code>TSMTPListener = class(TWinsock2TCPListener)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
| [[TSMTPListener|<code>TSMTPListener = class(TWinsock2TCPListener)</code>]]
|-
+
| <code>constructor Create;</code>
+
| style="width: 50%;"|&nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
|-
+
| <code>FOnConnected:TSMTPConnectionEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnDisconnected:TSMTPConnectionEvent;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FOnCheckHost:TSMTPHostEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnCheckCount:TSMTPCountEvent;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FOnRequest:TSMTPNotifyEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnReply:TSMTPNotifyEvent;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FOnConn:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnHelo:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnEhlo:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnAuth:TSMTPAuthenticateEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnMail:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnRcpt:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnVrfy:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnBeginData:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnData:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnEndData:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnQuit:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnRset:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnTime:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
| <code>FOnNoop:TSMTPRequestEvent;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''protected'''</div>
+
|-
+
| <code>procedure DoConnect(AThread:TWinsock2TCPServerThread); override;</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoDisconnect(AThread:TWinsock2TCPServerThread); override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function DoCheckHost(AThread:TWinsock2TCPServerThread):Boolean; virtual;</code>
+
| &nbsp;
+
|-
+
| <code>function DoCheckCount(AThread:TWinsock2TCPServerThread):Boolean; virtual;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function DoExecute(AThread:TWinsock2TCPServerThread):Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>procedure DoConn(AThread:TWinsock2TCPServerThread);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoHelo(AThread:TWinsock2TCPServerThread; const AHost:String);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoEhlo(AThread:TWinsock2TCPServerThread; const AHost:String);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoAuth(AThread:TWinsock2TCPServerThread; const AParams:String);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoMail(AThread:TWinsock2TCPServerThread; const ASender:String);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoRcpt(AThread:TWinsock2TCPServerThread; const ARecipient:String);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoVrfy(AThread:TWinsock2TCPServerThread; const AAddress:String);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoBeginData(AThread:TWinsock2TCPServerThread);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoData(AThread:TWinsock2TCPServerThread; const AData:String);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoEndData(AThread:TWinsock2TCPServerThread);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoQuit(AThread:TWinsock2TCPServerThread);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoRset(AThread:TWinsock2TCPServerThread);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoTime(AThread:TWinsock2TCPServerThread);</code>
+
| &nbsp;
+
|-
+
| <code>procedure DoNoop(AThread:TWinsock2TCPServerThread);</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetRequest(AThread:TWinsock2TCPServerThread;var ARequest:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function SendReply(AThread:TWinsock2TCPServerThread;const AReply:String):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>property OnConnected:TSMTPConnectionEvent read FOnConnected write FOnConnected;</code>
+
| &nbsp;
+
|-
+
| <code>property OnDisconnected:TSMTPConnectionEvent read FOnDisconnected write FOnDisconnected;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property OnCheckHost:TSMTPHostEvent read FOnCheckHost write FOnCheckHost;</code>
+
| &nbsp;
+
|-
+
| <code>property OnCheckCount:TSMTPCountEvent read FOnCheckCount write FOnCheckCount;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property OnRequest:TSMTPNotifyEvent read FOnRequest write FOnRequest;</code>
+
| &nbsp;
+
|-
+
| <code>property OnReply:TSMTPNotifyEvent read FOnReply write FOnReply;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property OnConn:TSMTPRequestEvent read FOnConn write FOnConn;</code>
+
| &nbsp;
+
|-
+
| <code>property OnHelo:TSMTPRequestEvent read FOnHelo write FOnHelo;</code>
+
| &nbsp;
+
|-
+
| <code>property OnEhlo:TSMTPRequestEvent read FOnEhlo write FOnEhlo;</code>
+
| &nbsp;
+
|-
+
| <code>property OnAuth:TSMTPAuthenticateEvent read FOnAuth write FOnAuth;</code>
+
| &nbsp;
+
|-
+
| <code>property OnMail:TSMTPRequestEvent read FOnMail write FOnMail;</code>
+
| &nbsp;
+
|-
+
| <code>property OnRcpt:TSMTPRequestEvent read FOnRcpt write FOnRcpt;</code>
+
| &nbsp;
+
|-
+
| <code>property OnVrfy:TSMTPRequestEvent read FOnVrfy write FOnVrfy;</code>
+
| &nbsp;
+
|-
+
| <code>property OnBeginData:TSMTPRequestEvent read FOnBeginData write FOnBeginData;</code>
+
| &nbsp;
+
|-
+
| <code>property OnData:TSMTPRequestEvent read FOnData write FOnData;</code>
+
| &nbsp;
+
|-
+
| <code>property OnEndData:TSMTPRequestEvent read FOnEndData write FOnEndData;</code>
+
| &nbsp;
+
|-
+
| <code>property OnQuit:TSMTPRequestEvent read FOnQuit write FOnQuit;</code>
+
| &nbsp;
+
|-
+
| <code>property OnRset:TSMTPRequestEvent read FOnRset write FOnRset;</code>
+
| &nbsp;
+
|-
+
| <code>property OnTime:TSMTPRequestEvent read FOnTime write FOnTime;</code>
+
| &nbsp;
+
|-
+
| <code>property OnNoop:TSMTPRequestEvent read FOnNoop write FOnNoop;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div> 
 
 
<br />
 
<br />
  
Line 1,026: Line 426:
 
|-
 
|-
 
| <code>SMTP_DEFAULT_LOG_LEVEL:LongWord = SMTP_LOG_LEVEL_DEBUG;</code>
 
| <code>SMTP_DEFAULT_LOG_LEVEL:LongWord = SMTP_LOG_LEVEL_DEBUG;</code>
| style="width: 65%;"|Minimum level for SMTP messages. Only messages with level greater than or equal to this will be printed.
+
| style="width: 40%;"|Minimum level for SMTP messages. Only messages with level greater than or equal to this will be printed.
 
|-
 
|-
 
|}
 
|}
Line 1,032: Line 432:
 
|-
 
|-
 
| <code>SMTP_LOG_ENABLED:Boolean;</code>
 
| <code>SMTP_LOG_ENABLED:Boolean;</code>
| style="width: 65%;"|
+
| style="width: 40%;"|
 
|-
 
|-
 
|}
 
|}
Line 1,049: Line 449:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,064: Line 464:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 +
| None documented
 +
|-
 +
|}
 +
</div></div>
 +
<br />
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 +
<pre style="border: 0; padding-bottom:0px;">procedure SMTPLogInfo(const AText:String); inline;</pre>
 +
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,071: Line 483:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">procedure SMTPLogInfo(const AText:String);</pre>
+
<pre style="border: 0; padding-bottom:0px;">procedure SMTPLogWarn(const AText:String); inline;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,083: Line 495:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">procedure SMTPLogError(const AText:String);</pre>
+
<pre style="border: 0; padding-bottom:0px;">procedure SMTPLogError(const AText:String); inline;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,095: Line 507:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">procedure SMTPLogDebug(const AText:String);</pre>
+
<pre style="border: 0; padding-bottom:0px;">procedure SMTPLogDebug(const AText:String); inline;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-

Latest revision as of 05:31, 31 August 2021

Return to Unit Reference


Description


Ultibo SMTP Interface unit

Constants



SMTP specific constants SMTP_*
SMTP_LINE_END = Chr(13) + Chr(10); CR LF
 
SMTP_BUFFER_SIZE = SIZE_4K;  


SMTP status SMTP_STATUS_*
SMTP_STATUS_NONE = 0;  
SMTP_STATUS_CONN = 1;  
SMTP_STATUS_HELO = 2;  
SMTP_STATUS_AUTH = 3;  
SMTP_STATUS_MAIL = 4;  
SMTP_STATUS_RCPT = 5;  
SMTP_STATUS_DATA = 6;  
SMTP_STATUS_QUIT = 7;  
 
SMTP_MAX_STATUS = 7;  


SMTP command SMTP_COMMAND_*
SMTP_COMMAND_HELO = 'HELO';  
SMTP_COMMAND_EHLO = 'EHLO';  
SMTP_COMMAND_TIME = 'TIME';  
SMTP_COMMAND_NOOP = 'NOOP';  
SMTP_COMMAND_AUTH = 'AUTH';  
SMTP_COMMAND_MAIL = 'MAIL';  
SMTP_COMMAND_RCPT = 'RCPT';  
SMTP_COMMAND_VRFY = 'VRFY';  
SMTP_COMMAND_BEGIN_DATA = 'DATA';  
SMTP_COMMAND_END_DATA = '.';  
SMTP_COMMAND_RSET = 'RSET';  
SMTP_COMMAND_QUIT = 'QUIT';  


SMTP sub command SMTP_SUB_COMMAND_*
SMTP_SUB_COMMAND_MAIL_FROM = 'FROM:';  
SMTP_SUB_COMMAND_RCPT_TO = 'TO:';  


SMTP string SMTP_STRING_*
SMTP_STRING_CONTINUE = '-';  
 
SMTP_STRING_CONN_SUCCESS = '220 ';  
SMTP_STRING_QUIT_SUCCESS = '221 ';  
SMTP_STRING_HELO_SUCCESS = '250 ';  
SMTP_STRING_EHLO_SUCCESS = '250 ';  
SMTP_STRING_TIME_SUCCESS = '250 ';  
SMTP_STRING_NOOP_SUCCESS = '250 ';  
SMTP_STRING_CONT_SUCCESS = '250-';  
SMTP_STRING_AUTH_SUCCESS = '235 ';  
SMTP_STRING_AUTH_CHALLENGE = '334 ';  
SMTP_STRING_MAIL_SUCCESS = '250 ';  
SMTP_STRING_RCPT_SUCCESS = '250 ';  
SMTP_STRING_VRFY_SUCCESS = '250 ';  
SMTP_STRING_BEGIN_DATA_SUCCESS = '354 ';  
SMTP_STRING_END_DATA_SUCCESS = '250 ';  
SMTP_STRING_RSET_SUCCESS = '250 ';  
 
SMTP_STRING_WRITE_FAILURE = '451 ';  
SMTP_STRING_COMMAND_FAILURE = '500 ';  
SMTP_STRING_SYNTAX_FAILURE = '501 ';  
SMTP_STRING_LOGON_FAILURE = '501 ';  
SMTP_STRING_SEQUENCE_FAILURE = '503 ';  
SMTP_STRING_AUTH_FAILURE = '504 ';  
SMTP_STRING_RCPT_FAILURE = '553 ';  
SMTP_STRING_VRFY_FAILURE = '550 ';  
SMTP_STRING_SIZE_FAILURE = '552 ';  
SMTP_STRING_FORWARD_FAILURE = '551 ';  
SMTP_STRING_PERMISSION_FAILURE = '571 ';  
 
SMTP_STRING_CONN_OK = 'Ultibo SMTP server (version ' + ULTIBO_RELEASE_VERSION + ')';  
SMTP_STRING_HELO_OK = 'Ultibo SMTP server - Hello, ';  
SMTP_STRING_EHLO_HEAD_OK = 'Ultibo SMTP server - Hello ';  
SMTP_STRING_EHLO_TAIL_OK = '; ESMTPs are: ';  
SMTP_STRING_AUTH_OK = 'Authenticated OK';  
SMTP_STRING_MAIL_OK = 'Sender OK - send RCPTs';  
SMTP_STRING_MAIL_SIZE_HEAD_OK = 'Sender and size (';  
SMTP_STRING_MAIL_SIZE_TAIL_OK = ') OK - send RCPTs';  
SMTP_STRING_RCPT_OK = 'Recipient OK - send RCPT or DATA';  
SMTP_STRING_VRFY_OK = 'OK - ';  
SMTP_STRING_BEGIN_DATA_OK = 'OK, send data, end with CRLF.CRLF';  
SMTP_STRING_END_DATA_OK = 'Data received OK';  
SMTP_STRING_RSET_OK = 'Command processed OK';  
SMTP_STRING_QUIT_OK = 'Ultibo SMTP server closing connection';  
SMTP_STRING_TIME_OK = 'Time is ';  
SMTP_STRING_NOOP_OK = 'OK';  
 
SMTP_STRING_BAD_COMMAND = 'Command unrecognized';  
SMTP_STRING_BAD_SYNTAX = 'Bad syntax in command';  
SMTP_STRING_BAD_SEQUENCE = 'Bad sequence of commands';  
SMTP_STRING_BAD_AUTH = 'Unrecognized authentication type';  
SMTP_STRING_BAD_LOGON = 'Authentication failed';  
SMTP_STRING_BAD_MAIL = 'Unknown sender';  
SMTP_STRING_BAD_RCPT = 'Unknown recipient';  
SMTP_STRING_BAD_VRFY = 'Mailbox not found';  


SMTP logging SMTP_LOG_*
SMTP_LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG; SMTP debugging messages
SMTP_LOG_LEVEL_INFO = LOG_LEVEL_INFO; SMTP informational messages
SMTP_LOG_LEVEL_WARN = LOG_LEVEL_WARN; SMTP warning messages
SMTP_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR; SMTP error messages
SMTP_LOG_LEVEL_NONE = LOG_LEVEL_NONE; No SMTP messages


Type definitions



SMTP client notify event

TSMTPClientNotifyEvent = procedure(const ARequest:String) of Object;

SMTP host event

TSMTPHostEvent = function(AConnection:TSMTPConnection):Boolean of Object;

SMTP count event

TSMTPCountEvent = function(AConnection:TSMTPConnection):Boolean of Object;

SMTP notify event

TSMTPNotifyEvent = procedure(AConnection:TSMTPConnection; const ARequest:String) of Object;

SMTP request event

TSMTPRequestEvent = function(AConnection:TSMTPConnection; const ARequest:String; var AReply:String):Boolean of Object;

SMTP authenticate event

TSMTPAuthenticateEvent = function(AConnection:TSMTPConnection; const AMethod,AUsername,APassword:String; var AReply:String):Boolean of Object;

SMTP connection event

TSMTPConnectionEvent = procedure(AConnection:TSMTPConnection) of Object;


Class definitions



SMTP helper classes

TSMTPBuffer = class(TObject)

SMTP client classes

TSMTPClient = class(TWinsock2TCPClient)

SMTP server classes

TSMTPConnection = class(TListObject)
TSMTPListener = class(TWinsock2TCPListener)


Public variables



SMTP logging

SMTP_DEFAULT_LOG_LEVEL:LongWord = SMTP_LOG_LEVEL_DEBUG; Minimum level for SMTP messages. Only messages with level greater than or equal to this will be printed.
SMTP_LOG_ENABLED:Boolean;


Function declarations



Initialization functions

procedure SMTPInit;
Description: To be documented
Note None documented


SMTP helper functions

procedure SMTPLog(Level:LongWord; const AText:String);
Description: To be documented
Note None documented


procedure SMTPLogInfo(const AText:String); inline;
Description: To be documented
Note None documented


procedure SMTPLogWarn(const AText:String); inline;
Description: To be documented
Note None documented


procedure SMTPLogError(const AText:String); inline;
Description: To be documented
Note None documented


procedure SMTPLogDebug(const AText:String); inline;
Description: To be documented
Note None documented


Return to Unit Reference