1

lib poco と ssl 経由でメールを送信しようとしています。機能は私にとって十分であるため、非常に単純なサンプル コードを使用します。コードは機能しているので、彼にやってもらいたいのですが、残念ながら、メールを送信した後、CPU 負荷が 100% に上昇しました。これは毎回起こったので、コード内で間違いを犯したと思います。誰か私を助けるためのヒントを教えてくれませんか? どうもありがとう。

void <myclass>::sendMessageSSL() {
    string to = "<toMail>";
    string from = "<from>";
    string subject = "Subject";
    subject = MailMessage::encodeWord(subject, "UTF-8");
    string content = "Content";
    MailMessage message;
    message.setSender(from);
    message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, to));
    message.setSubject(subject);
    message.setContentType("text/plain; charset=UTF-8");
    message.setContent(content, MailMessage::ENCODING_8BIT);
    try {
         SecureSMTPClientSession session(host_out, port_out);
         session.open();
         // Initialize the NetSSL library, as well as the underlying OpenSSL libraries
         initializeSSL();
         SharedPtr<InvalidCertificateHandler> ptrHandler =
            new AcceptCertificateHandler(false);
         Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "",
            Context::VERIFY_RELAXED, 9, true,
            "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
         SSLManager::instance().initializeClient(0, ptrHandler, ptrContext);
         try {
             // TLS begins with an unsecured connection
             session.login();
             // Upgrades to secured connection once the information is sent
             if (session.startTLS(ptrContext)) {
            session.login(SMTPClientSession::AUTH_LOGIN, user, pass);
            session.sendMessage(message);
             }
             session.close();
             uninitializeSSL();
          } catch (SMTPException &e) {
             cerr << e.displayText() << endl;
             session.close();
             uninitializeSSL();
          }
     } catch (NetException &e) {
         cerr << e.displayText() << endl;
     }
  }
4

1 に答える 1

0

あなたがすでにこれを解決したかどうかはわかりません。遅刻しないよりはましですか?私はあなたの質問に出くわしました。100% の CPU の問題がない、あなたと同様の作業プログラムがあります。私のコードとあなたが投稿したものの違いを共有します。

まず、null ポインターの代わりに PrivateKeyPassphraseHandler を initializeClient に渡します。下記参照:

    SharedPtr<PrivateKeyPassphraseHandler> ptrPrivKeyPassHandler = new KeyConsoleHandler(false);
    SharedPtr<InvalidCertificateHandler> ptrInvalidCertHandler = new AcceptCertificateHandler(false);
    Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_RELAXED,
        9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");

    SSLManager::instance().initializeClient(ptrPrivKeyPassHandler, ptrInvalidCertHandler, ptrContext);

次に、セッションを閉じて SSL エンジンの初期化を解除することを確実にしています。これを行うには、これら 2 つのコマンドを try/catch 領域の外と下に配置して、常に実行されるようにします。NetException が発生した場合、コードはこれら 2 つのステートメントを実行しないようです。

    session.close();
    uninitializeSSL();
于 2016-06-15T01:18:10.430 に答える