System.Net.Mail.SMTPClient如何执行其本地IP绑定

时间:2010-03-23 17:47:50

标签: c# sockets email

我们有一个负载均衡(NLB)ASP.NET Web应用程序,可以发送电子邮件。

服务器是双归属的,面向外部,内部(防火墙后面)面向IP。邮件服务器位于防火墙后面。

我们一直在遇到一个问题,即SMTPClient类会抛出一个异常,指出它无法连接到SMTP服务器。

网络人员告诉我们他们正在尝试从面向外部的IP地址(防火墙阻止的IP地址)连接到SMTP服务器

从我对网络启用的应用程序的认识(不可否认)我认为本地IP绑定将根据目的地决定,即如果路由表说IP地址可以通过特定的NIC访问而不是IP出站请求是从。生成的。我错了吗?

查看SmtpClient.ServicePoint我开始认为我们可能会(并且应该)强制显式绑定到特定的IP?

特别是我一直在看着 ServicePoint.BindIPEndPointDelegate Property  从该页面......

  

备注:一些负载均衡技术   要求客户使用特定的   本地IP地址和端口号,   而不是IPAddress.Any(或   IPAddress.IPv6Any for Internet   协议版本6)和短暂的   港口。你的BindIPEndPointDelegate可以   满足这个要求。

对我来说这似乎有点奇怪,我需要这样做,但也许在这种环境中很常见?

1 个答案:

答案 0 :(得分:4)

你需要做这样的事情......

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);
}