(Relay) Handle unexpected replies and disconnections adequately
[mgsmtp.git] / Common.pas
index 8e0b7fb443ffa93db0871a7522e42a007bbc40f6..76926728bcbeddd3042f36a2bca0ff8be1e73b50 100644 (file)
@@ -138,6 +138,7 @@ type
       procedure AddRecipient(Recipient: TRecipient); overload;
       procedure SetReturnPath(Address: string);
       procedure SetRecipientData(Index, Data: integer; RMsg: string = '');
+      procedure SetAllRecipientData(Data: integer; RMsg: string = '');
       procedure SetRelayHost(HostName: string);
       property ReturnPath: string read FReturnPath write SetReturnPath;
       property RelayHost: string read FRelayHost write SetRelayHost;
@@ -154,7 +155,7 @@ type
    function EMailTimeStamp(DateTime: TDateTime): string;
    function EMailTimeStampCorrected(DateTime: TDateTime): string;
    function StatusToStr(Status: integer): string;
-   procedure AssignDeliveryStatusToSMTPCodes(Envelope: TEnvelope);
+   procedure AssignDeliveryStatusToSMTPCodes(Envelope: TEnvelope; TransactionComplete: boolean);
 
    function CleanEOLN(S: string): string;
    function GenerateRandomString(Length: integer): string;
@@ -303,7 +304,7 @@ begin
       + '+' + IntToStr(Status and DS_SMTPREPLYMASK);
 end;
 
-procedure AssignDeliveryStatusToSMTPCodes(Envelope: TEnvelope);
+procedure AssignDeliveryStatusToSMTPCodes(Envelope: TEnvelope; TransactionComplete: boolean);
 var i, code, cond, status: integer; Recipient: TRecipient;
 begin
    for i:= 0 to Envelope.GetNumberOfRecipients - 1 do begin
@@ -312,7 +313,8 @@ begin
       cond:= code div 100;
       case cond of
          0: status:= DS_DELAYED or DS_UNEXPECTEDFAIL;
-         2: status:= DS_DELIVERED;
+         2: if TransactionComplete then status:= DS_DELIVERED
+            else status:= DS_DELAYED or DS_UNEXPECTEDFAIL;
          4: status:= DS_DELAYED;
          5: status:= DS_PERMANENT;
          else status:= DS_PERMANENT or DS_UNEXPECTEDFAIL;
@@ -658,6 +660,13 @@ begin
    FRecipients[Index].Data:= Data;
 end;
 
+procedure TEnvelope.SetAllRecipientData(Data: integer; RMsg: string = '');
+var i: integer;
+begin
+   for i:= 0 to Length(FRecipients) - 1 do
+      SetRecipientData(i, Data, RMsg);
+end;
+
 procedure TEnvelope.SetReturnPath(Address: string);
 begin
    FReturnPath:= Address;