c#通过exchange 2K7用smtp发送邮件
本文关键字:smtp 通过 exchange 2K7 | 更新日期: 2023-09-27 18:14:24
以下代码在通过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)
找到了一个很好的解决方案。不要尝试在exchange 2K7及更高版本上使用smtp。请使用EWS (Exchange Web Services)。
步骤如下:
- 从http://www.microsoft.com/download/en/details.aspx?id=13480下载EWS管理API
- 在你的项目中添加对Microsoft.Exchange.WebServices.dll的引用。您可以在C:'Program Files (x86)'Microsoft'Exchange'Web Services'1.1 中找到它。
使用下面的示例代码作为参考。
使用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();
希望对你有帮助。
即兴发挥,看起来你做的每件事都是正确的。我有两个建议是暗箱操作,但你可能需要仔细研究一下:
由于您得到: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 ...
,我将不得不假设Exchange服务器在解释它正在接收的数据包时遇到问题。
1)这可能是由于SSL加密。我会再次确认你是否需要SSL。您可以在不使用SSL的情况下发送用户名和密码(尽管不推荐这样做)。这将是一个糟糕的服务器设置,但这可能超出了您的控制范围。
2)你也在做一个证书验证回调。这是一个额外的SMTP验证层,可能与SSL数据包冲突。不用那条线你能发邮件吗?