mysticbbs/mdl/m_tcp_client_smtp.pas

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.