127 lines
3.1 KiB
ObjectPascal
127 lines
3.1 KiB
ObjectPascal
Unit m_TCP_Client_SMTP;
|
|
|
|
{$I M_OPS.PAS}
|
|
|
|
Interface
|
|
|
|
Uses
|
|
Classes,
|
|
m_Strings,
|
|
m_DateTime,
|
|
m_Crypt,
|
|
m_IO_Sockets,
|
|
m_TCP_Client;
|
|
|
|
Type
|
|
TSMTPClient = Class(TTCPClient)
|
|
ServerID : String;
|
|
FromAddr : String[60];
|
|
FromName : String[60];
|
|
ToAddr : String[60];
|
|
ToName : String[60];
|
|
Subject : String;
|
|
MsgText : TStringList;
|
|
Opened : Boolean;
|
|
|
|
Constructor Create (NetI: String); Override;
|
|
Destructor Destroy; Override;
|
|
Function OpenConnection (HostName: String) : Boolean;
|
|
Function Authenticate (AuthType: Byte; Login, Password: String) : Boolean;
|
|
Function SendMessage : Boolean;
|
|
End;
|
|
|
|
Implementation
|
|
|
|
Constructor TSMTPClient.Create (NetI: String);
|
|
Begin
|
|
Inherited Create(NetI);
|
|
|
|
MsgText := TStringList.Create;
|
|
Opened := False;
|
|
End;
|
|
|
|
Destructor TSMTPClient.Destroy;
|
|
Begin
|
|
MsgText.Free;
|
|
|
|
If Opened Then
|
|
Client.WriteLine('QUIT');
|
|
|
|
Inherited Destroy;
|
|
End;
|
|
|
|
Function TSMTPClient.OpenConnection (HostName: String) : Boolean;
|
|
Var
|
|
Port : Word;
|
|
Begin
|
|
Result := False;
|
|
|
|
Port := strS2I(strWordGet(2, HostName, ':'));
|
|
|
|
If Port = 0 Then Port := 25;
|
|
|
|
If Connect(strWordGet(1, HostName, ':'), Port) Then
|
|
If GetResponse = 220 Then Begin
|
|
Result := SendCommand('EHLO ' + ServerID) = 250;
|
|
|
|
If Not Result Then
|
|
Result := SendCommand('HELO ' + ServerID) = 250;
|
|
End;
|
|
End;
|
|
|
|
Function TSMTPClient.Authenticate (AuthType: Byte; Login, Password: String) : Boolean;
|
|
// 0=None, 1=Login, 2=Plain, 3=CRAM-MD5
|
|
Var
|
|
Str : String;
|
|
Count : Byte;
|
|
Begin
|
|
Result := False;
|
|
|
|
Case AuthType of
|
|
0 : Result := True;
|
|
1 : If SendCommand('AUTH LOGIN') = 334 Then
|
|
If SendCommand(B64Encode(Login)) = 334 Then
|
|
Result := SendCommand(B64Encode(Password)) = 235;
|
|
2 : Result := SendCommand('AUTH PLAIN ' + B64Encode(Login + #0 + Login + #0 + Password)) = 235;
|
|
3 : If SendCommand('AUTH CRAM-MD5') = 334 Then Begin
|
|
Str := B64Decode(Copy(ResponseStr, 5, 255));
|
|
Str := B64Encode(Login + ' ' + Digest2String(HMAC_MD5(Str, Password)));
|
|
Result := SendCommand(Str) = 235;
|
|
End;
|
|
End;
|
|
End;
|
|
|
|
Function TSMTPClient.SendMessage : Boolean;
|
|
|
|
Function NameStr (SN, SA: String) : String;
|
|
Begin
|
|
If SN <> '' Then
|
|
Result := '"' + SN + '" <' + SA + '>'
|
|
Else
|
|
Result := SA;
|
|
End;
|
|
|
|
Var
|
|
Count : LongInt;
|
|
Begin
|
|
Result := False;
|
|
|
|
If SendCommand('MAIL FROM:<' + FromAddr + '>') <> 250 Then Exit;
|
|
If SendCommand('RCPT TO:<' + ToAddr + '>') <> 250 Then Exit;
|
|
If SendCommand('DATA') <> 354 Then Exit;
|
|
|
|
Client.WriteLine('From: ' + NameStr(FromName, FromAddr));
|
|
Client.WriteLine('To: ' + NameStr(ToName, ToAddr));
|
|
Client.WriteLine('Date: ' + DayString[DayOfWeek(CurDateDos)] + ', ' + FormatDate(CurDateDT, 'DD NNN YYYY HH:II:SS'));
|
|
Client.WriteLine('Subject: ' + Subject);
|
|
Client.WriteLine('');
|
|
|
|
For Count := 0 to MsgText.Count - 1 Do
|
|
Client.WriteLine (MsgText.Strings[Count]);
|
|
|
|
Client.WriteLine('.');
|
|
|
|
Result := GetResponse = 250;
|
|
End;
|
|
|
|
End. |