2

Poco ライブラリから始めて、メール プログラムを作成しようとしました (これについてはほとんど何も知りませんでした)。以下は私のコードです(これまでに遭遇したもの以外に他の問題があるかもしれませんが、私はそれに取り組み始めたばかりです)

    int main(int argc, char** argv)
{
    Poco::Net::SocketAddress add("smtp.gmail.com:465");
    Poco::Net::StreamSocket sock(add);
    Poco::Net::SMTPClientSession sess(sock);
    std::cout << "-";
    sess.login(
            "gmail.com",
            Poco::Net::SMTPClientSession::AUTH_LOGIN,
            "----",
            "----"
    );
    Poco::Net::MailMessage msg;
    Poco::Net::MailRecipient resp(Poco::Net::MailRecipient::PRIMARY_RECIPIENT,"michaelrgoldfine@gmail.com");
    msg.addRecipient(resp);
    std::string content("HELP SOS");
    msg.encodeWord(content);
    std::cout << msg.getContent() << "-";
}

デバッガーに入ると、sess.login に到達するまで正常に実行され、コード内にいることを表す小さなバーが突然消えますが、プログラムは実行され続けます (それが何を意味するかを知るのに十分な経験がありません)。私が入れたcoutのものはどれも実際には印刷されず、デバッガーはその行を過ぎてしまいますが、何も表示されません。しばらくすると次のようになります。

terminate called throwing an exception

どうしたの?

4

2 に答える 2

4

SMTP over TLS(に渡されたポート465 SocketAddress)を使用しようとしています。ワンショットで、(2)目標である電子メールメッセージの送信に焦点を合わせる前に、(1)POCOでのTLSと証明書の処理を学ぶ必要があります。

より簡単な例からPOCOの学習を開始することをお勧めします。サンプルコードはsamples、POCOソースコードのさまざまなディレクトリにあります。

何をすべきかわからないので、あなたのコードはTLSハンドシェイクにぶら下がっていると思います。

これらは、ソリューションを検討する前に実行する必要がある修正です。

  1. コードをtry/catchブロック内に配置します。POCOは例外を使用します。
  2. に置き換えStreamSocketますSecureStreamSocket
  3. 適切に初期化する最も簡単な方法SecureStreamSocketは、Applicationクラスを使用することです。アプリケーションのスライドとを参照してくださいUtil/samples/SampleApp/src/SampleApp.cpp
  4. SSLManager使用する証明書をアプリケーションに適切に指示する方法については、のドキュメントを参照してください。
  5. login()メソッドにホスト名を指定しないでください。ホスト名はオプションであり、サーバーではなくクライアントのホスト名である必要があります(SMTPRFCを参照)。
  6. 実際にメッセージを送信することを忘れないでください!あなたのコードはそれを送っていません:-)

OK、そして実行中のコードです。手順4と6を演習として残しましたが、このコードは少なくともTLSハンドシェイクを実行し、サーバーの証明書を検証できないことを示し、証明書に関する質問に対してターミナルで[はい]と答えると失敗します。 SMTP認証。

class MiniApp : public Poco::Util::Application {
    int main(const vector <string>& args) {
        try {
            Poco::Net::SocketAddress add("smtp.gmail.com:465");
            Poco::Net::SecureStreamSocket sock(add);
            Poco::Net::SMTPClientSession session(sock);
            session.login(Poco::Net::SMTPClientSession::AUTH_LOGIN, "user", "pw");
            Poco::Net::MailMessage msg;
            Poco::Net::MailRecipient recipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT,
                                    "michaelrgoldfine@gmail.com");
            msg.addRecipient(recipient);
            string content("HELP SOS");
            msg.encodeWord(content);
        } catch (Poco::Exception& e) {
            cout << "Error: " << e.displayText() << endl;
            return -1;
        }
        return 0;
    }
};

POCO_APP_MAIN(MiniApp)
于 2012-06-25T20:18:46.210 に答える
2

はい、smtp.gmail.com を使おうとして login() に苦労しました。これは、それを機能させた SSL セッションとの通信の抜粋です。

string host("smtp.gmail.com")
Poco::UInt16 port = 587;

SecureSMTPClientSession session(host, port);

session.open();

Poco::Net::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
{
  // SSL
  session.login();
  if (session.startTLS(ptrContext))
  {
    session.login(SMTPClientSession::AUTH_LOGIN, "user@gmail.com", "yourpassword");
    session.sendMessage(message);
  }
  session.close();
  Poco::Net::uninitializeSSL();
}
catch (SMTPException &e)
{
  cout << e.message() << endl;
  session.close();
  Poco::Net::uninitializeSSL();
  return 0;
}

元のソース:

http://www.axistasoft.sg/tutorials/cpp/poco/item/sending-email-messages-using-smtp-protocol

于 2012-08-17T02:15:04.880 に答える