Poco无法发送电子邮件
Poco unable to send email
我正在尝试使用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:在Qt控制台中以Poco::Net::SSLException:SSL exception类型的未捕获异常终止。
苹果生成的崩溃转储显示:
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个动态库。
知道我该怎么解决吗?
对于构建,在静态构建配置中构建NetSSL示例时出现了一个错误(不是关键的,但OP不知道如何解决它),请参阅解决的GitHub问题。
有关发送电子邮件,请参阅Poco论坛上的SecureSMTPClientSession与GMail和SSL:
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();
另请参阅NetSSL邮件示例:
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 += ",rnrn";
content += "This is a greeting from the POCO C++ Libraries.rnrn";
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();
相关文章:
- 尝试从C++访问 UWP 的电子邮件邮件类会导致"REGDB_E_CLASSNOTREG类未注册"错误
- 如何使HTML5电子邮件验证正则表达式在C++中工作?
- Qt:使用'mailto:'打开用户的电子邮件客户端失败
- 电子邮件地址中的c++smtp服务器主机名
- 如何使用 c++ (curl) 发送电子邮件
- 在端口 587 (TLS) 上使用 CDO 发送电子邮件时出错
- 预览由Microsoft Outlook 对象库生成的电子邮件
- 如果不有效,如何重复用户输入电子邮件
- 使用REGEX进行电子邮件输入验证C
- 如何从 pjsip 发送电子邮件.是否有任何可用于发送电子邮件的默认方法
- 如何在使用 c++/COM 发送时在电子邮件中插入/嵌入图像文件(.png)
- 使用Regex验证电子邮件和电话字段QT
- 带有 TLS v. 1.2 和 SSL v.3 电子邮件客户端的 Boost.Asio 上下文:ssl3 警报意外消息
- 如何发送带有嵌入图片的电子邮件
- 如何提示用户在C++中输入正确的电子邮件地址格式
- 我在尝试使用 libquickmail 发送电子邮件时收到错误
- C 从电子邮件向量中删除
- Poco无法发送电子邮件
- 使用 Poco Net 发送电子邮件时停止
- 使用POCO电子邮件时每个包含"No such file/directory"