2012-06-25 2 views
2

방금 ​​Poco 라이브러리를 시작했고 전자 메일 프로그램을 만들려고했습니다 (거의 알지 못했습니다). 다음은 내 코드입니다 (이 내가 지금까지 만난 사람 이외의 그것과 다른 문제가 될 수 있지만 난 그냥 작업을 시작 할 수있다)Poco는 SMTPClientSession.login 후에 중지합니다.

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,"[email protected]"); 
    msg.addRecipient(resp); 
    std::string content("HELP SOS"); 
    msg.encodeWord(content); 
    std::cout << msg.getContent() << "-"; 
} 

내가 디버거로 이동, 그것까지 잘 실행 sess.login에 도착하면 갑자기 작은 막대가 나타납니다. 코드가 사라졌지만 프로그램이 계속 실행됩니다 (그 의미를 알만큼 충분히 경험하지 못했습니다). 내가 실제로 넣은 책자는 실제로 인쇄되지 않습니다. 디버거는 그 행을 지나치지만 아무 것도 나타나지 않습니다. 조금만 지나면 다음과 같이 표시됩니다.

terminate called throwing an exception 

그래서 어떻게 될까요?

+0

, 당신은 너무 줄 바꿈을하려면 버퍼, 또는'표준 : endl'를 세척하는'표준 : flush'를 사용합니다. –

+0

감사합니다. 버퍼가 자동으로 플러시되지 않는 이유는 무엇입니까? –

+1

버퍼링 되었기 때문에 ... :) 속도 문제로 매번 문자를 출력 할 때마다 효과적이지 않습니다. 자동으로 플러시되기 전에 그것을 채워야합니다. 그리고 아니요, 버퍼의 크기를 알지 못합니다. 옴 구현에 의존하며 지정되지 않았습니다. –

답변

4

TLS를 통한 SMTP (포트 465는 SocketAddress에 전달됨)를 사용하려고합니다. 한번에 당신은 당신의 목표 인 이메일 메시지를 보내는 것에 중점을두기 전에 (1) TLS와 POCO에서의 인증서 처리법을 배우셔야합니다.

간단한 예제로 POCO를 배우기를 제안합니다. POCO 소스 코드의 다양한 samples 디렉토리에서 샘플 코드를 찾을 수 있습니다.

나는 무엇을 해야할지 모르기 때문에 코드가 TLS 핸드 셰이크에 매달려 있다고 생각합니다. try/catch 블록 내부

  1. 장소 코드 :

    이이 솔루션을 찾고 전에 당신이 을해야 수정입니다. POCO는 예외를 사용합니다.

  2. StreamSocketSecureStreamSocket으로 바꿉니다.
  3. SecureStreamSocket을 올바르게 초기화하는 가장 간단한 방법은 Application 클래스를 사용하는 것입니다. Applications 슬라이드 및 Util/samples/SampleApp/src/SampleApp.cpp 슬라이드를 참조하십시오.
  4. 응용 프로그램에 사용할 인증서를 올바르게 알리는 방법은 SSLManager 설명서를 참조하십시오.
  5. login() 메소드에 호스트 이름을 지정하지 마십시오. 호스트 이름은 선택 사항이며 서버가 아닌 클라이언트 호스트 이름이어야합니다 (SMTP RFC 참조).
  6. 실제로 메시지를 보내십시오! 코드가 전송하지 않습니다 :-)

이제 코드를 실행하십시오. 나는 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, 
            "[email protected]"); 
      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) 
+0

고마워요,하지만 그것을 실행하기 위해 필요한 헤더는 무엇입니까? –

+0

각 클래스의 문서에 포함 할 헤더가 언급되어 있습니다. 예를 들어'SecureSMTPClientSession' [1]은''를 포함하고 POCO NetSSL 라이브러리에 링크하는 것을 말합니다. [1] : http://pocoproject.org/docs/Poco.Net.SecureSMTPClientSession.html –

+0

메일을 보내려면 함수 대신 응용 프로그램을 만드는 것이 과도한 것 같습니다. –

2

예, 그렇기 때문에 나는 login()으로 어려움을 겪었으므로 smtp.gmail.com을 사용하려고했습니다. 이것은 작동하게 만든 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, "[email protected]", "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

+0

패스워드를 평문으로 사용하고 있습니까? 내 코드는 당신의 코드와 아주 똑같은데'로그인 암호를 사용한 로그인 실패 : 535-5.7.1 사용자 이름과 암호가 허용되지 않습니다. 535에서 자세히 알아보기 5.7.1 http : //support.google.com/mail/bin/answer.py? answer = 14257' – heinob

+0

Google의 2 단계 인증이 이유였습니다 ;-) 지금 잘되었습니다! – heinob

+1

Mac 용 Poco를 만들었지 만 Net에서'SecureSMTPClientSession.h '을 찾을 수 없습니다. 어떤 생각? – SexyBeast

관련 문제