2

メールを送信するための非常に基本的なクラスを作成しました。私はsmtpサーバーでそれをテストしましたが、うまく動作しますが、会社の交換サーバーを使用しようとすると、次の例外が発生します:

SMTP サーバーが安全な接続を必要としているか、クライアントが認証されていません。サーバーの応答は次のとおりでした: 5.7.1 クライアントは認証されませんでした

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

MailMessage mailMessage = new MailMessage("From@company.com", "To@company.com", "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);

Exchange サーバーを smtp サーバーとは異なる方法で処理する必要がありますか?

アドバイスお願いします よろしくお願いします

4

4 に答える 4

3

正しいポート番号を使用していますか?

プロトコル: SMTP/SSL

・ポート(TCP/UDP):465(TCP)

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

ここからリッピング: http://www.petri.co.il/ports_used_by_exchange.htm

于 2012-05-10T18:26:31.820 に答える
1

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

于 2013-04-01T20:47:49.663 に答える
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();
    }
于 2012-05-10T19:02:23.677 に答える
0

Exchange を使用してメールを送信する方法に関するこの投稿を見つけました。彼は代わりに Microsoft.Exchange.WebServices 名前空間を使用しているようです。テストする取引所がありません。アイデアを出すだけ。

http://waqarsherbhatti.posterous.com/sending-email-using-exchange-server-2010-ews

于 2012-05-10T18:32:17.357 に答える