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

Qt Discussion :

Encoder un fichier PDF en base64 (envoi de pièce-jointe)


Sujet :

Qt

  1. #1
    Membre du Club Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    Par défaut Encoder un fichier PDF en base64 (envoi de pièce-jointe)
    Bonjour à tous,

    Je bloque sur un problème d'encodage en base64 avec un QByteArray.
    Lorsque j'encode ce fichier avec la méthode QByteArray::toBase64(), je me retrouve avec un contenu vide (QString) !

    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
     
    QFile file(cheminPJ);
    QByteArray pj;
     
    if(file.exists())
    {
        if(!file.open(QIODevice::ReadOnly))
        {
            QMessageBox::warning(0, tr("Ouverture impossible"), tr("Impossible de lire le fichier !\n\n"));
        }
        pj = file.readAll();
     
        message.append( "--frontier\n" );
        message.append("Content-Type: application/octet-stream\n");
        message.append("Content-Disposition: attachment; filename="+QFileInfo(file.fileName()).fileName()+";\nContent-Transfer-Encoding: base64\n\n");
        message.append(pj.toBase64());
        message.append("\n");
    }
    Pour info, le fichier est un PDF que je souhaite envoyer en pièce-jointe dans un message.
    J'utilise aussi QSslSocket pour échanger avec le serveur SMTP.
    La variable "message" est un QString.

    Est-ce dû à la taille du fichier PDF ?

    Merci d'avance pour votre aide !

    P.S. : qDebug() << pj.toBase64(); ne s'affiche pas dans la console !

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    As-tu inspecté le contenu du QByteArray ?

  3. #3
    Membre du Club Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    Par défaut
    Oui et non car le code ci-dessous n'affiche rien !
    J'ai essayé avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qDebug() << pj.count();
    et ça m'affiche 35737.

    enfin le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qDebug() << pj.toBase64().count();
    m'affiche 47652.

    Est-ce que le fait d'ajouter pj.toBase64() dans un QString ne passe pas ? Car qDebug() << message; ne s'affiche même pas dans la console !

    Merci pour ton aide.

    EDIT: qDebug() << message.length(); affiche 49413 !

  4. #4
    Membre du Club Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    Par défaut
    Peut-être que l'erreur se situe ailleurs ! voici ma méthode "test" au complet :
    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
    void Fen::sendEmail(QByteArray sendTo, QByteArray sujet, QString messageHTML, QString cheminPJ)
    {
        // **********************************************************************************
        //                               création du message
        // **********************************************************************************
        QSslSocket socketSsl;
     
        QString from = m_settings->value("Messagerie/mail","").toString();
        QByteArray user = m_settings->value("Messagerie/user","").toByteArray();
        QByteArray pass = m_settings->value("Messagerie/pass","").toByteArray();
        QString smtp = m_settings->value("Messagerie/smtp","").toString();
     
        QString message;
        message.append("To: <"+sendTo+">\n");
        message.append("From: \"sebmag\" <"+from+">\n");
        message.append("Subject: "+sujet+"\n\n");
     
        message.append("Mime-Version: 1.0\n");
        message.append("Content-Type: multipart/mixed; boundary=frontier\n\n");
     
        message.append("--frontier <br>Content-Type: text/html\n");
        message.append(messageHTML);
        message.append("\n\n");
     
        QFile file(cheminPJ);
        QByteArray pj;
     
        if(file.exists())
        {
            if(!file.open(QIODevice::ReadOnly))
            {
                QMessageBox::warning(0, tr("Ouverture impossible"), tr("Impossible de lire le fichier !\n\n"));
            }
            pj = file.readAll();
            qDebug() << "PJ =" << pj.toBase64().count();
     
            message.append( "--frontier\n" );
            message.append("Content-Type: application/octet-stream\n");
            message.append("Content-Disposition: attachment; filename="+QFileInfo(file.fileName()).fileName()+";\nContent-Transfer-Encoding: base64\n\n");
            message.append(pj.toBase64());
            message.append("\n");
        }
        else
        {
            qDebug() << "FICHIER INTROUVABLE";
        }
     
        message.append("--frontier--\n");
     
        qDebug() << "Message : " << message.length();
     
        message.replace(QString::fromLatin1("\n"), QString::fromLatin1( "\r\n" ));
        message.replace(QString::fromLatin1("\r\n.\r\n"),QString::fromLatin1("\r\n..\r\n"));
     
        // **********************************************************************************
        //                               Début de la connexion
        // **********************************************************************************
        socketSsl.connectToHost(smtp, 587);
        socketSsl.waitForReadyRead(20000);
        qDebug() << "Connected :" << QString(socketSsl.readAll());
     
        socketSsl.write("EHLO localhost\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "EHLO :" << QString(socketSsl.readAll());
     
        socketSsl.write("STARTTLS\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "STARTTLS :" << QString(socketSsl.readAll());
     
        socketSsl.startClientEncryption();
        if(!socketSsl.waitForEncrypted(10000))
        {
            qDebug() << "Erreur :" << socketSsl.errorString();
        }
     
        socketSsl.write("EHLO localhost\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "HELO encrypted :" << QString(socketSsl.readAll());
     
        socketSsl.write("AUTH LOGIN\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "AUTH LOGIN :" << QString(socketSsl.readAll());
     
        socketSsl.write(user.toBase64()+"\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "LOGIN :" << QString(socketSsl.readAll());
     
        socketSsl.write(pass.toBase64()+"\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "PASS :" << QString(socketSsl.readAll());
     
        socketSsl.write("MAIL FROM:<"+from.toLatin1()+">\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "MAIL FROM :" << QString(socketSsl.readAll());
     
        socketSsl.write("RCPT TO:<"+sendTo+">\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "RCPT TO :" << QString(socketSsl.readAll());
     
        socketSsl.write("DATA\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "DATA :" << QString(socketSsl.readAll());
     
        socketSsl.write(message.toLatin1());
        socketSsl.waitForReadyRead(20000);
        qDebug() << "Message :" << QString(socketSsl.readAll());
     
        socketSsl.write("QUIT\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "QUIT :" << QString(socketSsl.readAll());
    }

  5. #5
    Membre du Club Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    Par défaut
    Je viens de résoudre un premier problème ! (Merci pour votre aide). Ca venait de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    message.replace(QString::fromLatin1("\n"), QString::fromLatin1( "\r\n" ));
        message.replace(QString::fromLatin1("\r\n.\r\n"),QString::fromLatin1("\r\n..\r\n"));
    Le contenu était bien encodé en base64 mais les retours console étaient vide une fois le contenu encodé. Suite au code ci-dessus,
    la fin du message n'était pas reconnu par le serveur smtp et le message n'était pas envoyé ! Comme j'envoyais du HTML, la fin du message
    n'était pas "\r\n.\r\n". Voici mon nouveau code :
    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
    void Fen::sendEmail(QByteArray sendTo, QByteArray sujet, QString messageHTML, QString cheminPJ)
    {
        // **********************************************************************************
        //                               création du message
        // **********************************************************************************
        QSslSocket socketSsl;
     
        QString from = m_settings->value("Messagerie/mail","").toString();
        QByteArray user = m_settings->value("Messagerie/user","").toByteArray();
        QByteArray pass = m_settings->value("Messagerie/pass","").toByteArray();
        QString smtp = m_settings->value("Messagerie/smtp","").toString();
     
        QString message;
        message.append("From: \"sebmag\" <"+from+">\n");
        message.append("To: <"+sendTo+">\n");
        message.append("Subject: "+sujet+"\n\n");
     
        message.append("Mime-Version: 1.0\n");
        message.append("Content-Type: multipart/mixed; boundary=\"frontier\"\n\n");
     
        message.append("--frontier \nContent-Type: text/html\n");
        message.append(messageHTML);
        message.append("\n\n");
     
        QFile file(cheminPJ);
        QByteArray pj;
     
        if(file.exists())
        {
            if(!file.open(QIODevice::ReadOnly))
            {
                QMessageBox::warning(0, tr("Ouverture impossible"), tr("Impossible de lire le fichier !\n\n"));
                return;
            }
            pj = file.readAll();
     
            message.append( "--frontier\n" );
            message.append("Content-Type: application/octet-stream\n");
            message.append("Content-Disposition: attachment; filename="+QFileInfo(file.fileName()).fileName()+";\nContent-Transfer-Encoding: base64\n\n");
            message.append(pj.toBase64());
            message.append("\n");
        }
        else
        {
            qDebug() << "FICHIER INTROUVABLE";
        }
     
        message.append("--frontier--\n");
     
     
        //message.replace(QString::fromLatin1("\n"), QString::fromLatin1( "\r\n" ));
        //message.replace(QString::fromLatin1("\r\n.\r\n"),QString::fromLatin1("\r\n..\r\n"));
     
        // **********************************************************************************
        //                               Début de la connexion
        // **********************************************************************************
        socketSsl.connectToHost(smtp, 587);
        socketSsl.waitForReadyRead(20000);
        qDebug() << "Connected :" << QString(socketSsl.readAll());
     
        socketSsl.write("EHLO localhost\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "EHLO :" << QString(socketSsl.readAll());
     
        socketSsl.write("STARTTLS\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "STARTTLS :" << QString(socketSsl.readAll());
     
        socketSsl.startClientEncryption();
        if(!socketSsl.waitForEncrypted(10000))
        {
            qDebug() << "Erreur :" << socketSsl.errorString();
        }
     
        socketSsl.write("EHLO localhost\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "HELO encrypted :" << QString(socketSsl.readAll());
     
        socketSsl.write("AUTH LOGIN\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "AUTH LOGIN :" << QString(socketSsl.readAll());
     
        socketSsl.write(user.toBase64()+"\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "LOGIN :" << QString(socketSsl.readAll());
     
        socketSsl.write(pass.toBase64()+"\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "PASS :" << QString(socketSsl.readAll());
     
        socketSsl.write("MAIL FROM:<"+from.toLatin1()+">\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "MAIL FROM :" << QString(socketSsl.readAll());
     
        socketSsl.write("RCPT TO:<"+sendTo+">\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "RCPT TO :" << QString(socketSsl.readAll());
     
        socketSsl.write("DATA\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "DATA :" << QString(socketSsl.readAll());
     
        socketSsl.write(QByteArray().append(message) + "\r\n.\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "Message :" << QString(socketSsl.readAll());
     
        socketSsl.write("QUIT\r\n");
        socketSsl.waitForReadyRead(20000);
        qDebug() << "QUIT :" << QString(socketSsl.readAll());
    }
    Par contre, j'ai toujours un problème d'encodage qui doit se situer au niveau de l'en-tête du fichier.
    Je reçois bien le message mais c'est le code source (HTML) et le code source du fichier pdf joint qui
    est affiché dans le message.

    Quelqu'un aurait-il une idée ? Merci d'avance.

  6. #6
    Membre du Club Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    Par défaut
    Bon, j'ai résolu le problème tout seul du coup. C'était une erreur bête au niveau des sauts de ligne !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Macro pour sauvegarde pdf et envoie en pièce jointe automatique
    Par toast-nc dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/03/2015, 13h20
  2. Réponses: 2
    Dernier message: 01/11/2014, 11h27
  3. [PDF] Formulaire pdf envoie en pièces jointe
    Par stefano dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 01/04/2014, 09h34
  4. [AC-2010] Envoi par pièce jointe en pdf
    Par pascal5 dans le forum IHM
    Réponses: 32
    Dernier message: 16/04/2013, 15h57
  5. Réponses: 6
    Dernier message: 13/05/2009, 13h55

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