Browse Source

add host address parameter to helo smtp request

adaptive-webui-19844
Ivanov Juriy 10 years ago
parent
commit
a7ad34418f
  1. 37
      src/smtp.cpp
  2. 1
      src/smtp.h

37
src/smtp.cpp

@ -48,6 +48,7 @@ @@ -48,6 +48,7 @@
#include <QNetworkInterface>
#include <QCryptographicHash>
namespace {
const short DEFAULT_PORT = 25;
const short DEFAULT_PORT_SSL = 465;
@ -76,6 +77,20 @@ QByteArray hmacMD5(QByteArray key, const QByteArray &msg) @@ -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 @@ -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
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 @@ -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

1
src/smtp.h

@ -64,6 +64,7 @@ private slots: @@ -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();

Loading…
Cancel
Save