Reset SMTP session state (using RSET command) if transport is being reused.
This commit is contained in:
parent
0af0373cb6
commit
0757efad0d
@ -107,6 +107,13 @@ ref <SMTPCommand> SMTPCommand::RCPT(const mailbox& mbox)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
ref <SMTPCommand> SMTPCommand::RSET()
|
||||||
|
{
|
||||||
|
return createCommand("RSET");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
ref <SMTPCommand> SMTPCommand::DATA()
|
ref <SMTPCommand> SMTPCommand::DATA()
|
||||||
{
|
{
|
||||||
|
@ -70,7 +70,7 @@ namespace smtp {
|
|||||||
SMTPTransport::SMTPTransport(ref <session> sess, ref <security::authenticator> auth, const bool secured)
|
SMTPTransport::SMTPTransport(ref <session> sess, ref <security::authenticator> auth, const bool secured)
|
||||||
: transport(sess, getInfosInstance(), auth), m_socket(NULL),
|
: transport(sess, getInfosInstance(), auth), m_socket(NULL),
|
||||||
m_authentified(false), m_extendedSMTP(false), m_timeoutHandler(NULL),
|
m_authentified(false), m_extendedSMTP(false), m_timeoutHandler(NULL),
|
||||||
m_isSMTPS(secured), m_secured(false)
|
m_isSMTPS(secured), m_secured(false), m_needReset(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -574,15 +574,23 @@ void SMTPTransport::send(const mailbox& expeditor, const mailboxList& recipients
|
|||||||
throw exceptions::no_expeditor();
|
throw exceptions::no_expeditor();
|
||||||
|
|
||||||
|
|
||||||
|
const bool needReset = m_needReset;
|
||||||
const bool hasPipelining =
|
const bool hasPipelining =
|
||||||
m_extensions.find("PIPELINING") != m_extensions.end();
|
m_extensions.find("PIPELINING") != m_extensions.end();
|
||||||
|
|
||||||
ref <SMTPResponse> resp;
|
ref <SMTPResponse> resp;
|
||||||
ref <SMTPCommandSet> commands = SMTPCommandSet::create(hasPipelining);
|
ref <SMTPCommandSet> commands = SMTPCommandSet::create(hasPipelining);
|
||||||
|
|
||||||
|
// Emit a "RSET" command if we previously sent a message on this connection
|
||||||
|
if (needReset)
|
||||||
|
commands->addCommand(SMTPCommand::RSET());
|
||||||
|
|
||||||
// Emit the "MAIL" command
|
// Emit the "MAIL" command
|
||||||
commands->addCommand(SMTPCommand::MAIL(expeditor));
|
commands->addCommand(SMTPCommand::MAIL(expeditor));
|
||||||
|
|
||||||
|
// Now, we will need to reset next time
|
||||||
|
m_needReset = true;
|
||||||
|
|
||||||
// Emit a "RCPT TO" command for each recipient
|
// Emit a "RCPT TO" command for each recipient
|
||||||
for (size_t i = 0 ; i < recipients.getMailboxCount() ; ++i)
|
for (size_t i = 0 ; i < recipients.getMailboxCount() ; ++i)
|
||||||
{
|
{
|
||||||
@ -593,6 +601,18 @@ void SMTPTransport::send(const mailbox& expeditor, const mailboxList& recipients
|
|||||||
// Prepare sending of message data
|
// Prepare sending of message data
|
||||||
commands->addCommand(SMTPCommand::DATA());
|
commands->addCommand(SMTPCommand::DATA());
|
||||||
|
|
||||||
|
// Read response for "RSET" command
|
||||||
|
if (needReset)
|
||||||
|
{
|
||||||
|
commands->writeToSocket(m_socket);
|
||||||
|
|
||||||
|
if ((resp = readResponse())->getCode() != 250)
|
||||||
|
{
|
||||||
|
internalDisconnect();
|
||||||
|
throw exceptions::command_error(commands->getLastCommandSent()->getText(), resp->getText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Read response for "MAIL" command
|
// Read response for "MAIL" command
|
||||||
commands->writeToSocket(m_socket);
|
commands->writeToSocket(m_socket);
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ VMIME_TEST_SUITE_BEGIN
|
|||||||
VMIME_TEST(testSTARTTLS)
|
VMIME_TEST(testSTARTTLS)
|
||||||
VMIME_TEST(testMAIL)
|
VMIME_TEST(testMAIL)
|
||||||
VMIME_TEST(testRCPT)
|
VMIME_TEST(testRCPT)
|
||||||
|
VMIME_TEST(testRSET)
|
||||||
VMIME_TEST(testDATA)
|
VMIME_TEST(testDATA)
|
||||||
VMIME_TEST(testNOOP)
|
VMIME_TEST(testNOOP)
|
||||||
VMIME_TEST(testQUIT)
|
VMIME_TEST(testQUIT)
|
||||||
@ -115,6 +116,14 @@ VMIME_TEST_SUITE_BEGIN
|
|||||||
VASSERT_EQ("Text", "RCPT TO:<someone@vmime.org>", cmd->getText());
|
VASSERT_EQ("Text", "RCPT TO:<someone@vmime.org>", cmd->getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testRSET()
|
||||||
|
{
|
||||||
|
vmime::ref <SMTPCommand> cmd = SMTPCommand::RSET();
|
||||||
|
|
||||||
|
VASSERT_NOT_NULL("Not null", cmd);
|
||||||
|
VASSERT_EQ("Text", "RSET", cmd->getText());
|
||||||
|
}
|
||||||
|
|
||||||
void testDATA()
|
void testDATA()
|
||||||
{
|
{
|
||||||
vmime::ref <SMTPCommand> cmd = SMTPCommand::DATA();
|
vmime::ref <SMTPCommand> cmd = SMTPCommand::DATA();
|
||||||
|
@ -65,6 +65,7 @@ public:
|
|||||||
static ref <SMTPCommand> STARTTLS();
|
static ref <SMTPCommand> STARTTLS();
|
||||||
static ref <SMTPCommand> MAIL(const mailbox& mbox);
|
static ref <SMTPCommand> MAIL(const mailbox& mbox);
|
||||||
static ref <SMTPCommand> RCPT(const mailbox& mbox);
|
static ref <SMTPCommand> RCPT(const mailbox& mbox);
|
||||||
|
static ref <SMTPCommand> RSET();
|
||||||
static ref <SMTPCommand> DATA();
|
static ref <SMTPCommand> DATA();
|
||||||
static ref <SMTPCommand> NOOP();
|
static ref <SMTPCommand> NOOP();
|
||||||
static ref <SMTPCommand> QUIT();
|
static ref <SMTPCommand> QUIT();
|
||||||
|
@ -105,6 +105,8 @@ private:
|
|||||||
|
|
||||||
SMTPResponse::state m_responseState;
|
SMTPResponse::state m_responseState;
|
||||||
|
|
||||||
|
bool m_needReset;
|
||||||
|
|
||||||
// Service infos
|
// Service infos
|
||||||
static SMTPServiceInfos sm_infos;
|
static SMTPServiceInfos sm_infos;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user