Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.3.1 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Envoi de mail avec Qt/C++

Bien le bonjour à tous !

Je suis actuellement en train de travailler sur une "application" Qt permettant d'envoyer des mails.
En effet, j'ai déjà réalisé toute l'interface graphique, il ne me reste plus que la fonction envoi de mail (la plus importante :D)
N'étant pas une "lumière" dans le langage C++ et un novice sur Qt, j'ai fait pas mal de recherches sur le fait d'envoyer un mail.
J'ai donc pu parvenir à trouver quelque chose d'intéressant là-dessus : http://www.qtcentre.org/threads/2221-Sending-email-using-Qt
J'ai alors récupéré le code en le mettant "à ma sauce" :

Voici mon .pro :


QT += core gui network
QXT += core network


greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = interface_mail_essai1
TEMPLATE = app


SOURCES += main.cpp\
mainwindow.cpp \
smtp.cpp

HEADERS += mainwindow.h \
smtp.h

FORMS += mainwindow.ui

RESOURCES += \
images.qrc
Mon smtp.h :

#ifndef SMTP_H
#define SMTP_H
#include <QTcpSocket>
#include <QString>
#include <QTextStream>
#include <QDebug>
#include <QMessageBox>

class Smtp : public QObject
{
Q_OBJECT


public:
Smtp( const QString &from, const QString &to,
const QString &subject, const QString &body );
~Smtp();

signals:
void status( const QString &);

private slots:
void stateChanged(QTcpSocket::SocketState socketState);
void errorReceived(QTcpSocket::SocketError socketError);
void disconnected();
void connected();
void readyRead();

private:
QString message;
QTextStream *t;
QTcpSocket *socket;
QString from;
QString rcpt;
QString response;
QString output;
enum states{Rcpt,Mail,Data,Init,Body,Quit,Close};
int state;

};

#endif // SMTP_H

Mon mainwindow.cpp (avec mes "include" et les lignes utlisant la classe smtp) :

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "smtp.h"
#include "QMessageBox"

#include <QApplication>
#include <QTextEdit> // afficher le contenu du fichier
#include <QFile> // Pour utiliser le fichier
#include <QString> // Stocke le contenu du fichier
#include <QTextStream> // Flux sortant du fichier


#include <QTcpSocket> // pour pouvoir utiliser les fonctions d'envoi de mail


.
.
.
// CODE
.
.
.
.
.

void MainWindow::on_pushButton_2_clicked()
{
Smtp *newMail = new Smtp("opsdu83000@gmail.com","opsdu83@gmail.com"," Your Subject = Test envoi mail","My body text = Hello!!");
delete newMail;
}



Ma classe smtp.cpp :

#include "smtp.h"

Smtp::Smtp( const QString &from, const QString &to, const QString &subject, const QString &body )
{
socket = new QTcpSocket( this );

connect( socket, SIGNAL( readyRead() ), this, SLOT( readyRead() ) );
connect( socket, SIGNAL( connected() ), this, SLOT( connected() ) );


connect( socket, SIGNAL(error(SocketError)), this, //PROBLEME
SLOT(errorReceived(SocketError)));
connect( socket, SIGNAL(stateChanged( SocketState)), this, //PROBLEME
SLOT(stateChanged(SocketState)));
connect(socket, SIGNAL(disconnectedFromHost()), this, //PROBLEME
SLOT(disconnected()));


message = "To: " + to + "\n";
message.append("From: " + from + "\n");
message.append("Subject: " + subject + "\n");
message.append(body);
message.replace( QString::fromLatin1( "\n" ), QString::fromLatin1( "\r\n" ) );
message.replace( QString::fromLatin1( "\r\n.\r\n" ),
QString::fromLatin1( "\r\n..\r\n" ) );
this->from = from;
rcpt = to;
state = Init;

socket->connectToHost("smtp.sfr.fr", 25);//smtp.yourserver.com ou localhost !!!!!!!!!!!! A VOIR !!!!!!!!!!!!

if(socket->waitForConnected ( 30000 )) {qDebug("connected"); }

t = new QTextStream( socket );
}
Smtp::~Smtp()
{
delete t;
delete socket;
}
void Smtp::stateChanged(QTcpSocket::SocketState socketState)
{

qDebug() <<"stateChanged " << socketState;
}

void Smtp::errorReceived(QTcpSocket::SocketError socketError)
{
qDebug() << "error " <<socketError;
}

void Smtp::disconnected()
{

qDebug() <<"disconneted";
qDebug() << "error " << socket->errorString();
}

void Smtp::connected()
{
output.append("connected");
qDebug() << "Connected ";
}

void Smtp::readyRead()
{

qDebug() <<"readyRead";
// SMTP is line-oriented

QString responseLine;
do
{
responseLine = socket->readLine();
response += responseLine;
}
while ( socket->canReadLine() && responseLine[3] != ' ' );

responseLine.truncate( 3 );


if ( state == Init && responseLine[0] == '2' )
{
// banner was okay, let's go on

*t << "HELO there\r\n";
t->flush();

state = Mail;
}
else if ( state == Mail && responseLine[0] == '2' )
{
// HELO response was okay (well, it has to be)

*t << "MAIL FROM: " << from << "\r\n";
t->flush();
state = Rcpt;
}
else if ( state == Rcpt && responseLine[0] == '2' )
{

*t << "RCPT TO: " << rcpt << "\r\n"; //r
t->flush();
state = Data;
}
else if ( state == Data && responseLine[0] == '2' )
{

*t << "DATA\r\n";
t->flush();
state = Body;
}
else if ( state == Body && responseLine[0] == '3' )
{

*t << message << "\r\n.\r\n";
t->flush();
state = Quit;
}
else if ( state == Quit && responseLine[0] == '2' )
{

*t << "QUIT\r\n";
t->flush();
// here, we just close.
state = Close;
emit status( tr( "Message sent" ) );
}
else if ( state == Close )
{
deleteLater();
return;
}
else
{
// something broke.
QMessageBox::warning( 0, tr( "Qt Mail Example" ), tr( "Unexpected reply from SMTP server:\n\n" ) + response );
state = Close;
}
response = "";
}


Voilà, je penses qu'il ne manque rien niveau code.

Donc il est temps de venir au problème. Quand je compile tout mon projet aucune erreur n'est déclarée.
Il s’exécute correctement également.
Mais quand je viens à cliquer sur mon bouton "envoyer" voilà ce qui s'affiche en sortie de mon application :

Démarrage de C:\Users\OPS83\Desktop\build-interface_mail_essai1-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug\interface_mail_essai1.exe...QObject::connect: No such signal QTcpSocket::error(SocketError) in ..\Interface mail\interface_mail_essai1\smtp.cpp:11
QObject::connect: No such signal QTcpSocket::stateChanged( SocketState) in ..\Interface mail\interface_mail_essai1\smtp.cpp:13
QObject::connect: No such signal QTcpSocket::disconnectedFromHost() in ..\Interface mail\interface_mail_essai1\smtp.cpp:15
Connected
connected
C:\Users\OPS83\Desktop\build-interface_mail_essai1-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug\interface_mail_essai1.exe a quitté avec le code 0
Bien évidemment, aucun mail n'a été envoyé.
Après plusieurs recherche sur ce problème, je n'ai rien trouvé de très concluant.

En espérant rien avoir oublié, j'espère qu'on pourra trouver une solution ensemble.
En remerciant bien évidement d'avance ceux qui auront pu m'aider :)

OPS83
«1

Réponses

  • June 2015 modifié
    Attention, le fait d'utiliser les macros SIGNAL() et SLOT() qui traitent leur paramètre comme une chaîne de caractères empêche le compilateur de vérifier que la signature du signal/slot est valide au moment du build, mais seulement au runtime.

    Essaie ça à tout hasard:

    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(errorReceived(QAbstractSocket::SocketError)));
  • Tout d'abord merci pour ta réponse.
    andariel06 said:

    le fait d'utiliser les macros SIGNAL() et SLOT() qui traitent leur paramètre comme une chaîne de caractères empêche le compilateur de vérifier que la signature du signal/slot est valide au moment du build
    Donc si je comprends bien, le fait de ne pas avoir d'erreurs lors de la compilation viendrait de là ? :o

    En tout cas j'ai rajouté le "QabstractSocket::" comme tu l'as suggéré, mais malheureusement rien n'a changé. Que ce soit durant la compilation (toujours pas d'erreurs) ou bien quand je clique sur "envoyer" (toujours le "No such signal ...").
  • Hello,

    Pour avoir un message d'erreur a la compilation, utilise la nouvelle notation introduite avec Qt5 pour faire les connect (En plus tu peux connecter des methodes qui ne sont pas slots avec cette syntaxe).
  • refracto said:

    utilise la nouvelle notation introduite avec Qt5 pour faire les connect
    J'ai malheureusement surement oublié de mentionner que je ne suis encore qu'un novice sur Qt, du coup je ne comprends pas de quelle notation tu parles.
    Comment doit-on faire pour l’appliquer/l'utiliser ?
  • Bonjour,

    As-tu essayé ceci
    et pour les pièces jointes ceci

    C'est très simple d'utilisation et c'est du Qt5
  • Je débute également avec Qt mais j'aimerais avoir confirmation ou exemples concernant cette affirmation:
    refracto said:
    (En plus tu peux connecter des methodes qui ne sont pas slots avec cette syntaxe).
    Car ça va complètement à l'inverse de ce que j'ai appris à ce jour.

    Merci
  • Tout d'abord merci pour ta réponse babaOroms
    babaOroms said:

    As-tu essayé ceci
    et pour les pièces jointes ceci
    J'ai bien essayer ton premier lien (je cherche simplement à envoyer un mail, pas besoin de pièce jointe).
    Je l'ai en premier temps essayer directement dans mon application, mais bon sans surprise ça ne fonctionnait pas (l'espoir fait vivre :D ).
    Je l'ai donc repris en essayant de le faire marcher seul cette fois.
    J'ai remarqué une petite erreur d'ailleurs dans le mainwindow.cpp pour utiliser la classe :

    smtp = new Smtp("your_username@gmail.com", "your_password", "smtp.gmail.com");
    connect(smtp, SIGNAL(status(QString)), this, SLOT(mailSent(QString)));


    smtp->sendMail("sent_from@gmail.com", "send_it_to@gmail.com" , "This is a subject","This is a body")
    Il manque ici le Smpt* sur la 1ère ligne :D

    En le mettant à ma sauce j'ai donc :


    Smtp *smtp = new Smtp("opsdu83000@gmail.com", "MonMotDePasse", "smtp.gmail.com");
    connect(smtp, SIGNAL(status(QString)), this, SLOT(mailSent(QString))); // SOUCIS VENANT PEUT ETRE DE LA


    smtp->sendMail("opsdu83000@gmail.com", "opsdu83@gmail.com" , "This is a subject","This is a body");
    Encore une fois lorsque je compile, il n'y a rien à signaler.
    Mais lorsque je clique sur mon bouton "envoyer", j'obtiens à la sortie de l'application le message suivant :

    Démarrage de C:\Users\OPS83\Desktop\build-interface_mail_essai1-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug\interface_mail_essai1.exe...stateChanged QAbstractSocket::HostLookupState
    stateChanged QAbstractSocket::ConnectingState
    stateChanged QAbstractSocket::ConnectedState
    Connected
    readyRead
    Server response code: "220"
    Server response: "220 mx.google.com ESMTP pg1sm2157299wjb.39 - gsmtp
    "
    readyRead
    Server response code: "250"
    Server response: "250-mx.google.com at your service, [93.3.220.135]
    250-SIZE 35882577
    250-8BITMIME
    250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN XOAUTH
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-CHUNKING
    250 SMTPUTF8
    "
    QSslSocket::startClientEncryption: cannot start handshake on non-plain connection
    "Unknown error"
    readyRead
    Server response code: "250"
    Server response: "250-mx.google.com at your service, [93.3.220.135]
    250-SIZE 35882577
    250-8BITMIME
    250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN XOAUTH
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-CHUNKING
    250 SMTPUTF8
    "
    Auth
    readyRead
    Server response code: "334"
    Server response: "334 VXNlcm5hbWU6
    "
    Username
    readyRead
    Server response code: "334"
    Server response: "334 UGFzc3dvcmQ6
    "
    Pass
    readyRead
    Server response code: "534"
    Server response: "534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbuuF
    534-5.7.14 P3s1LreY3AufJAFmtlfDZ9qWzUOUn5us1pNMDd0DLh5MkclL6IyvT0rEKpgtZDxtVAF-bR
    534-5.7.14 my0J9vLs4uALpbp9MFabm4rk_lxyDzCp8SgSOuA76Fy07RS5ny3AfW1JHawunAtZZs1wQN
    534-5.7.14 emViKO8FkBS7CZQzETkbSwkhAGew2BtbQvHRUWds8beJw2LZaBOhJf0Pus5Aaq8sJl56hO
    534-5.7.14 hO4OHSaYpmSHFLUnR7th0eBY3aIQ> Please log in via your web browser and
    534-5.7.14 then try again.
    534-5.7.14 Learn more at
    534 5.7.14 https://support.google.com/mail/answer/78754 pg1sm2157299wjb.39 - gsmtp
    "
    C:\Users\OPS83\Desktop\build-interface_mail_essai1-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug\interface_mail_essai1.exe a quitté avec le code 0
    Le mail se s'envoi toujours pas d'ailleurs et le lien fournit en bas du message de l'application ne fonctionne pas.
    Je penses que le problème viendrais alors de la ligne que j'ai indiquer par "SOUCIS VENANT PEUT ETRE DE LA" (c'est d'ailleurs la ligne que l'application m'indique)
    Du coup, je me pose la question, de savoir si ça ne viendrait pas des QString présent dans status() et mailsent() de la même ligne ? :o
    QString est bien un type ? Comme un "int", un "float", un "double" ou autre... Il ne faudrait pas du coup le nom de la variable ? Si oui laquelle ?


    PS : Il se peut que je sois maladroit au niveau des noms que j’attribue aux choses. J'ai encore du mal avec Qt.
  • Rassures toi, nous aussi on rencontre encore des trucs que l'on ne connais encore sur Qt, c'est dans l'ordre des choses ;)
  • Salut,
    J'ai testé l'exemple fourni par babaOroms : https://github.com/xcoder123/SimpleSmtp_SSL_QT5
    et il fonctionne très bien. Et sans rien faire. Il n'y a pas d'erreur dans le dépôt git.
  • June 2015 modifié
    Bonsoir loupium
    loupium said:

    J'ai testé l'exemple fourni par babaOroms : https://github.com/xcoder123/SimpleSmtp_SSL_QT5
    et il fonctionne très bien. Et sans rien faire. Il n'y a pas d'erreur dans le dépôt git.

    Oh c'est intéressant à savoir ! Tu l'as pris tel quel ? Sans rien modifier (si ce n'est ajouter le Smtp* manquant et mettre les bonnes adresses mail) ? :o

    Si c'est exact, cela voudrait dire que c'est mon environnement de compilation qui ne va pas, non ?
    Pourrais tu me donner les conditions de ton environnement de compilation ? (compiler, les librairies etc...)

    Je suis sur Qt version 5.1.1 serait-ce à cause de ça sinon ? Trop récente/vieille version peut être ?
  • (si ce n'est ajouter le Smtp* manquant et mettre les bonnes adresses mail) ?
    Non, je n'ai vraiment rien modifié !

    * Télécharge le dépôt SimpleSmtp_SSL_QT5 : https://github.com/xcoder123/SimpleSmtp_SSL_QT5
    * Il y a 2 dossier. Rentre dans le premier nommé "smtp"
    * Ouvre le fichier .pro avec QtCreator.
    * QtCreator doit te demander de configurer le projet (car première ouverture)
    * Sélectionne un de tes kit. Perso j'ai utilisé "Qt 5.4.2 MinGW 32bit"
    * Compiler
    * Lance l'application
    * Remplis correctement les champs
    * Send
    * Une boite de dialogue doit t'indiquer si le message a été correctement envoyé.
    * Et regarde la fenêtre "sortie de l'application" dans QtCreator si cela fonctionne pas.
  • Moricio said:
    Je débute également avec Qt mais j'aimerais avoir confirmation ou exemples concernant cette affirmation:
    [quote=refracto](En plus tu peux connecter des methodes qui ne sont pas slots avec cette syntaxe).
    Car ça va complètement à l'inverse de ce que j'ai appris à ce jour.

    Merci[/quote]
    Hello,
    Plutot qu'un long discours, voici une page qui explique les choses mieux que je ne le ferais :
    https://wiki.qt.io/New_Signal_Slot_Syntax

  • QSslSocket::startClientEncryption: cannot start handshake on non-plain connection
    Moi il y a ce message qui m'interpelle...
    Tu n'utilises pas de QSslSocket dans ton programme, donc je ne vois pas bien d'où il peut provenir ?

    Est-ce que le serveur de mail auquel tu essaies de te connecter est sécurisé ? Si tu essaies de t'y connecter via un navigateur, l'URL est préfixée par "http://" ou "https://" ?
  • Bonjour loupium, je suis aller chercher le code sur http://morf.lv/modules.php?name=tutorials&lasit=20 à la ligne "Download exemple code".
    loupium said:

    Non, je n'ai vraiment rien modifié !
    * Télécharge le dépôt SimpleSmtp_SSL_QT5 : https://github.com/xcoder123/SimpleSmtp_SSL_QT5
    * Il y a 2 dossier. Rentre dans le premier nommé "smtp"
    * Ouvre le fichier .pro avec QtCreator.
    * QtCreator doit te demander de configurer le projet (car première ouverture)
    * Sélectionne un de tes kit. Perso j'ai utilisé "Qt 5.4.2 MinGW 32bit"
    * Compiler
    * Lance l'application
    * Remplis correctement les champs
    * Send
    * Une boite de dialogue doit t'indiquer si le message a été correctement envoyé.
    * Et regarde la fenêtre "sortie de l'application" dans QtCreator si cela fonctionne pas.
    Alors, j'ai donc suivi les toutes les étapes que tu m'as suggéré de faire.
    J'ai eu effectivement eu une étape de configuration du projet.
    Par défaut Qt m'a proposé :
    - Debug : C:\Users\OPS83\Desktop\envoi mail fonctionne\build-smtp-Desktop_Qt_5_1_1_MinGW_32bit-Debug
    - Release : C:\Users\OPS83\Desktop\envoi mail fonctionne\build-smtp-Desktop_Qt_5_1_1_MinGW_32bit-Release
    Cela semblait correspondre à la même chose que toi, juste une différente version de Qt.

    Ensuite j'ai donc compilé, pas de problème à signaler. J'exécute le code, je remplis les champs requis et puis j'envoi. Mais rien à faire cela ne fonctionne pas. :(
    Voilà avec quoi je me retrouve (j'ai pris un petit screen) : http://i.imgur.com/fRiQBmJ.png

    Quand à la sortie de l'application Qt je me retrouve avec les lignes suivante :

    Démarrage de C:\Users\OPS83\Desktop\envoi mail fonctionne\build-smtp-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug\smtp.exe...stateChanged QAbstractSocket::HostLookupState
    stateChanged QAbstractSocket::ConnectingState
    stateChanged QAbstractSocket::ConnectedState
    Connected
    readyRead
    Server response code: "220"
    Server response: "220 mx.google.com ESMTP gz3sm1838813wib.0 - gsmtp
    "
    readyRead
    Server response code: "250"
    Server response: "250-mx.google.com at your service, [93.7.8.143]
    250-SIZE 35882577
    250-8BITMIME
    250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN XOAUTH
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-CHUNKING
    250 SMTPUTF8
    "
    QSslSocket::startClientEncryption: cannot start handshake on non-plain connection
    "Unknown error"
    readyRead
    Server response code: "250"
    Server response: "250-mx.google.com at your service, [93.7.8.143]
    250-SIZE 35882577
    250-8BITMIME
    250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN XOAUTH
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-CHUNKING
    250 SMTPUTF8
    "
    Auth
    readyRead
    Server response code: "334"
    Server response: "334 VXNlcm5hbWU6
    "
    Username
    readyRead
    Server response code: "334"
    Server response: "334 UGFzc3dvcmQ6
    "
    Pass
    readyRead
    Server response code: "534"
    Server response: "534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbtqb
    534-5.7.14 VgVcOyPtBwZbockVTB_Fuj2FEzwSDMNfJYCaXE1AiAWJgUzK9YwdKbe5GRFhVWBplRlJr0
    534-5.7.14 LJNoUBwiG06sjv7MrmGXvcTmDpxH1LeZrUoICuB8SDg3ntGJscH-xNdMPYOCsBTCwc2Cdl
    534-5.7.14 jDIC8T_cb6w0xfTKnpDGTSEolFeeJ546BFhxiyUbwVFKIT5wvr-nI-57_0v7VvcdN5WONu
    534-5.7.14 7OR72qlhH_2Xsq5CbF1D229iTcls> Please log in via your web browser and
    534-5.7.14 then try again.
    534-5.7.14 Learn more at
    534 5.7.14 https://support.google.com/mail/answer/78754 gz3sm1838813wib.0 - gsmtp
    "
    C:\Users\OPS83\Desktop\envoi mail fonctionne\build-smtp-Desktop_Qt_5_1_1_MinGW_32bit-Debug\debug\smtp.exe a quitté avec le code 0
    Ce qui revient au final au même problème que j'avais précédemment. D'où le problème peut-il donc bien venir ? :o
  • Bonjour andariel06,
    andariel06 said:

    Tu n'utilises pas de QSslSocket dans ton programme, donc je ne vois pas bien d'où il peut provenir ?
    Effectivement, j'ai vérifié toutes mes lignes aucun QSslSocket de présent, seulement un QTcpSocket.
    andariel06 said:

    Est-ce que le serveur de mail auquel tu essaies de te connecter est sécurisé ? Si tu essaies de t'y connecter via un navigateur, l'URL est préfixée par "http://" ou "https://" ?
    Eh bien, je cherche à envoyer des mail à n'importe quel type de mail (gmail, yahoomail, aol, outlook...). Et donc l'URL est préfixée pas "https://".
    Concernant la connexion serveur, vu que je passe par le FAI sfr, j'ai donc mis la chose suivante :
    socket->connectToHost("smtp.sfr.fr", 25);

    Voilà, j'espère avoir bien répondu à ta question. Tu aurais à tout hasard une idée en tête ?
  • June 2015 modifié
    j'ai une nouvelle fois testé avec Desktop_Qt_5_1_1_MinGW_32bit-Debug et l'exemple fonctionne parfaitement.

    [quote]QSslSocket::startClientEncryption: cannot start handshake on non-plain connection.
    Moi il y a ce message qui m'interpelle...
    [/quote]J'ai aussi ce message mais cela n’empêche pas son envoi.

    Fait un test en désactivant se paramètre : https://www.google.com/settings/security/lesssecureapps

    Utilises tu la validation en deux étapes ? https://support.google.com/accounts/answer/6009563

    Essaie d'installer openssl : https://www.openssl.org/
  • loupium said:

    J'ai aussi ce message mais cela n’empêche pas son envoi.
    Ok, mais ce message ne m'a pas l'air normal quand même: si le code n'utilise pas de QSslSocket pourquoi ce message est-il retourné ? Et par qui ?
    Y a-t-il une librairie tierce (utilisant donc Qt) utilisée quelque part ?
  • Bonjour loupium,
    loupium said:

    Fait un test en désactivant se paramètre : https://www.google.com/settings/security/lesssecureapps
    Il était déjà sur désactiver par défaut.
    loupium said:

    Essaie d'installer openssl : https://www.openssl.org/
    J'ai alors téléchargé openssl sur https://slproweb.com/products/Win32OpenSSL.html en ayant suivi cet vidéo.
    Je lance l'exécution puis l'installation. J'arrive alors au moment où j'ai un dossier "OpenSSL -Win64" dans mon disque C:\
    Après cela quoi faire ? Comment faire pour que l'application Qt le prenne en compte ?
    J'ai réessayer l'envoi du mail après l'installation de OpenSSL au cas où, mais ça ne fonctionne toujours pas.

    PS : Tu sembles t'en sortir là dessus, tu penses pouvoir m'ajouter sur skype histoire de ne pas trop "polluer" le post et te montrer ce que j'ai plus en détails ? Si oui, tu peux m'ajouter au nom de "opsdu83". Merci.
  • Pour utiliser OpenSSL avec Qt5 tu dois modifier les options de déploiement de ton projet, parce que ce sont les librairies OpenSSL qui sont utilisées par Qt:
    tu as des infos ici sur ce sujet

    Mais si tu décides de faire ça, de toute manière, tu devras modifier ton code je pense parce que tu n'utilises pas de socket SSL (QSslSocket) mais des sockets TCP non sécurisées...
  • June 2015 modifié
    OpenSSL -Win64
    Prends du 32bit pour l'instant car tu compiles en 32bit. Installe cette version : Win32 OpenSSL v1.0.2a : https://slproweb.com/download/Win32OpenSSL-1_0_2a.exe
    Et ça devrait fonctionner sur ton poste de dev.

    Pour info, ajoute dans le main de l'exemple :

    #include <QDebug>
    #include <QSslSocket>
    ...
    qDebug() << "test : ssl is ready : " << QSslSocket::supportsSsl();
    Il faut que supportsSsl() renvoi true.
  • June 2015 modifié
    andariel06 said:

    tu devras modifier ton code je pense parce que tu n'utilises pas de socket SSL (QSslSocket)
    Oui effectivement, je m'en suis rendu compte. C'est pour ça que j'essaye de me rabattre sur le programme smtp qu'on m'a indiqué. Malheureusement il ne fonctionne pas de mon côté alors que pour loupium il fonctionne parfaitement.
    loupium said:

    Prends du 32bit pour l'instant car tu compiles en 32bit
    Bon eh bien jusque là tout se passe bien. Pas de problème lors de l'installation.
    Je rajoute ensuite les lignes que tu m'as confié dans mon main. Compilation réussi, mais lors de l'envoi du mail, le même problème revient encore alors que supportSsl() renvoie true.
    Voilà le screen : http://i.imgur.com/9lmMEzJ.png

    PS : J'ai également rajouter "C:\OpenSSL-Win32" dans mes variables d'environnement PATH
  • June 2015 modifié
    Je commence à sécher un peu.
    Je commence aussi a avoir des doutes sur le compte Gmail.
    As tu un compte Gmail de test (avec rien dessus et un MdP bidon) à me filer temporairement en Message Privé ?
  • Je sèche aussi,
    j'avais testé ce code sur un mac avec le smtp de free et c'était passé sous soucis, et là sous windows,
    j'ai testé gmail, notre smtp chez ovh et orange : aucun mail est envoyé.
    Je pousserai l'investigation quand j'aurai du temps.
  • June 2015 modifié
    Bonjour à tous !
    Enfin une bonne nouvelle ! :D

    Après avoir suivi les directives de loupium :
    loupium said:

    Prends du 32bit pour l'instant car tu compiles en 32bit. Installe cette version : Win32 OpenSSL v1.0.2a : https://slproweb.com/download/Win32OpenSSL-1_0_2a.exe
    Et ça devrait fonctionner sur ton poste de dev.
    Pour info, ajoute dans le main de l'exemple :
    #include
    #include
    ...
    qDebug()
    Cela ne fonctionnait toujours pas. Mais après un redémarrage de mon ordi, j'ai réessayer à plusieurs reprise. Et au final, j'ai fini par recevoir une notification sur mon compte gmail me signalant qu'un autre appareil a essayé de se connecter sur mon compte. J'ai donc indiqué qu'il s'agissait de moi, ce qui m'a amené à choisir de baisser la sécurité du compte, de la manière suivante (petit screen) : http://i.imgur.com/KGSqEYw.png

    Ce qui a fini par me rappeler un ancien message de loupium :
    loupium said:

    Fait un test en désactivant se paramètre : https://www.google.com/settings/security/lesssecureapps
    C'est juste qu'il fallait "activer" et non "désactiver".

    Après ça j'ai de nouveau redémarrer mon ordi (au cas où).
    En relançant le programme, puis en l'exécutant, j'ai à ma grande surprise enfin reçu le tant recherché "Message sent" Et là, quel soulagement ! :lol:

    Voilà ce que j'ai pu envoyer (screen) : http://i.imgur.com/7uiRGE1.png

    Juste petit regret, j'ai essayer d'envoyer à une autre adresse que gmail.com, (ici hotmail/outlook), le message a été reçu dans la rubrique "courrier indésirable".

    Bon maintenant, je dois utiliser ce programme histoire de l'utiliser dans mon application qui dispose déjà de sa propre interface graphique mail.
    Encore pas mal de taf, mais bon je penses que le plus compliqué est derrière moi (je l'espère en tout cas, et puis vous êtes toujours là :D )

    Un grand merci à tous !
  • June 2015 modifié

    C'est juste qu'il fallait "activer" et non "désactiver".
    Effectivement, j'ai été un peu vite.
    Mais je m'en doutais vu le message d'érreur :

    Server response code : 534
    Please log in via your web browser
  • Bonjour,

    dans cette instruction :
    Smtp *smtp = new Smtp("opsdu83000@gmail.com", "MonMotDePasse", "smtp.gmail.com");

    De quel mot de passe s'agit-il ?

    Salutations.
  • Bonsoir,
    C'est le Mot de passe utilisateur de ton compte mail.
    Pourquoi, tu pensais a quoi d'autre sinon ?
  • 21 Feb modifié
    Bonjour,

    Je suis surpris par ce mot de passe car en PHP on peut envoyer un mail sans préciser de mot de passe compte mail. En C j'ai repris un code qui envoie un mail sans ce mot de passe. Le code Qt ne fonctionne pas ( protocole non reconnu ).
    Ce qui marche :

    /************* .h ****************************/
    #ifndef CLIENT_SMTP_H
    #define CLIENT_SMTP_H

    #ifdef WIN32

    #include <winsock2.h>

    #elif defined (linux)

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h> /* close */
    #include <netdb.h> /* gethostbyname */
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(s) close(s)


    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    typedef struct in_addr IN_ADDR;

    #else

    #error not defined for this platform

    #endif

    #define EHLO "EHLO"
    #define MAIL_FROM "MAIL FROM:"
    #define RCPT_TO "RCPT TO:"
    #define DATA "DATA"
    #define END_DATA "."
    #define QUIT "QUIT"
    #define PORT 25 // ou autre
    #define BUF_SIZE 4096
    #define CRLF "\r\n"

    static void init(void);
    static void end(void);
    static void app(const char *filename);
    static void read_server(SOCKET sock, char *buffer);
    static void write_server(SOCKET sock, char *buffer);
    static void send_message(FILE *file, SOCKET sock, char *buffer);
    static void get_line(FILE *file, char *buffer);
    static void get_and_send_rcpts(SOCKET sock, FILE *file);

    #endif /* guard */


    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>

    /********************************************************************************/
    /*********** .c ******************************************************************/
    #include "osmtp.h"

    static void init(void)
    {
    #ifdef WIN32
    WSADATA wsa;
    int err = WSAStartup(MAKEWORD(2, 2), &wsa);
    if(err < 0)
    {
    puts("WSAStartup failed !");
    exit(EXIT_FAILURE);
    }
    #endif
    }

    static void end(void)
    {
    #ifdef WIN32
    WSACleanup();
    #endif
    }

    static void app(const char *filename)
    {
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN sin;
    struct hostent *hostinfo;
    char command[BUF_SIZE];
    char buffer[BUF_SIZE];
    FILE *file = NULL;

    file = fopen(filename, "r");

    if(file == NULL)
    {
    perror("fopen()");
    exit(errno);
    }

    if(sock == INVALID_SOCKET)
    {
    perror("socket()");
    exit(errno);
    }

    get_line(file, buffer);

    hostinfo = gethostbyname(buffer);
    if (hostinfo == NULL)
    {
    fprintf (stderr, "Unknown host %s.\n", buffer);
    exit(EXIT_FAILURE);
    }

    sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr;
    sin.sin_port = htons(PORT);
    sin.sin_family = AF_INET;

    if(connect(sock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR)
    {
    perror("connect()");
    exit(errno);
    }

    /* read response */
    read_server(sock, buffer);
    puts(buffer);

    /* send EHLO */
    get_line(file, buffer);
    sprintf(command, "%s %s%s", EHLO, buffer, CRLF);
    write_server(sock, command);

    /* read response */
    read_server(sock, buffer);
    puts(buffer);

    /* send MAIL FROM */
    get_line(file, buffer);
    sprintf(command, "%s<%s>%s", MAIL_FROM, buffer, CRLF);
    write_server(sock, command);

    /* read response */
    read_server(sock, buffer);
    puts(buffer);

    /* send RCTP TO */
    get_and_send_rcpts(sock, file);

    /* read response */
    read_server(sock, buffer);
    puts(buffer);

    /* send DATA */
    sprintf(command, "%s%s", DATA, CRLF);
    write_server(sock, command);

    /* read response */
    read_server(sock, buffer);
    puts(buffer);

    /* send body of the message */
    send_message(file, sock, buffer);
    fclose(file), file = NULL;

    /* send the mark of the end of the message */
    sprintf(command, "%s%s%s", END_DATA, CRLF, CRLF);
    write_server(sock, command);

    /* read response */
    read_server(sock, buffer);
    puts(buffer);

    /* send QUIT */
    sprintf(command, "%s%s", QUIT, CRLF);
    write_server(sock, command);

    /* read response */
    read_server(sock, buffer);
    puts(buffer);

    closesocket(sock);
    }

    static void read_server(SOCKET sock, char *buffer)
    {
    char *p;
    int n = 0;

    if((n = recv(sock, buffer, BUF_SIZE - 1, 0)) < 0)
    {
    perror("recv()");
    exit(errno);
    }

    if(n == 0)
    {
    printf("Connection lost\n");
    exit(EXIT_FAILURE);
    }

    buffer[n] = 0;

    p = strstr(buffer, CRLF);

    if(p != NULL)
    {
    *p = 0;
    }
    }

    static void write_server(SOCKET sock, char *buffer)
    {
    if(send(sock, buffer, strlen(buffer), 0) < 0)
    {
    perror("send()");
    exit(errno);
    }
    }

    static void get_line(FILE *file, char *buffer)
    {
    if(fgets(buffer, BUF_SIZE, file) != NULL)
    {
    char *p;

    p = strchr(buffer, '\n');

    if(p != NULL)
    {
    *p = 0;
    }
    else
    {
    int c;

    while((c = fgetc(file)) != '\n' && c != EOF)
    {
    }
    }
    }
    else if(!feof(file))
    {
    puts("Error read file !");
    }
    }

    static void get_and_send_rcpts(SOCKET sock, FILE *file)
    {
    char buffer[BUF_SIZE];
    char *rcpt = NULL;

    if(fgets(buffer, BUF_SIZE, file) != NULL)
    {
    char *p;

    p = strchr(buffer, '\n');

    if(p != NULL)
    {
    *p = 0;
    }
    else
    {
    int c;

    while((c = fgetc(file)) != '\n' && c != EOF)
    {
    }
    }
    }
    else if(!feof(file))
    {
    puts("Error read file !");
    }

    rcpt = strtok(buffer, ",");

    while(rcpt != NULL)
    {
    char command[BUF_SIZE];
    sprintf(command, "%s<%s>%s", RCPT_TO, rcpt, CRLF);
    write_server(sock, command);

    rcpt = strtok(NULL, ",");
    }
    }

    static void send_message(FILE *file, SOCKET sock, char *buffer)
    {
    char message[BUF_SIZE];

    while(fgets(buffer, BUF_SIZE, file) != NULL)
    {
    char *p = strchr(buffer, '\n');
    if(p != NULL)
    {
    *p = 0;
    sprintf(message, "%s%s", buffer, CRLF);
    write_server(sock, message);
    }
    else
    {
    int c;

    write_server(sock, buffer);

    while ((c = fgetc(file)) != '\n' && c != EOF)
    {
    char ch = c;
    write_server(sock, &ch);
    }

    write_server(sock, CRLF);
    }
    }

    if(!feof(file))
    {
    puts("Error read file !");
    exit(EXIT_FAILURE);
    }
    }

    int main(int argc, char **argv)
    {
    if(argc < 2)
    {
    printf("Usage : %s [filename]\n", argv[0]);
    return EXIT_FAILURE;
    }

    init();

    app(argv[1]);

    end();

    return EXIT_SUCCESS;
    }


    avec un fichier à lire de type :
    /*******
    smtp.car.fr
    localhost
    toto.dominique@car.fr
    toto.dominique@car.fr
    From: "toto"
    To: "titi"
    Subject: Test smtp ballon

    Bonjour,
    Test pour le programme C.
    Envoi express de haricots blancs
    avec 5 bouteilles de vin rouge.
    */
    Pas besoin de mot de passe.

    Salutations.
  • Je ne suis pas suffisamment caler au niveau réseau, mais cela me parait étrange qu'il n'y a pas de Mot de passe.
    Car si cela était le cas, l'usurpation d'adresse mail serait un jeu d'enfant.
  • Bonjour,

    Je pense qu'au moment de l'envoi l'adresse de l'émetteur doit correspondre à son IP sur la machine.
    Si je trompe l'adresse de l'émetteur l'envoie échoue.

    Cordialement.
Connectez-vous ou Inscrivez-vous pour répondre.