Как System.Net.Mail.SMTPClient выполняет локальную привязку IP - PullRequest
2 голосов
/ 23 марта 2010

У нас есть веб-приложение ASP.NET с балансировкой нагрузки (NLB), которое отправляет электронную почту.

Серверы имеют двойное размещение с внешней и внутренней (за брандмауэром) IP-адресацией. Почтовый сервер находится за брандмауэром.

Мы обнаружили проблему, когда класс SMTPClient выдает исключение, сообщающее, что он не может подключиться к SMTP-серверу.

Сетевые парни говорят нам, что они видят попытки подключиться к SMTP-серверу с внешнего IP-адреса (который блокирует межсетевой экран)

Исходя из моих (предположительно неоднозначных) знаний о приложениях с поддержкой сети, я подумал, что локальная привязка IP будет определяться на основе пункта назначения, т.е. если в таблицах маршрутизации указано, что IP-адрес может быть доступен через конкретную сетевую карту, а не IP исходящий запрос генерируется из. Я не прав?

глядя на SmtpClient.ServicePoint Я начинаю думать, что мы можем быть и что мы можем (должны) принудительно установить явную привязку к определенному IP?

В частности, я смотрел на
Свойство ServicePoint.BindIPEndPointDelegate с этой страницы ...

Замечания: некоторые методы балансировки нагрузки потребовать от клиента использования определенного локальный IP-адрес и номер порта, а не IPAddress.Any (или IPAddress.IPv6Any для интернета Протокол версии 6) и эфемерный порт. Ваш BindIPEndPointDelegate может удовлетворить это требование.

мне просто немного странно, что мне нужно это сделать, но, возможно, это обычное явление в такой среде?

1 Ответ

4 голосов
/ 07 августа 2010

Тебе нужно сделать что-то подобное ...

public delegate IPEndPoint BindIPEndPoint(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount);

private IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount) {
    if (retryCount < 3 && ddSendFrom.SelectedValue.Length > 0)
        return new IPEndPoint(IPAddress.Parse("192.168.1.100"), 0); //bind to a specific ip address on your server
    else
        return new IPEndPoint(IPAddress.Any, 0);
}

protected void btnTestMail_Click(object sender, EventArgs e) {
    MailMessage msg = new MailMessage();
    msg.Body = "Email is working!";
    msg.From = new MailAddress("me@me.com");
    msg.IsBodyHtml = false;
    msg.Subject = "Mail Test";
    msg.To.Add(new MailAddress("you@you.com"));

    SmtpClient client = new SmtpClient();
    client.Host = "192.168.1.1";
    client.Port = 25;
    client.EnableSsl = false;
    client.ServicePoint.BindIPEndPointDelegate = new System.Net.BindIPEndPoint(BindIPEndPointCallback);
    client.Send(msg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...