// Copyright (c) 2010 Martin Knafve / hMailServer.com. // http://www.hmailserver.com #pragma once namespace HM { class Message; class MessageRecipient; class RuleResult; class ServerInfo; class HostNameAndIpAddress; class ExternalDelivery { public: ExternalDelivery(const String &sSendersIP, std::shared_ptr message, const RuleResult &globalRuleResult); ~ExternalDelivery(void); bool Perform(std::vector &saErrorMessages); private: void DeliverToSingleDomain_(std::vector > &vecRecipients, std::shared_ptr serverInfo); void DeliverToSingleServer_(std::vector > &vecRecipients, std::shared_ptr serverInfo); bool ResolveRecipientServers_(std::shared_ptr &serverInfo, std::vector > &vecRecipients, std::vector &saMailServers); bool RecipientWithNonFatalDeliveryErrorExists_(std::vector > &vecRecipients); void HandleExternalDeliveryFailure_(std::vector > &vecRecipients, bool bIsFatal, String &sErrorString); void HandleNoRecipientServers_(std::vector > &vecRecipients, bool bDNSQueryOK, bool isSpecificRelayServer); void CollectDeliveryResult_(const String &serverHostName, std::vector > &vecRecipients, std::vector &saErrorMessages, std::map &mapFailedDueToNonFatalError); bool RescheduleDelivery_(std::map &mapFailedDueToNonFatalError, std::vector &saErrorMessages); // Type changed from void to bool for use with ETRN. // Function not called anywhere else to matter bool GetRetryOptions_(std::map &mapFailedDueToNonFatalError, long &lNoOfRetries, long &lMinutesBetween); IPAddress GetLocalAddress_(); const String &_sendersIP; const std::shared_ptr original_message_; const RuleResult &_globalRuleResult; int quick_retries_; int quick_retries_Minutes; int queue_randomness_minutes_; int mxtries_factor_; }; }