2012-05-10 8 views
1

メールを送信するための非常に基本的なクラスを作成しました。私はsmtpサーバーとそれが正常に動作することをテストしましたが、私はこの例外を与えて私の会社のExchangeサーバーを使用しようとするとき:smtpclientは交換サーバーでは機能しませんがsmtpサーバーで動作します

SMTPサーバーは、セキュリティで保護された接続が必要ですか、クライアントは認証されませんでした。サーバーの応答は:5.7.1クライアントは

を認証されなかった

私のコードは以下の通りです:

MailMessage mailMessage = new MailMessage("[email protected]", "[email protected]", "Test Subject", "Void body"); 
SmtpClient smtpClient = new SmtpClient(smtpServerAddress, smtpServerPort); 
NetworkCredential credentials = new NetworkCredential(AccountName,Password); 
smtpClient.UseDefaultCredentials = false; 
smtpClient.Credentials = credentials; 
smtpClient.EnableSsl = true; 
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
ServicePointManager.ServerCertificateValidationCallback = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; // without this I get: The remote certificate is invalid according to the validation procedure. 
smtpClient.Send(mailMessage); 

私は、SMTPサーバーとは異なるExchangeサーバーを処理する必要があります。

おかげ

+1

ほとんどの場合、Exchangeサーバーでは、使用するためにいくつかの構成が必要です。このようなエラーが発生する可能性があるいくつかのことがあります。 (SMTPパススルーを有効にしない、どのサーバー/ユーザーがパススルーを使用できるかなどの設定ルール)。これはおそらくServerFault.comの方が適しています。エラーを検出すると、Exchangeサーバーの構成を変更することで解決できます。 http://smtp25.blogspot.com/2009/04/530-571-client-was-not-authenticated.html – David

+0

smtpServerPortの値は何ですか? –

+0

25(デフォルトポート) – Ali

答えて

2

あなたが右のポート番号を使用していることをアドバイスしてください?

プロトコル:SMTP/SSLポート(TCP/UDP)•

:465(TCP)

•説明:SMTP over SSLの。 TCPポート465は、SSL プロトコルを使用してセキュリティで保護されたSMTP通信を行う業界の慣行 によって予約されています。ただし、IMAP4、POP3、NNTP、およびHTTPとは異なり、 のExchange 2000では、セキュリティで保護された通信に別のポートを使用しません。 (SSL)ではなく、 トランスポートレイヤセキュリティと呼ばれる "帯域内セキュリティサブシステム" (TLS)。 Exchange 2000でTLSを有効にするには、Exchange 2000 サーバーにコンピュータ証明書をインストールする必要があります。

ここからリッピング

http://www.petri.co.il/ports_used_by_exchange.htm

+0

しかし、私はOutlookを使用してそのExchangeサーバーを使用することができます..任意のアイデア? – Ali

+0

クライアント側のプロキシ(Fiddlerのような)またはWireSharkを取得し、あなたのボックスと交換サーバーの間の通信をトラップします。これにより、会話中に使用されているポートがわかります。 –

0

あなたはWebDAVを使用して送信してくださいすることをお勧めします。あなたはそれを試してみたい場合はここで私はこの問題を抱えていた

public static void ViaWebDav(String sMailbox, String sExchange, String sTo, String sCc, String sSubject, String sBody, params String[] sAttachments) 
    { 
     HttpWebRequest hwrOut; 
     HttpWebResponse hwrIn; 

     //String strServer = "SXGM-202.xxx.com"; 
     //string strPassword = "123"; 
     //string strUserID = "u"; 
     //string strDomain = "fg"; 


     Byte[] b = null; 
     Stream s = null; 



     String sMailboxUrl = "http://" + sExchange + "/exchange/" + sMailbox; 

     String sMailboxSend = sMailboxUrl + "/##DavMailSubmissionURI##/"; 

     String sMailboxTemp = sMailboxUrl + "/drafts/" + sSubject + ".eml"; 

     // Construct the RFC 822 formatted body of the PUT request. 
     // Note: If the From: header is included here, 
     // the MOVE method request will return a 
     // 403 (Forbidden) status. The From address will 
     // be generated by the Exchange server. 
     StringBuilder sb = new StringBuilder(); 
     sb.AppendLine("To: " + sTo); 
     if (!sCc.IsEmpty()) sb.AppendLine("Cc: " + sCc); 
     sb.AppendLine("Subject: " + sSubject); 
     sb.AppendLine("Date: " + System.DateTime.Now); 
     sb.AppendLine("X-Mailer: AML FIU;"); 
     sb.AppendLine("MIME-Version: 1.0;"); 
     sb.AppendLine("Content-Type: text/plain;"); 
     sb.AppendLine("Charset = \"iso-8859-1\""); 
     sb.AppendLine("Content-Transfer-Encoding: 7bit;"); 
     sb.AppendLine(); 
     sb.AppendLine(sBody); 

     // Create a new CredentialCache object and fill it with the network 
     // credentials required to access the server. 
     //MyCredentialCache = new CredentialCache(); 
     //MyCredentialCache.Add(new System.Uri(strMailboxURI), 
     // "NTLM", 
     // new NetworkCredential(strUserID, strPassword, strDomain) 
     // ); 

     // Create the HttpWebRequest object. 
     hwrOut = (HttpWebRequest)HttpWebRequest.Create(sMailboxTemp); 
     hwrOut.Credentials = CredentialCache.DefaultCredentials; 
     hwrOut.Method = "PUT"; 
     hwrOut.ContentType = "message/rfc822"; 

     // Encode the body using UTF-8. 
     b = Encoding.UTF8.GetBytes(sb.ToString()); 

     hwrOut.ContentLength = b.Length; 


     s = hwrOut.GetRequestStream(); 
     s.Write(b, 0, b.Length); 
     s.Close(); 

     // PUT the message in the Drafts folder of the mailbox. 
     hwrIn = (HttpWebResponse)hwrOut.GetResponse(); 


     #region //ATTACHMENTS 
     //Do the PROPPATCH 
     sb = new StringBuilder(); 
     sb.Append("<?xml version='1.0'?>"); 
     sb.Append("<d:propertyupdate xmlns:d='DAV:'>"); 
     sb.Append("<d:set>"); 
     sb.Append("<d:prop>"); 
     sb.Append("<isCollection xmlns='DAV:'>False</isCollection>"); 
     sb.Append("</d:prop>"); 
     sb.Append("</d:set>"); 
     sb.Append("</d:propertyupdate>"); 

     foreach (String sAttach in sAttachments) 
     { 
      hwrOut = (HttpWebRequest)HttpWebRequest.Create(sMailboxTemp); 
      hwrOut.Credentials = CredentialCache.DefaultCredentials; 
      hwrOut.Method = "PROPPATCH"; 
      hwrOut.ContentType = "text/xml"; 
      hwrOut.Headers.Set("Translate", "f"); 

      b = Encoding.UTF8.GetBytes(sb.ToString()); 

      hwrOut.ContentLength = b.Length; 

      s = hwrOut.GetRequestStream(); 
      s.Write(b, 0, b.Length); 
      s.Close(); 

      hwrIn = (HttpWebResponse)hwrOut.GetResponse(); 


      hwrOut = (HttpWebRequest)HttpWebRequest.Create(sMailboxTemp + "/" + Path.GetFileName(sAttach)); 
      hwrOut.Credentials = CredentialCache.DefaultCredentials; 
      hwrOut.Method = "PUT"; 

      using (FileStream fs = new FileStream(sAttach, FileMode.Open, FileAccess.Read)) 
      { 
       b = new Byte[fs.Length]; 

       fs.Read(b, 0, (Int32)fs.Length); 
      } 

      hwrOut.ContentLength = b.Length; 

      s = hwrOut.GetRequestStream(); 
      s.Write(b, 0, b.Length); 
      s.Close(); 

      hwrIn = (HttpWebResponse)hwrOut.GetResponse(); 
     } 
     #endregion 



     // Create the HttpWebRequest object. 
     hwrOut = (HttpWebRequest)HttpWebRequest.Create(sMailboxTemp); 
     hwrOut.Credentials = CredentialCache.DefaultCredentials; 
     hwrOut.Method = "MOVE"; 
     hwrOut.Headers.Add("Destination", sMailboxSend); 

     hwrIn = (HttpWebResponse)hwrOut.GetResponse(); 

     // Clean up. 
     hwrIn.Close(); 
    } 
1

..私の方法です。交換サーバーでExchangeシステムマネージャを開き、オブジェクトツリーをサーバーに開き、プロトコルを開き、既定のSMTP仮想サーバーを右クリックしてプロパティを選択します。アクセスタブをクリックし、認証ボタンをクリックします。最後に、ユーザーをクリックして、使用しているユーザーがSMTPリレーにアクセスできることを確認します。さらに、SMTPの下にあるリレーボタンをまだ選択していない場合は、アプリケーションを実行しているマシンがブラックリストに登録されていないこと、または許可が与えられていることを確認してください。