Skip to main content
 首页 » 编程设计

c# 通过 exchange 2K7 使用 smtp 发送邮件

2024年02月23日31soundcode

以下代码在通过 gmail 的 smtp 而不是通过 exchange 2K7 发送时有效。 在同一台机器上,我有 outlook express,它确实通过交换成功发送。 我在我的代码中使用与 outlook express 相同的配置,但不断收到错误消息:

The SMTP server requires a secure connection or the client was not authenticated. 
The server response was: 5.7.1 Client was not authenticated. 
Stack:    at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response) 
   at System.Net.Mail.MailCommand.Send ... 

SSL 设置为 true。

这是代码:

//create new MailMessage 
mailmessage = new MailMessage(definition.From, definition.To); 
mailmessage.ReplyToList.Add(definition.From); 
mailmessage.IsBodyHtml = true; 
mailmessage.SubjectEncoding = System.Text.Encoding.UTF8; 
mailmessage.BodyEncoding = System.Text.Encoding.UTF8; 
mailmessage.Subject = definition.Subject; 
mailmessage.Body = definition.Body; 
 
mailmessage = MessageBody.CompleteMessage(mailmessage, definition); 
 
//send MailMessage 
//get smtpclient 
SmtpClient smtp = null; 
 
if (smtp == null) 
{ 
//create, init 
smtp = new SmtpClient(definition.Server, definition.Port) 
{ 
    Credentials = new NetworkCredential(definition.Uid, definition.Pwd), 
    EnableSsl = definition.Ssl, 
    DeliveryMethod = SmtpDeliveryMethod.Network 
}; 
 
} 
ServicePointManager.ServerCertificateValidationCallback = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; 
smtp.Send(mailmessage); 

更新:当我取出回调线并尝试发送时,我得到了这个错误:

Exception: The remote certificate is invalid according to the validation procedure.. Stack:    at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception) 
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) 
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) 
   at System.Net.TlsStream.CallProcessAuthentication(Object state) 
   at System.Threading.ExecutionContext.runTryCode(Object userData) 
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
   at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result) 
   at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size) 
   at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size) 
   at System.Net.Mail.SmtpConnection.Flush() 
   at System.Net.Mail.ReadLinesCommand.Send(SmtpConnection conn) 
   at System.Net.Mail.EHelloCommand.Send(SmtpConnection conn, String domain) 
   at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint) 
   at System.Net.Mail.SmtpTransport.GetConnection(ServicePoint servicePoint) 
   at System.Net.Mail.SmtpClient.GetConnection() 
   at System.Net.Mail.SmtpClient.Send(MailMessage message) 

请您参考如下方法:

找到了一个很好的解决方案。不要尝试将 smtp 与 exchange 2K7 及更高版本一起使用。请改用 EWS(Exchange Web 服务)。

步骤是:

  1. 从 http://www.microsoft.com/download/en/details.aspx?id=13480 下载 EWS 托管 API
  2. 安装
  3. 将对 Microsoft.Exchange.WebServices.dll 的引用添加到您的项目中。你会在 C:\Program Files (x86)\Microsoft\Exchange\Web Services\1.1 中找到它
  4. 使用下面的示例代码作为引用。

    使用 Microsoft.Exchange.WebServices.Data;

    使用 System.Security.Cryptography.X509Certificates;

...

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1); 
 
service.Url = new Uri(@"https://"+[Your exchange computer name like: abc.domain.com]+"/EWS/Exchange.asmx");  
 
//if have the ip you can get the computer name using the nslookup utility in command line. ->nslookup 192.168.0.90  
 
ServicePointManager.ServerCertificateValidationCallback = 
                    delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) 
                    { 
                        return true; 
                    }; 
 
service.Credentials = new WebCredentials([User name: either email or domain account-but without the domain\], "password"); 
 
EmailMessage mailmessage = new EmailMessage(service); 
 
mailmessage.From="me@something.com"; 
 
mailmessage.ToRecipients.Add("someone@something.com"); 
 
mailmessage.Subject = "Hello"; 
 
mailmessage.Body = "World"; 
 
mailmessage.Body.BodyType = BodyType.HTML; //or text 
 
mailmessage.Send(); 

希望对你有帮助。