@macman
Danke für die Info, es geht einfach um SMTP, um aus dem Programm Nachrichten versenden zu können.
Die Wikipedia Seite habe ich auch gelesen, mit telnet server 25 kriege ich es auch hin. Aber die Klasse, die ich gebastelt habe, klappt irgendwie nicht, denn ich bekomme zwar mit Telnet die "220 xxx server ready", aber über QTcpSockets kommt als Antwort immer 0 Byte...
Ich habe das Beispiel für den Fortune Client als Vorlage genommen, Verbindung bekomme ich, das Signal readyRead kommt auch, aber ich bekomme nur 0 Bytes....
Hier mal meine "Bastelklasse": (Windows XP, VS 2005 Prof, QT 4.3.2 Kommerziell)
cpp:
#include "pbsmtp.h"
#include <QtCore>
PBSmtp::PBSmtp(QObject *parent)
: QObject(parent)
{
SMTP_Server = "localhost";
SMTP_Port = 25;
tcpSocket = 0;
}
PBSmtp::~PBSmtp()
{
if (tcpSocket)
delete tcpSocket;
}
int PBSmtp::startSMTP(QString host, unsigned int port)
{
QByteArray array;
if (tcpSocket)
{
delete tcpSocket;
tcpSocket = 0;
}
if (!tcpSocket)
tcpSocket = new QTcpSocket(this);
if (!tcpSocket)
return -1;
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readSMTP()));
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
tcpSocket->abort();
tcpSocket->setReadBufferSize(60000);
tcpSocket->connectToHost(host, port, QIODevice::ReadWrite);
if (tcpSocket->waitForConnected(10000) == false) // Warte, bis wir verbunden sind
{
emit sendMessage(tr("SMTP: Keine Verbindung zum Mailserver"));
return -2;
}
// das habe ich eingebaut, um mal zu sehen, ob ich was senden muss, dass der Server reagiert
char buffer[2] = { 0xd, 0};
tcpSocket->write(&buffer[0]);
if (tcpSocket->waitForReadyRead() == false)
{
emit sendMessage(tr("SMTP: Mail Server reagiert nicht auf Anforderung"));
return -2;
}
else
emit sendMessage(tr("SMPT: Mail Server bereit"));
// da habe ich getestet, ob noch was nachkommt...
array = tcpSocket->read(500);
return 0;
}
int PBSmtp::endSMTP()
{
if (tcpSocket)
{
delete tcpSocket;
tcpSocket = 0;
}
return 0;
}
int PBSmtp::sendMail(QString from, QString to, QString subject, QString Text)
{
return 0;
}
// SLOTS
void PBSmtp::readSMTP()
{
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);
in >> ComLine;
qDebug() << "readSMTP Anzahl Bytes = " << tcpSocket->bytesAvailable() << " String = " << ComLine;
}
void PBSmtp::displayError(QAbstractSocket::SocketError socketError)
{
switch (socketError)
{
case QAbstractSocket::RemoteHostClosedError:
break;
case QAbstractSocket::HostNotFoundError:
emit sendMessage(tr("SMTP: Der E-Mail server wurde nicht gefunden, bitte prüfen Sie den Host-Namen und den Port."));
break;
case QAbstractSocket::ConnectionRefusedError:
emit sendMessage(tr("SMTP: Die Verbindung wurde durch den Server verweigert. Stellen Sie sicher, dass der E-Mail Server aktiv ist und prüfen Sie die Einstellungen."));
break;
default:
emit sendMessage(tr("SMTP: Folgender Fehler trat auf: %1.").arg(tcpSocket->errorString()));
break;
}
}
hpp:
#ifndef PBSMTP_H
#define PBSMTP_H
#include "dakydlldefs.hpp"
#include <QObject>
#include <QTcpSocket>
class PB_DLLEXPORT PBSmtp : public QObject
{
Q_OBJECT
public:
PBSmtp(QObject *parent);
~PBSmtp();
int startSMTP(QString, unsigned int);
int endSMTP();
int sendMail(QString from, QString to, QString subject, QString Text);
private:
QTcpSocket *tcpSocket;
QString SMTP_Server;
unsigned int SMTP_Port;
QString ComLine;
private slots:;
void readSMTP();
void displayError(QAbstractSocket::SocketError socketError);
signals:;
void sendMessage(QString);
};
#endif // PBSMTP_H
Aufruf mit (Eingaben sind natürlich bei mir richtig angegeben, der Janaserver läuft auf einem anderen PC und man kann mit Telnet verbindung aufnehmen und senden).
PBSmtp Smtp(this);
Smtp->startSMTP("localhost", 25);
Smtp->sendMail("
x.y@murks.com","
mich@domain.de", "Testmail", "Testmailtext");
Smtp->endSMTP();
Für jede Idee bin ich dankbar
Gruß Peter