/// <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();
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }