/// <summary> /// Ensure that domain recipients are KNOWN - i.e. registered with the Config System /// If not, remove them. /// </summary> /// <param name="message"></param> void VerifyDomainRecipientsRegistered(IncomingMessage message) { message.EnsureRecipientsCategorizedByDomain(this.SecurityAgent.Domains); if (!message.HasDomainRecipients) { throw new AgentException(AgentError.NoRecipients); } DirectAddressCollection recipients = message.DomainRecipients; if (this.Settings.MaxIncomingDomainRecipients > 0 && recipients.Count > this.Settings.MaxIncomingDomainRecipients) { throw new AgentException(AgentError.MaxDomainRecipients); } if (!m_settings.HasAddressManager) { // Address validation is turned off return; } Address[] resolved = m_configService.GetAddresses(recipients); if (resolved.IsNullOrEmpty()) { throw new AgentException(AgentError.NoDomainRecipients); } // Remove any addresses that could not be resolved // Yes, this is currently n^2, but given the typical # of addresses, cost should be insignificant int i = 0; while (i < recipients.Count) { DirectAddress recipient = recipients[i]; int iAddress = Array.FindIndex <Address>(resolved, x => x.Match(recipient)); if (iAddress >= 0) { ++i; // Found recipient.Tag = resolved[iAddress]; } else { recipients.RemoveAt(i); } } }
void Route(ISmtpMessage message, DirectAddressCollection recipients, DirectAddressCollection routedRecipients) { Dictionary <string, Route> matchedRoutes = new Dictionary <string, Route>(StringComparer.OrdinalIgnoreCase); int i = 0; // // First, find all routes that match // We'll remove recipients that were routed from the recipients list so // SMTP server does not itself try to deliver to them // while (i < recipients.Count) { DirectAddress recipient = recipients[i]; Address address = recipient.Tag as Address; if (address != null) { Route route = this[address.Type]; if (route != null) { matchedRoutes[address.Type] = route; recipients.RemoveAt(i); if (routedRecipients != null) { recipient.Tag = route.AddressType; // Reference for failed delivery routedRecipients.Add(recipient); // Add the routed recipient to the list } continue; } } ++i; } if (matchedRoutes.Count == 0) { return; } this.Route(message, matchedRoutes.Values); }