IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Compilation d'un projet C++/Qt avec la bibliothèque LIBCURL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Par défaut Compilation d'un projet C++/Qt avec la bibliothèque LIBCURL
    Problème de compilation d'un projet C++/Qt avec la librairie LIBCURL



    Bonjour à tous,
    J'essaye de faire exécuter un progmme en c++/qt en utilisant la librairie CURL
    voici mon fichier "main.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
    #include <QCoreApplication>
     
     
    #include <stdio.h>
    #include <string.h>
    #include <curl/curl.h>
    #include <sstream>
    #include <fstream>
    #include <iostream>
     
     
     
    /* The libcurl options want plain addresses, the viewable headers in the mail
     * can get a full name as well.
     */
    #define FROM_ADDR    "m.mourad@gmail.com"
    #define TO_ADDR      "moha@gmail.com"
    #define CC_ADDR      "moha@outlook.com"
     
    #define FROM_MAIL "Sender Person <" FROM_ADDR ">"
    #define TO_MAIL   "A Receiver <" TO_ADDR ">"
    #define CC_MAIL   "John CC Smith <" CC_ADDR ">"
     
    struct UploadStatus {
               int lines_read;
    };
     
    static const std::string payload_text[] = {
        "To: moha@gmail.com\r\n",
        "From: m.mourad@gmail.com\r\n",
        "Subject: Test Email with Attachment\r\n",
        "\r\n", /* empty line to divide headers from body */
        "This is a test email with an attachment.\r\n",
        nullptr // Change from NULL to nullptr
    };
     
    size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) {
               struct UploadStatus *upload_ctx = (struct UploadStatus *)userp;
               const char *data;
     
               if((size == 0) || (nmemb == 0) || ((size * nmemb) < 1)) {
                          return 0;
               }
     
               data = payload_text[upload_ctx->lines_read].c_str();
     
               if(data) {
                          size_t len = strlen(data);
                          memcpy(ptr, data, len);
                          upload_ctx->lines_read++;
                          return len;
               }
     
               return 0;
    }
     
    std::string read_file(const std::string &file_path) {
               std::ifstream file(file_path, std::ios::binary);
               std::ostringstream oss;
               oss << file.rdbuf();
               return oss.str();
    }
     
    int main(int argc, char *argv[]) {
     
               try
               {
               QCoreApplication a(argc, argv);
               CURL *curl;
               CURLcode res = CURLE_OK;
               struct curl_slist *recipients = nullptr;
               struct UploadStatus upload_ctx;
     
               upload_ctx.lines_read = 0;
     
               curl = curl_easy_init();
               if(curl)
               {
                          std::string attachment = read_file("messagetest.txt");
     
                          curl_easy_setopt(curl, CURLOPT_USERNAME, FROM_ADDR);
                          curl_easy_setopt(curl, CURLOPT_PASSWORD, "Mohamedmourad2024");
                          curl_easy_setopt(curl, CURLOPT_URL, "smtp://smtp.gmail.com:465");
                          curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);
                          curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM_ADDR);
     
                          recipients = curl_slist_append(recipients, TO_ADDR);
                          curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
                          curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
                          curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
                          curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
     
                          struct curl_slist *headers = nullptr;
                          headers = curl_slist_append(headers, "Content-Type: multipart/mixed; boundary=frontier");
                          curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
     
                          std::string body =
                              "--frontier\r\n"
                              "Content-Type: text/plain\r\n\r\n"
                              "This is a test email with an attachment.\r\n"
                              "--frontier\r\n"
                              "Content-Type: text/plain\r\n"
                              "Content-Disposition: attachment; filename=\"messagetest.txt\"\r\n\r\n" +
                              attachment + "\r\n"
                                           "--frontier--";
     
                          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
     
                          res = curl_easy_perform(curl);
     
                          if(res != CURLE_OK)
                          {
                                     fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
                          }
     
                          curl_slist_free_all(recipients);
                          curl_slist_free_all(headers);
                          curl_easy_cleanup(curl);
               }
     
               return a.exec();
               }
               catch (const std::logic_error& e)
               {
                          std::cerr << "Logic error: " << e.what() << std::endl;
                          return 1;
               }
               catch (const std::exception& e)
               {
                          std::cerr << "Exception: " << e.what() << std::endl;
                          return 1;
               }
               catch (...)
               {
                          std::cerr << "Unknown error occurred." << std::endl;
                          return 1;
               }
    }
    "
    et voici mon fichier pro
    "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    QT = core
    CONFIG += c++17 cmdline
     
    SOURCES += \
        main.cpp
     
    # Indiquez le chemin vers les bibliothèques libcurl et les fichiers d'en-tête
    LIBS += -L "C:/Data/Fichiers_applications/C++/LibrairiesExternes/curl-8.8.0_1-win64-mingw/lib" -lcurl
    INCLUDEPATH += "C:/Data/Fichiers_applications/C++/LibrairiesExternes/curl-8.8.0_1-win64-mingw/include"
     
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    "

    et quand je le lance ça provoque l'erreur suivante
    "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    16:06:05: Débogage de C:\Data\Fichiers_applications\C++\Projets_QtCreator\Tests\testCurlConsole\testCurlConsole\build\Desktop_Qt_6_2_4_MinGW_64_bit-Debug\debug\testCurlConsole.exe…
    terminate called after throwing an instance of 'std::logic_error'
      what():  basic_string::_M_construct null not valid
    16:06:05: La débogage de «*C:\Data\Fichiers_applications\C++\Projets_QtCreator\Tests\testCurlConsole\testCurlConsole\build\Desktop_Qt_6_2_4_MinGW_64_bit-Debug\debug\testCurlConsole.exe*» s’est terminé avec le code de sortie 3.
    "
    pourquoi cette erreur et comment la résoudre?

    Merci d'avance pour votre aide

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    Utilise un débogueur pour savoir à quel endroit le plantage se produit. Quelque part, un bout de ton code lance l'exception std::logic_exception : a priori, rien à voir avec Qt.

    Un truc un peu étrange dans ton code : l'utilisation de nullptr dans une chaîne de caractères, \0 serait plus attendu (même si le compilateur devrait déjà l'ajouter automatiquement), mais ça devrait fonctionner de la même manière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    static const std::string payload_text[] = {
        "To: moha@gmail.com\r\n",
        "From: m.mourad@gmail.com\r\n",
        "Subject: Test Email with Attachment\r\n",
        "\r\n", /* empty line to divide headers from body */
        "This is a test email with an attachment.\r\n",
        nullptr // Change from NULL to nullptr
    };
    Tant qu'à faire d'utiliser Qt : pourquoi ne pas s'intégrer plus dans l'écosystème pour envoyer ton courriel (plutôt que d'utiliser une bibliothèque C, par essence difficile à utiliser) ? Deux bibliothèques pour ça sont toujours maintenues (il y en a peut-être d'autres, mais je ne suis pas au courant) : https://github.com/bluetiger9/SmtpClient-for-Qt et https://github.com/cutelyst/simple-mail.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 16
    Par défaut
    Merci dourouc05 de ta réponse,
    je vais me rabattre sur ces librairies et je te tiendrai au courant

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/12/2014, 15h12
  2. Compiler un projet en .jar avec passage de paramètre
    Par djorfe dans le forum Général Java
    Réponses: 4
    Dernier message: 22/05/2008, 08h39
  3. Erreur lors de la compilation d'un projet avec maven
    Par cococinelle dans le forum Maven
    Réponses: 2
    Dernier message: 07/04/2008, 09h47
  4. Compiler un projet en C avec palib
    Par vedder dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 07/12/2007, 16h50
  5. Compiler un projet d'Unix avec Visual .NET
    Par Captain_JS dans le forum MFC
    Réponses: 1
    Dernier message: 05/02/2006, 23h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo