From a7ad34418f389f1c8f540f107977672e57c62bb3 Mon Sep 17 00:00:00 2001 From: Ivanov Juriy Date: Mon, 25 Aug 2014 14:26:30 +0400 Subject: [PATCH] add host address parameter to helo smtp request --- src/smtp.cpp | 39 ++++++++++++++++++++++++++------------- src/smtp.h | 1 + 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/smtp.cpp b/src/smtp.cpp index b0c765c44..044389783 100644 --- a/src/smtp.cpp +++ b/src/smtp.cpp @@ -48,6 +48,7 @@ #include #include +namespace { const short DEFAULT_PORT = 25; const short DEFAULT_PORT_SSL = 465; @@ -76,6 +77,20 @@ QByteArray hmacMD5(QByteArray key, const QByteArray &msg) return QCryptographicHash::hash(total, QCryptographicHash::Md5); } +QByteArray determineLocalAddress() +{ + QByteArray address = "127.0.0.1"; + foreach (const QHostAddress& addr, QNetworkInterface::allAddresses()) { + if (addr == QHostAddress::LocalHost || addr == QHostAddress::LocalHostIPv6) + continue; + address = addr.toString().toLatin1(); + break; + } + + return address; +} +} // namespace + Smtp::Smtp(QObject *parent): QObject(parent), state(Init), use_ssl(false) { #ifndef QT_NO_OPENSSL @@ -290,20 +305,20 @@ QByteArray Smtp::encode_mime_header(const QString& key, const QString& value, QT void Smtp::ehlo() { - QByteArray address = "127.0.0.1"; - foreach (const QHostAddress& addr, QNetworkInterface::allAddresses()) - { - if (addr == QHostAddress::LocalHost || addr == QHostAddress::LocalHostIPv6) - continue; - address = addr.toString().toLatin1(); - break; - } - // Send EHLO - socket->write("ehlo "+ address + "\r\n"); + QByteArray address = determineLocalAddress(); + socket->write("ehlo " + address + "\r\n"); socket->flush(); state = EhloSent; } +void Smtp::helo() +{ + QByteArray address = determineLocalAddress(); + socket->write("helo " + address + "\r\n"); + socket->flush(); + state = HeloSent; +} + void Smtp::parseEhloResponse(const QByteArray& code, bool continued, const QString& line) { if (code != "250") { @@ -311,9 +326,7 @@ void Smtp::parseEhloResponse(const QByteArray& code, bool continued, const QStri if (state == EhloSent) { // try to send HELO instead of EHLO qDebug() << "EHLO failed, trying HELO instead..."; - socket->write("helo\r\n"); - socket->flush(); - state = HeloSent; + helo(); } else { // Both EHLO and HELO failed, chances are this is NOT // a SMTP server diff --git a/src/smtp.h b/src/smtp.h index 5602f4ac6..bb80a3a85 100644 --- a/src/smtp.h +++ b/src/smtp.h @@ -64,6 +64,7 @@ private slots: private: QByteArray encode_mime_header(const QString& key, const QString& value, QTextCodec* latin1, const QByteArray& prefix=QByteArray()); void ehlo(); + void helo(); void parseEhloResponse(const QByteArray& code, bool continued, const QString& line); void authenticate(); void startTLS();