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

C# 通过exchange服务器发送电子邮件问题。(system.net.mail与microsoft.exchange.webservices),c#,asp.net,exchange-server,C#,Asp.net,Exchange Server,我正在为我的公司开发一个web应用程序。其中一部分要求内部用户填写表单,并代表该用户发送电子邮件。这一切都在公司内部。我搜索并找到了两个可能的路由:旧的system.net.mail和最近的microsoft.exchange.webservices,但我们的exchange服务器似乎需要凭据。我只能获得该用户的登录名及其电子邮件地址登录名+“@company.com”。我怎样才能做到这一点 下面是我使用smtp(system.net.mail)的代码,但它不起作用 st

我正在为我的公司开发一个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); 
string[]username=System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\');
字符串email=username[1]+“@company.com”;
MailAddress from=新邮件地址(电子邮件);
MailAddress to=新邮件地址(“someone@company.com");
MailMessage=新的MailMessage(从,到);
message.Subject=“testmail”;
message.Body=“testmail”;
message.IsBodyHtml=true;
SmtpClient=新的SmtpClient();
client.DeliveryMethod=SmtpDeliveryMethod.Network;
客户端。发送(消息);

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

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

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

2) 作为进程运行的用户(在web应用程序中,IIS的应用程序池标识)必须具有作为相关用户发送邮件的权限

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


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

Hi Dana,您的评论非常有用。我尝试设置SMTP,如下所示:SmtpClient=newsmtpclient(“10.21.80.174”);client.DeliveryMethod=SmtpDeliveryMethod.Network;client.UseDefaultCredentials=true;client.enablesl=true;但它仍然不起作用。知道为什么吗?client.UseDefaultCredentials将与EWS一样,发送运行进程/线程的凭据。因此,在web应用程序中,默认情况下,这将是一些无特权的IIS应用程序池标识,或者可能是一个服务帐户(如果它是这样配置的)。无论哪种方式,都是该帐户被发送到SMTP。因此,与EWS一样,您必须提供网络凭据(即密码)或允许IIS身份通过SMTP发送的权限。谢谢Dana。我想这回答了我的问题。