2015-03-27 1 views
0

J'essaie d'utiliser la bibliothèque Poco pour envoyer un courriel. La plate-forme est OS X, Yosemite 10.10.2 J'utilise Qt 5.3 32 bits. J'ai suivi les instructions officielles de here, et depuis que je suis en utilisant 32 bits Qt, et que vous souhaitez les bibliothèques à lier de manière statique, jePoco incapable d'envoyer un courriel

./configure --omit=Data/ODBC,Data/MySQL --config=Darwin32

(Je ne demande pas les modules MySQL/ODBC). Et il installé dans /usr/local correctement, après quoi j'ai lié les bibliothèques dynamiques nécessaires (PocoNet et PocoFoundation et 10 autres bibliothèques), et j'ai essayé ce code suivant, que j'ai trouvé here. Ce que je suis en train de faire est d'envoyer un e-mail à mon compte gmail de mon compte lui-même:

#include "MailSender.hpp" 

#include <Poco/Net/MailMessage.h> 
#include <Poco/Net/MailRecipient.h> 
#include <Poco/Net/SMTPClientSession.h> 
#include <Poco/Net/NetException.h> 
#include <Poco/Net/SecureSMTPClientSession.h> 
#include <Poco/Net/InvalidCertificateHandler.h> 
#include <Poco/Net/AcceptCertificateHandler.h> 
#include <Poco/Net/SSLManager.h> 
#include <Poco/Net/SecureStreamSocket.h> 
#include <Poco/Net/MailRecipient.h> 

#include <iostream> 
#include <QDebug> 

using Poco::Net::InvalidCertificateHandler; 
using Poco::Net::AcceptCertificateHandler; 
using Poco::Net::Context; 
using Poco::Net::SSLManager; 
using Poco::Net::SecureStreamSocket; 
using Poco::Net::SocketAddress; 
using Poco::Net::SecureSMTPClientSession; 
using Poco::Net::SMTPClientSession; 
using Poco::SharedPtr; 
using Poco::Net::MailMessage; 
using Poco::Net::MailRecipient; 
using namespace std; 

MailSender::MailSender() 
{ 
SharedPtr<InvalidCertificateHandler> pCert = new AcceptCertificateHandler(false); 

string host = "smtp.gmail.com"; 
int port = 25; 

Context::Ptr pContext = new Poco::Net::Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
SSLManager::instance().initializeClient(0, pCert, pContext); 

Poco::Net::SecureSMTPClientSession* pSecure = new Poco::Net::SecureSMTPClientSession(host, port); 
Poco::Net::SecureSMTPClientSession* pSession_ = new Poco::Net::SecureSMTPClientSession(host, port); 

SecureStreamSocket* pSSLSocket = new SecureStreamSocket(pContext); 
pSSLSocket->connect(SocketAddress(host, port)); 
pSecure = new SecureSMTPClientSession(*pSSLSocket); 
pSession_ = pSecure; 
pSecure->login(); 
if (!pSecure->startTLS(pContext)) 
    throw std::string("Failed to start TLS connection."); 

std::string sUserName = "my_email_id"; 
std::string sPassword = "my_password"; 

pSession_->login(SMTPClientSession::AUTH_LOGIN, sUserName, sPassword); 


string to = "my_email_id"; 
string from = "my_email_id"; 
string subject = "Your first e-mail message sent using Poco Libraries"; 
subject = MailMessage::encodeWord(subject, "UTF-8"); 
string content = "Well done! You've successfully sent your first message using Poco SMTPClientSession"; 
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 { 
    pSession_->sendMessage(message); 
    pSession_->close(); 
} catch (Poco::Net::SMTPException &e) { 
    qDebug() << e.displayText().c_str() << endl; 
} 
catch (Poco::Net::NetException &e) { 
    qDebug() << e.displayText().c_str() << endl; 
} 

} 

Quand je cours, je reçois l'erreur suivante:

libC++ abi.dylib: terminaison avec une exception non interceptée de type Poco :: Net :: SSLException: Exception SSL dans la console Qt.

L'Apple généré vidage sur incident montre ceci:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0 libsystem_kernel.dylib   0x9b7f369a __pthread_kill + 10 
1 libsystem_pthread.dylib   0x90a04f19 pthread_kill + 101 
2 libsystem_c.dylib    0x96861eee abort + 156 
3 libc++abi.dylib     0x965782f9 abort_message + 169 
4 libc++abi.dylib     0x9659b483 default_terminate_handler() + 272 
5 libc++abi.dylib     0x96598ac0 std::__terminate(void (*)()) + 14 
6 libc++abi.dylib     0x965986ee __cxa_rethrow + 103 
7 libPocoNetSSL.30.dylib   0x02c253ff Poco::Net::SecureSocketImpl::connectSSL(bool) + 943 
8 libPocoNetSSL.30.dylib   0x02c24fee Poco::Net::SecureSocketImpl::connect(Poco::Net::SocketAddress const&, bool) + 94 
9 libPocoNetSSL.30.dylib   0x02c28a61 Poco::Net::SecureStreamSocketImpl::connect(Poco::Net::SocketAddress const&) + 49 
10 libPocoNet.30.dylib    0x02b1368b Poco::Net::StreamSocket::connect(Poco::Net::SocketAddress const&) + 27 

D'une certaine façon, le code échoue à pSSLSocket->connect(SocketAddress(host, port));

Je lié PocoNet, PocoNetSSL, PocoFoundation, etc., dans l'ensemble, les 12 bibliothèques dynamiques générées .

Une idée de comment je résoudre ce problème?

+0

Je ne pense pas que le serveur gmail accepte la connexion en texte clair, vous voulez probablement pour essayer cela avec 'SecureSMTPClientSession' au lieu de' SMTPClientSession'. Je ne sais pas non plus à quel point 'smtp.gmail.com' sera heureux que vous lui disiez que vous êtes' smtp.gmail.com' dans le 'HELO'. – Wintermute

+0

C'est un autre problème, il semble qu'il y ait un module 'SecureSMTPClientSession' quelque part, comme je l'ai été toute la journée, mais je ne le vois nulle part. Pas dans 'Poco/Net' au moins. – SexyBeast

+0

Cela fait partie de la bibliothèque 'NetSSL_OpenSSL', trouvée dans' Poco/Net/SecureSMTPClientSession.h', comme mentionné dans [la documentation] (http://pocoproject.org/docs/Poco.Net.SecureSMTPClientSession.html). – Wintermute

Répondre

2

Pour la construction, il y avait un bug de construction d'exemples NetSSL en configuration de construction statique (non critique mais l'OP ne savait pas comment contourner ce problème), voir résolu GitHub issue.

Pour l'envoi de courriels, voir SecureSMTPClientSession with GMail and SSL sur le forum Poco:

using Poco::Net::InvalidCertificateHandler; 
using Poco::Net::AcceptCertificateHandler; 
using Poco::Net::Context; 
using Poco::Net::SSLManager; 
using Poco::Net::SecureStreamSocket; 
using Poco::Net::SocketAddress; 
using Poco::Net::SecureSMTPClientSession; 
using Poco::Net::SMTPClientSession; 
using Poco::SharedPtr; 

SharedPtr<InvalidCertificateHandler> pCert = new AcceptCertificateHandler(false); 
Context::Ptr pContext = new Poco::Net::Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
SSLManager::instance().initializeClient(0, pCert, pContext); 

SecureStreamSocket* pSSLSocket = new SecureStreamSocket(pContext); 
pSSLSocket->connect(SocketAddress(sSmtpServer, nSmtpPort)); 
pSecure = new SecureSMTPClientSession(*pSSLSocket); 
pSession_ = pSecure; 
pSecure->login(); 
if (!pSecure->startTLS(pContext)) 
    throw std::string("Failed to start TLS connection."); 

pSession_->login(SMTPClientSession::AUTH_LOGIN, sUserName, sPassword); 
pSession_->sendMessage(*pSelectedMailMessage_); 
pSession_->close(); 

Voir aussi NetSSL Mail example:

SharedPtr<InvalidCertificateHandler> pCert = new ConsoleCertificateHandler(false); // ask the user via console 
Context::Ptr pContext = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
SSLManager::instance().initializeClient(0, pCert, pContext); 

MailMessage message; 
message.setSender(sender); 
message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, recipient)); 
message.setSubject("Hello from the POCO C++ Libraries"); 
std::string content; 
content += "Hello "; 
content += recipient; 
content += ",\r\n\r\n"; 
content += "This is a greeting from the POCO C++ Libraries.\r\n\r\n"; 
std::string logo(reinterpret_cast<const char*>(PocoLogo), sizeof(PocoLogo)); 
message.addContent(new StringPartSource(content)); 
message.addAttachment("logo", new StringPartSource(logo, "image/gif")); 

SecureSMTPClientSession session(mailhost); 
session.login(); 
session.startTLS(pContext); 
if (!username.empty()) 
{ 
    session.login(SMTPClientSession::AUTH_LOGIN, username, password); 
} 
session.sendMessage(message); 
session.close(); 
+0

Merci pour votre réponse. Mais ce code montre encore une fois l'erreur de l'éditeur de liens, s'il vous plaît voir modifier à ma question .. – SexyBeast

+0

soit vous n'avez pas construit pour i386, ou vous reliez avec des binaires obsolètes. Assurez-vous que vous avez des binaires i386/libPoco * dans votre arbre de construction et que vous êtes en effet en train de lier avec ceux qui sont – Alex

+0

Umm, j'ai clairement mentionné 'config = Darwin32' dans mon étape' configure'. Y a-t-il autre chose que je dois faire? – SexyBeast