{
MegaBrutal's SMTP Server (MgSMTP)
- Copyright (C) 2010-2014 MegaBrutal
+ Copyright (C) 2010-2015 MegaBrutal
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
SpoolConfig: TSpoolConfig;
SpoolFilters: TSpoolFilters;
function DeliverLocalMessage(SpoolObject: TSpoolObjectReader; MailboxPtr: pointer; ReturnPath, Recipient: string): integer;
- procedure DeliverRelayMessage(SpoolObject: TSpoolObjectReader; Relayer: TRelayer);
+ function DeliverRelayMessage(SpoolObject: TSpoolObjectReader; Relayer: TRelayer): boolean;
procedure HandleFailure(SpoolObject: TSpoolObjectReader; IsLocal: boolean; FailEnvelope: TEnvelope; FailedRecipient: TRecipient; AddStatus: integer; FailMsg: string);
procedure HandleDeliveryResults(SpoolObject: TSpoolObjectReader; IsLocal: boolean; Envelope, FailEnvelope: TEnvelope; AddStatus: integer; FailMsg: string);
procedure CreateBounceMessage(SourceSpoolObject: TSpoolObjectReader; FailEnvelope: TEnvelope);
R:= Mailbox^.DeliverMessagePart(LockID, Chunk);
end;
if R then begin
- if Mailbox^.FinishDeliverMessage(LockID) then begin
- Result:= 0;
- { It's better to set in Execute. }
- {SpoolObject.QuickSetDeliveryStatus(Recipient, DS_DELIVERED);}
- end
+ if Mailbox^.FinishDeliverMessage(LockID) then
+ Result:= 0
else
Result:= 4;
end
Result:= 1;
end;
-procedure TDeliveryThread.DeliverRelayMessage(SpoolObject: TSpoolObjectReader; Relayer: TRelayer);
+function TDeliveryThread.DeliverRelayMessage(SpoolObject: TSpoolObjectReader; Relayer: TRelayer): boolean;
+{ Relay message to remote server.
+ Returns true if the transaction went through (doesn't necessarily mean
+ that the message was actually accepted). }
var Headers, Chunk: TStrings; R: boolean;
begin
if Relayer.PrepareSendMessage then begin
Chunk:= TStringList.Create;
{ Leave a line between the headers and the body. }
Headers.Add('');
+
R:= Relayer.DeliverMessagePart(Headers);
while (not SpoolObject.IsEOF) and R do begin
- { Maybe constant "32" should be configurable? }
+ { Maybe constant "64" should be configurable? }
Chunk.Clear;
- SpoolObject.ReadChunk(Chunk, 32);
+ SpoolObject.ReadChunk(Chunk, 64);
R:= Relayer.DeliverMessagePart(Chunk);
end;
if R then begin
end
else
SpoolObject.SetDeliveryStatus(false, Relayer.Envelope, DS_DELAYED or DS_CONNECTIONFAIL);
+
+ Result:= R;
Chunk.Free;
Headers.Free;
- end;
+ end
+ else Result:= false;
end;
function TDeliveryThread.NeedSendReport(SpoolObject: TSpoolObject): boolean;
if Relayer.Greet then
if Relayer.SendEnvelope then
DeliverRelayMessage(SpoolObject, Relayer);
+
+ AssignDeliveryStatusToSMTPCodes(CurrEnv, Relayer.IsTransactionComplete);
Relayer.CloseConnection;
Relayer.Free;
- AssignDeliveryStatusToSMTPCodes(CurrEnv);
HandleDeliveryResults(SpoolObject, false, CurrEnv, FailEnv, 0, '');
end
else begin