通过Exchange服务器问题发送电子邮件。 (system.net.mail vs microsoft.exchange.webservices)

时间:2013-02-14 18:26:06

标签: c# asp.net exchange-server

我正在为我的公司开发一个Web应用程序。部分内容需要内部用户填写表单,并代表该用户发送电子邮件。这都在公司内部。我搜索并发现两个可能的路由旧system.net.mail和一个更新的microsoft.exchange.webservices,但似乎我们的Exchange服务器需要凭据。我只能获得用户的登录信息和他的电子邮件地址登录+“@ company.com”。我怎么能这样做?

以下是我使用smtp(system.net.mail)的代码,但它不起作用。

            string[] username =System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\');
            string email = username[1] + "@company.com";
            MailAddress from = new MailAddress(email);
            MailAddress to = new MailAddress("someone@company.com");
            MailMessage message = new MailMessage(from, to);                
            message.Subject = "testmail";
            message.Body = "<h>testmail</h>";
            message.IsBodyHtml = true;
            SmtpClient client = new SmtpClient();
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.Send(message); 

1 个答案:

答案 0 :(得分:2)

SmtpClient要求您直接指定SMTP服务器,或者您具有正确的应用程序/计算机配置设置,以便自动检测服务器。您的代码隐式选择第二个选项,我怀疑您在app / machine配置中没有正确的设置。 Exchange在默认配置中不支持SMTP,因此除非熟悉您的Exchange服务器的人知道配置了SMTP并且可以为您提供正确的地址,否则SmtpClient可能已经关闭。

Exchange Web Services(又名EWS)可能是您更好的答案,但它并不是一个好的答案。要使用Exchange Web服务,您需要以下其中一项:

1)用户的域,用户名和密码,以便您可以将正确的NetworkCredential传递给EWS。在您的情况下,这可能意味着用户必须在表单中输入密码,这可能会破坏您的要求。

2)进程正在运行的用户(在Web应用程序中,IIS的应用程序池标识)必须具有以相关用户身份发送邮件的权限。

3)如果您可以使用ASP.NET身份验证来模拟用户(这只是LAN应用程序中的一个好方法),那么您可以有效地回退到选项(2),因为现在您将与EWS作为用户,显然有权从他们自己的地址发送邮件。

如您所见,正确的方法在很大程度上取决于您的Exchange / Active Directory / LAN设置。