通过SMTPClient向MS Exchange发送和接收邮件

时间:2015-10-08 00:21:50

标签: c# ssl exchange-server smtpclient

所以我一直在敲我的头几天,尝试尽可能多的解决方案......所有这些都让我接近,但最后我遇到了同样的障碍。 (我认为所有这些都与根本问题相关)

我试图重写一个可以做一些事情的过程,但是我遇到问题的部分是通过MS Exchange发送和接收电子邮件。我使用标准SmtpClient发送并阅读交换需要SSL并连接到默认端口25,用于显式SSL,启动时未加密,然后发出STARTDLS,然后切换到加密连接:RFC 2228),但不支持隐式SSL。那么这会让我离开?我没有成功尝试过基于openssl的stunnel之类的一些端口中继,但是那些似乎也不起作用(尽管我确定在这种情况下没有超过代理... < / p>

那么......到目前为止我做了什么: 当我不在网络(即家庭)时,我可以通过我的Gmail发送邮件,没有任何问题。但是,当在网络上(办公室或VPN)时,我不再能够发送邮件并且错误: An attempt was made to access a socket in a way forbidden by its access permissions xxx.xxx.xxx.xxx:587 (我已经尝试了其他所有端口产生的相同的错误或超时错误)

当我尝试发送到我们的MS Exchange服务器时(显然在网络上)我收到以下错误: No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:587 (我尝试了其他所有端口产生相同的错误或者超时错误)

在我的环境中结合一些事情(有一个互联网代理服务器连接到VPN或网络上所有流量都通过8080和80通过(我确定还有更多的端口) 有了这个,我还没有找到一种方法来连接和验证代理并使用其连接状态来发送或接收邮件) 我当前的邮件客户端(Outlook)在VPN或网络上运行得很好,并查看其设置的帐户配置,使用代理,如下所示:

Proxy enabled for HTTP

Proxy Settings

以下是我目前测试的内容:

任何建议都会令人惊叹!

    static void Main(string[] args)
    {

        string server = "smtp.gmail.com";       //-- > or exchange server "mxserver@mydomain.com"
        int port = 25;                          // --> tried 25, 443, 587 110...ect
        string mailbox = "user@gmail.com";
        string password = "mypassword";
        string recipient = "user@gmail.com";


        try
        {
            Console.WriteLine("Step 1: Attempting to Connect to server: {0} over port: {1}", server, port);
            using (var client = new TcpClient(server, port))
            {
                using (var stream = client.GetStream())
                using (var clearTextReader = new StreamReader(stream))
                using (var clearTextWriter = new StreamWriter(stream) { AutoFlush = true })
                using (var sslStream = new SslStream(stream))
                {
                    var helloResponse = clearTextReader.ReadLine();
                }

            }


        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.Message);
            Console.WriteLine("The Process has ended... Press any key to exit.");
            Console.ReadLine();
            return;
        }
        Console.WriteLine("Result: Success! Connected to server:{0}.", server);

        try
        {
            Console.WriteLine("Step 2: Attempting Send Mail...", server);
            using (SmtpClient smtpClient = new SmtpClient(server, port))
            {
                NetworkCredential creds = new NetworkCredential(mailbox, password);
                smtpClient.EnableSsl = true;
                ServicePointManager.ServerCertificateValidationCallback = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
                smtpClient.Credentials = creds;
                MailMessage msg = new MailMessage(mailbox, recipient, "Test", "This is a test");
                smtpClient.Send(msg);
                Console.WriteLine("Result: Success! Mail sent...");

            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.WriteLine("The Process has ended... Press any key to exit.");
        Console.ReadLine();
    }

注意:此代码适用于通过gmail发送邮件(网络外即VPN或办公室网络),但不在VPN或办公室时发送邮件),这告诉我这个过程无法通过的问题如果您查看交换帐户设置,则需要网络代理才能发送或接收邮件。 也许我在这里遗漏了一些东西,但即使在实施其他人认为对他们有用的确切代码时,我也不会这样做。

更新

通过wireshark对数据包数据进行跟踪,发现了这一点。

307 38.853709000    xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx HTTP    354 HTTP/1.1 407 Proxy Authentication Required ( Forefront TMG requires authorization to fulfill the request. Access to the Web Proxy filter is denied.  )  (text/html)

308 38.937293000    xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx HTTP    637 HTTP/1.1 407 Proxy Authentication Required ( Access is denied.  ) , NTLMSSP_CHALLENGE

因此;返回的错误有利于无法通过代理连接...现在面临如何以编程方式这样做?

0 个答案:

没有答案