Bonjour à tous je suis en train de coder un petit client de messagerie en C++ sous Qt.

J'ai pour le moment réaliser la connexion au serveur imap via QTcpSocekt. Mais je bloque sur l'identification. Je ne sais pas comment envoyer une requête au serveur j'ai essayé avec un CAPABILITY mais mon label m'affiche l'erreur de la connexion coupée.


Je vous mets mon .h et mon .cpp

Merci de votre aide

MaFenetre.h

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#ifndef MAFENETRE_H
#define MAFENETRE_H
 
 
#include <QApplication>
#include <QWidget>
#include <QtGui>
#include <QtNetwork>
#include <QTcpSocket>
 
class MaFenetre : public QWidget // On hérite de QWidget (IMPORTANT)
{
 
Q_OBJECT
 
public:
    MaFenetre();
 
public slots:
    void on_boutonConnexion_clicked();
    void on_boutonCouleur_clicked();
    void on_boutonPolice_clicked();
 
    void on_boutonServeur_clicked();
    void erreurSocket(QAbstractSocket::SocketError erreur);
    void connecte();
    void donneesRecues();
 
 
private:
    QPushButton *m_boutonConnexion;
    QPushButton *m_boutonQuitter;
    QPushButton *m_boutonPolice;
    QPushButton *m_boutonCouleur;
    QPushButton *m_boutonServeur;
 
    QLabel *m_labelIdentifiant;
    QLabel *m_labelMdp;
    QLabel *m_labelImage;
    QLabel *m_labelMessage;
    QLabel *m_labelMessageServeur;
 
    QLineEdit *m_champIdentifiant;
    QLineEdit *m_champMdp;
 
    QGridLayout *m_layoutGrille;
    QVBoxLayout *m_layoutTexte;
    QVBoxLayout *m_layoutChamp;
    QVBoxLayout *m_layoutBouton;
    QVBoxLayout *m_layoutBoutonPimp;
 
    QTcpSocket *socket;
    quint16 tailleMessage;
 
};
 
#endif // MAFENETRE_H
MaFenetre.cpp

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#include "MaFenetre.h"
 
 
MaFenetre::MaFenetre() : QWidget()
{
    setWindowIcon(QIcon("mario.png"));
    setWindowTitle("Benso");
 
    //construction de la socket connexion serveur imap
    socket = new QTcpSocket(this);
    connect(socket,SIGNAL(connected()),this,SLOT(connecte()));
    connect(socket,SIGNAL(readyRead()),this,SLOT(donneesRecues()));
    connect(socket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(erreurSocket(QAbstractSocket::SocketError)));
 
    //construction des boutons
    m_boutonConnexion = new QPushButton("Connexion");
    m_boutonConnexion->setFont(QFont("Courier", 12));
    m_boutonConnexion->setCursor(Qt::PointingHandCursor);
    m_boutonConnexion->setIcon(QIcon("connexion.png"));
    m_boutonConnexion->setEnabled(false);
 
    m_boutonQuitter = new QPushButton("Quitter");
    m_boutonQuitter->setFont(QFont("Courier",12));
    m_boutonQuitter->setCursor(Qt::PointingHandCursor);
    m_boutonQuitter->setIcon(QIcon("quitter.png"));
    m_boutonQuitter->setEnabled(true);
 
    m_boutonPolice = new QPushButton("Changer la police");
    m_boutonPolice->setFont(QFont("Courier",12));
    m_boutonPolice->setCursor(Qt::PointingHandCursor);
    m_boutonPolice->setIcon(QIcon("quitter.png"));
    m_boutonPolice->setEnabled(true);
 
    m_boutonCouleur = new QPushButton("Changer la couleur");
    m_boutonCouleur->setFont(QFont("Courier",12));
    m_boutonCouleur->setCursor(Qt::PointingHandCursor);
    m_boutonCouleur->setIcon(QIcon("couleur.png"));
    m_boutonPolice->setEnabled(true);
 
    m_boutonServeur = new QPushButton("Connection Serveur");
    m_boutonServeur->setFont(QFont("Courier",12));
    m_boutonServeur->setCursor(Qt::PointingHandCursor);
    m_boutonServeur->setIcon(QIcon("serveur.png"));
    m_boutonServeur->setEnabled(true);
 
 
    //construction des champs de saisie
    m_champIdentifiant = new QLineEdit();
    m_champMdp = new QLineEdit();
    m_champMdp->setEchoMode(QLineEdit::Password);
 
    //construction des labels
    m_labelIdentifiant = new QLabel("Votre identifiant gmail :");
    m_labelIdentifiant->setWordWrap(true);
 
    m_labelMdp = new QLabel("Mot de pass:");
    m_labelMdp->setWordWrap(true);
 
    m_labelImage = new QLabel();
    m_labelImage->setPixmap(QPixmap("email.png"));
    m_labelImage->setAlignment(Qt::AlignCenter);
 
    m_labelMessage = new QLabel();
    m_labelMessage->setText("Bienvenue sur mon app ! enjoy !");
 
    m_labelMessageServeur = new QLabel();
    m_labelMessageServeur->setText("Info: Non Connecté au serveur gmail");
 
    //SLOTS/SIGNAL
    QObject::connect(m_boutonConnexion,SIGNAL(clicked()), this, SLOT(on_boutonConnexion_clicked()));//bouton Connection
    QObject::connect(m_boutonQuitter,SIGNAL(clicked()), qApp, SLOT(quit()));//bouton Quitter
    QObject::connect(m_boutonPolice,SIGNAL(clicked()), this, SLOT(on_boutonPolice_clicked()));//bouton Police
    QObject::connect(m_boutonCouleur,SIGNAL(clicked()), this, SLOT(on_boutonCouleur_clicked()));//bouton Couleur
    QObject::connect(m_boutonServeur,SIGNAL(clicked()),this,SLOT(on_boutonServeur_clicked()));
 
    //construction et placement des Layouts
    m_layoutGrille = new QGridLayout(this);
    m_layoutChamp = new QVBoxLayout();
    m_layoutTexte = new QVBoxLayout();
    m_layoutBouton = new QVBoxLayout();
    m_layoutBoutonPimp = new QVBoxLayout();
 
    m_layoutChamp->addWidget(m_labelIdentifiant);
    m_layoutChamp->addWidget(m_champIdentifiant);
    m_layoutChamp->addWidget(m_labelMdp);
    m_layoutChamp->addWidget(m_champMdp);
    m_layoutChamp->addWidget(m_boutonConnexion);
 
    m_layoutTexte->addWidget(m_labelMessage);
    m_layoutTexte->addWidget(m_labelMessageServeur);
 
    m_layoutBouton->addWidget(m_boutonServeur);
    m_layoutBouton->addWidget(m_boutonQuitter);
 
 
    m_layoutBoutonPimp->addWidget(m_boutonPolice);
    m_layoutBoutonPimp->addWidget(m_boutonCouleur);
 
    m_layoutGrille->addLayout(m_layoutChamp,0,0);
    m_layoutGrille->addLayout(m_layoutTexte,1,0);
    m_layoutGrille->addLayout(m_layoutBouton,2,0);
    m_layoutGrille->addWidget(m_labelImage,0,1,2,1);
    m_layoutGrille->addLayout(m_layoutBoutonPimp,2,1);
 
}
void MaFenetre::connecte()
{
    m_labelMessageServeur->setText(tr("Info: Vous êtes connecté au serveur Gmail!! \n     Vous pouvez vous identifier"));
    m_boutonConnexion->setEnabled(true);
}
 
void MaFenetre::erreurSocket(QAbstractSocket::SocketError erreur)
{
    switch(erreur)// msg d'erreur selon l'erreur
    {
    case QAbstractSocket::HostNotFoundError:
        m_labelMessageServeur->setText(tr("<em>ERREUR:Le serveur n'a pas pu etre trouvé.Vérifier l'IP et le port.</em>"));
        break;
    case QAbstractSocket::ConnectionRefusedError:
        m_labelMessageServeur->setText(tr("<em>ERREUR: Le serveur a refusé la connexion.</em>"));
        break;
    case QAbstractSocket::RemoteHostClosedError:
        m_labelMessageServeur->setText(tr("<em>ERREUR : le serveur a coupé la connexion</em>"));
        break;
    default:
         m_labelMessageServeur->setText(tr("<em>ERREUR :")+ socket->errorString()+tr("</em>"));
    }
}
 
void MaFenetre::on_boutonServeur_clicked()
{
    m_labelMessageServeur->setText(tr("Info: Tentative de connexion au serveur..."));
    socket->abort();//desactiation des co précédentes
    socket->connectToHost("imap.gmail.com",993);
}
 
void MaFenetre::donneesRecues()
{
    QDataStream in(socket);
    if(tailleMessage == 0)
    {
        if(socket->bytesAvailable()<(int)sizeof(quint16))
            return;
        in>>tailleMessage;
    }
 
    if(socket->bytesAvailable()<tailleMessage)
        return;
    //si on arrive jusqu'à cette ligne on peut récup le message du serveur
    QString *messageRecu;
    in>>*messageRecu;
    //on affiche la réponse du serveur
    m_labelMessage->setText(*messageRecu);
    tailleMessage=0;
}
 
void MaFenetre::on_boutonConnexion_clicked()
{
   QByteArray paquet;
   QDataStream out(&paquet, QIODevice::WriteOnly);
 
   QString messageAEnvoyer = ("CAPABILITY\n");
    out<<(quint16) 0;
    out<<messageAEnvoyer;
    out.device()->seek(0);
    out<<(quint16)(paquet.size()- sizeof(quint16));
   socket->write(paquet);
 
 
}
 
void MaFenetre::on_boutonCouleur_clicked()
{
    QColor couleur = QColorDialog::getColor(Qt::white,this);
    QPalette palette;
    palette.setColor(QPalette::ButtonText,couleur);
 
    m_boutonConnexion->setPalette(palette);
    m_boutonQuitter->setPalette(palette);
    m_boutonPolice->setPalette(palette);
    m_boutonCouleur->setPalette(palette);
    m_boutonServeur->setPalette(palette);
    m_labelIdentifiant->setPalette(palette);
    m_labelMdp->setPalette(palette);
 
}
 
void MaFenetre::on_boutonPolice_clicked()
{
    bool ok = false;
    QFont police = QFontDialog::getFont(&ok, m_boutonPolice->font(),this);
    if(ok)
    {
       m_boutonConnexion->setFont(police);
       m_boutonQuitter->setFont(police);
       m_boutonCouleur->setFont(police);
       m_boutonPolice->setFont(police);
       m_boutonServeur->setFont(police);
       m_labelIdentifiant->setFont(police);
       m_labelMdp->setFont(police);
 
    }
}