Я пытаюсь использовать библиотеку Poco для отправки электронной почты. Платформа OS X, Yosemite 10.10.2. Я использую Qt 5.3 32-разрядную версию. Я следовал официальным инструкциям здесь, а так как я использую 32-битный Qt и хочу библиотеки, которые должны быть статически связаны, я использовал
./configure --omit=Data/ODBC,Data/MySQL --config=Darwin32
(Мне не нужны модули MySQL
/ODBC
). И он установился в /usr/local
правильно, после чего я связал необходимые динамические библиотеки (PocoNet
и PocoFoundation
и еще 10 библиотек), и попробовал этот следующий код, который я нашел здесь. То, что я пытаюсь сделать, это отправить электронное письмо на мою учетную запись gmail из моей учетной записи:
#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;
}
}
Когда я запускаю это, я получаю следующую ошибку:
libc++abi.dylib: завершение работы с необработанным исключением типа Poco::Net::SSLException: SSL Exception в консоли Qt.
Сгенерированный Apple аварийный дамп показывает это:
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
Почему-то код не работает на pSSLSocket->connect(SocketAddress(host, port));
Я связал PocoNet
, PocoNetSSL
, PocoFoundation
и т. д., всего сгенерировано все 12 динамических библиотек.
Есть идеи, как мне это исправить?
SecureSMTPClientSession
вместоSMTPClientSession
. Я также не уверен, насколько счастлив будетsmtp.gmail.com
, что вы скажете ему, что выsmtp.gmail.com
вHELO
. - person Wintermute   schedule 27.03.2015SecureSMTPClientSession
, так как весь день гуглил, но нигде его не вижу. По крайней мере, вPoco/Net
. ???? - person SexyBeast   schedule 27.03.2015NetSSL_OpenSSL
, найденной вPoco/Net/SecureSMTPClientSession.h
, как указано в документации. . - person Wintermute   schedule 27.03.2015Net
нет файла с именемSecureSMTPClientSession.h
.. - person SexyBeast   schedule 27.03.2015Net
иFoundation
. Вам также нужноNetSSL_OpenSSL
. - person Wintermute   schedule 27.03.2015NetSSL_OpenSSL
? Я не делал ничего конкретного для установкиNet
иFoundation
, я просто следовал официальным инструкциям, и они установились. - person SexyBeast   schedule 27.03.2015