/// <summary> /// Is called when email domain target servers resolve operation has completed. /// </summary> /// <param name="to">RCPT TO: address.</param> /// <param name="op">Asynchronous operation.</param> /// <exception cref="ArgumentNullException">Is raised when <b>to</b> or <b>op</b> is null reference.</exception> private void EmailHostsResolveCompleted(string to, Dns_Client.GetEmailHostsAsyncOP op) { if (to == null) { throw new ArgumentNullException("to"); } if (op == null) { throw new ArgumentNullException("op"); } if (op.Error != null) { LogText("Failed to resolve email domain for email address '" + to + "' with error: " + op.Error.Message + "."); Dispose(op.Error); } else { StringBuilder buf = new StringBuilder(); foreach (HostEntry host in op.Hosts) { foreach (IPAddress ip in host.Addresses) { m_pTargets.Add(new Relay_Target(host.HostName, new IPEndPoint(ip, 25))); } buf.Append(host.HostName + " "); } LogText("Resolved to following email hosts: (" + buf.ToString().TrimEnd() + ")."); BeginConnect(); } op.Dispose(); }
/// <summary> /// Start processing relay message. /// </summary> /// <param name="state">User data.</param> internal void Start(object state) { try { if (m_pServer.Logger != null) { m_pSmtpClient.Logger = new Logger(); m_pSmtpClient.Logger.WriteLog += new EventHandler <WriteLogEventArgs>(SmtpClient_WriteLog); } LogText("Starting to relay message '" + m_pRelayItem.MessageID + "' from '" + m_pRelayItem.From + "' to '" + m_pRelayItem.To + "'."); // Resolve email target hosts. if (m_RelayMode == Relay_Mode.Dns) { Dns_Client.GetEmailHostsAsyncOP op = new Dns_Client.GetEmailHostsAsyncOP(m_pRelayItem.To); op.CompletedAsync += delegate(object s1, EventArgs <Dns_Client.GetEmailHostsAsyncOP> e1) { EmailHostsResolveCompleted(m_pRelayItem.To, op); }; if (!m_pServer.DnsClient.GetEmailHostsAsync(op)) { EmailHostsResolveCompleted(m_pRelayItem.To, op); } } // Resolve smart hosts IP addresses. else if (m_RelayMode == Relay_Mode.SmartHost) { string[] smartHosts = new string[m_pSmartHosts.Length]; for (int i = 0; i < m_pSmartHosts.Length; i++) { smartHosts[i] = m_pSmartHosts[i].Host; } Dns_Client.GetHostsAddressesAsyncOP op = new Dns_Client.GetHostsAddressesAsyncOP(smartHosts); op.CompletedAsync += delegate(object s1, EventArgs <Dns_Client.GetHostsAddressesAsyncOP> e1) { SmartHostsResolveCompleted(op); }; if (!m_pServer.DnsClient.GetHostsAddressesAsync(op)) { SmartHostsResolveCompleted(op); } } } catch (Exception x) { Dispose(x); } }