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?
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
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
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