質問

gmailのsmtpサーバーでC#を使用して電子メールを送信しようとすると、このエラーが表示されます。

"検証手順に従って、リモート証明書は無効です。

SSLが有効になっています

使用ポートは587

使用されるサーバー名は" Smtp.gmail.com"です。

ユーザー名とパスワードが正しい

outlook expressは同じPCで同じ設定で正常に動作します

c#プログラムは他の場所でも正常に動作します...このエラーはクライアントの場所でのみ発生します。

ご協力いただければ幸いです。

ありがとう

編集:@Andomar、クライアントのルート証明書はどこにありますか?これを修正するにはどうすればよいですか?

@ Alnitak、System.Net.Mailライブラリを使用してstarttlsを発行するにはどうすればよいですか

@ David、"(オブジェクト送信者、X509Certificate証明書、X509Chainチェーン、SslPolicyErrors sslPolicyErrors)"のパラメーターとして渡すもの

デビッドに感謝します。これらの行を追加しました。しかし、私が理解している限り、このコードはSystem.Net.Mailと直接接続されていないため、何が起こっているのかまだ混乱しています。問題がなくなることを期待してください。

役に立ちましたか?

解決

ルート証明書がクライアントの信頼されたルート認証局ストアにあることも確認してください。これがサービスからのものである場合、ルート証明書をローカルマシンストアに追加することも役立ちます。理由をよりよく把握するために、次のポリシーが役立つことがわかりました...

public bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// No errors so continue…
if (sslPolicyErrors == SslPolicyErrors.None)
       return true;

// I’m just logging it to a label on the page, 
//  this should be stored or logged to the event log at this time. 
lblStuff.Text += string.Format("Certificate error: {0} <BR/>", sslPolicyErrors);

// If the error is a Certificate Chain error then the problem is
// with the certificate chain so we need to investigate the chain 
// status for further info.  Further debug capturing could be done if
// required using the other attributes of the chain.
      if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
      {
       foreach (X509ChainStatus status in chain.ChainStatus)
       {
             lblStuff.Text += string.Format("Chain error: {0}: {1} <BR/>", status.Status, status.StatusInformation);
  }
}

// Do not allow this client to communicate 
//with unauthenticated servers.
      return false;
}

ポリシーを追加するには、次を使用します。これは、アプリケーションドメインに対して1回だけ実行する必要があります。

using System.Net;
...
ServicePointManager.ServerCertificateValidationCallback =
new Security.RemoteCertificateValidationCallback(ValidateServerCertificate);

ポリシーを使用してエラーを完全に削除することもできますが、それを行うよりも問題を修正することをお勧めします。

他のヒント

適切なルート証明書がクライアントのストアにあるかどうかを確認します。そして、クライアントのシステム日付は正しいです。

STARTTLS を使用していますか、またはポート587の接続が最初からSSL暗号化されていると想定していますか?

smtp.gmail.com 上のGoogleのサーバーにはSTARTTLSが必要です。

設定しましたか

 client.EnableSsl = true;

Gmailで必要なため

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top