Annonce

Réduire
Aucune annonce.

Erreur commande SMTP, envoi de mail.

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Erreur commande SMTP, envoi de mail.

    Bonjour à tous

    J'essaie de faire un mail bomber en C++ depuis quelques jours et je rencontre un souci au niveau les commandes SMTP. Je me prend deux erreurs différentes:

    - Bad syntax
    - Improper use of SMTP command pipelining

    J'essaie de plusieurs façons.

    En un bloque:

    Code:
    char data[] = "HELO smtp.gmail.com\r\n"
                  "MAIL FROM:<[email protected]>\r\n"
                  "RCPT TO:<[email protected]>\r\n"
                  "DATA\r\n"
                  "From: <[email protected]>\r\n"
                  "To: <[email protected]>\r\n"
                  "Subject: Test\r\n"
                  "Le corp c'est ici =)\r\n"
                  "\r\n.\r\n"
                  "QUIT\r\n";
    
    send(sock, data, sizeof(data), 0);
    Dans ce cas le serveur me retourne ce message d'erreur à la commande DATA:

    Code:
    503 5.5.0 <DATA>: Data command rejected: Improper use of SMTP command pipelining
    En plusieurs parties:

    Code:
    char HELO[] = "HELO smtp.gmail.com\r\n";
    send(sock, HELO, sizeof(HELO), 0);
    
    char FROM[] = "MAIL FROM:<[email protected]>\r\n";
    send(sock, FROM, sizeof(FROM), 0);
    
    char TO[] = "RCPT TO:<[email protected]>\r\n";
    send(sock, TO, sizeof(TO), 0);
    
    ...
    Et dans ce cas je me rend cette erreur au niveau de la commande MAIL FROM:

    Code:
    500 5.5.2 Error: bad syntax

    Là où ça m'étonne vraiment c'est que les commandes sont les mêmes entre la première façon et la deuxième... Je pense qu'il y a quelque chose que je ne doit pas comprendre dans les commandes SMTP parce que je ne vois aucunes différences entre les deux façons de faire.
    Lorsque je tente un envois de mail à la main (avec telnet dans le terminal) tous se passe très bien...

    Ce que j'ai déjà essayé: (sans aucuns résultat)

    - Changer HELO en EHLO
    - Utiliser la fonction strlen à la place de sizeof
    - Changer les \r\n en \n et inverssement (ben oui, y'as un moment où on tente tous et n'importe quoi ^^')

    Sinon... Je suis sous Linux et je suis là si vous avez besoin de plus d'infos
    Dernière modification par kiliko, 08 juillet 2014, 11h25.

  • #2
    Pour la première erreur il semblerais qu'après traduction littérale,il y ai une mauvaise interprétation du protocole STMP. A mon avis tu devrais d'abord vérifier si le serveur de messagerie utilisé utilise bien :SMTP. Car visiblement la il semblerais d'après ce que le serveur te retourne que non.Ton serveur est til fonctionnel ? [email protected] tu l'a créé ?

    Si c'est le cas alors: Donc n'y aurais til pas un soucis de timeout. Tu vois si lorsque tu lance ton script et tu ne laisse pas le serveur répondre à temps il se pourrais qu'il se mette en Data reject. Je ne suis pas spécialiste en C++.Je suis encore en apprentissage du C ce n'est pas mon domaine mais par logique tu devrais voir avant de lancer l'instruction de boucle à ton serveur, de mettre un timeout ou pause afin de laisser le temps au serveur de répondre.

    Pour la 2eme pareil je fait l'interprétation littérale et il retourne une erreur de syntaxe sur cette partie.Je pense que la il faudrais l'avais d'un expert en C++ comme fred ou un autre afin de voir pourquoi ta ligne renvoie une erreur de syntaxe.J'ai une petite idée mais n'étant que novice je ne veux pas dire n'importe quoi.

    Commentaire


    • #3
      Dans le 1er cas, c'est normal, tu utilises un tableau de caractères et non un tableau de chaînes de caractères, la syntaxe correct devrait être char data[?][]

      Dans le 2ème cas, il faut virer les chevrons me semble t-il

      Et pour conclure, tu fais du C et non du C++, en tout cas pour cette partie...

      Commentaire


      • #4
        Envoyé par DreAmuS Voir le message
        Pour la première erreur il semblerais qu'après traduction littérale,il y ai une mauvaise interprétation du protocole STMP. A mon avis tu devrais d'abord vérifier si le serveur de messagerie utilisé utilise bien :SMTP. Car visiblement la il semblerais d'après ce que le serveur te retourne que non.Ton serveur est til fonctionnel ? [email protected] tu l'a créé ?

        Si c'est le cas alors: Donc n'y aurais til pas un soucis de timeout. Tu vois si lorsque tu lance ton script et tu ne laisse pas le serveur répondre à temps il se pourrais qu'il se mette en Data reject. Je ne suis pas spécialiste en C++.Je suis encore en apprentissage du C ce n'est pas mon domaine mais par logique tu devrais voir avant de lancer l'instruction de boucle à ton serveur, de mettre un timeout ou pause afin de laisser le temps au serveur de répondre.

        Pour la 2eme pareil je fait l'interprétation littérale et il retourne une erreur de syntaxe sur cette partie.Je pense que la il faudrais l'avais d'un expert en C++ comme fred ou un autre afin de voir pourquoi ta ligne renvoie une erreur de syntaxe.J'ai une petite idée mais n'étant que novice je ne veux pas dire n'importe quoi.
        @DreAmuS:
        Je cible une adresse gmail donc approprie c'est bien du SMTP.
        Je n'ai pas créé l'adresse "émettrice" ([email protected]) mais je ne pense pas que ça pose problème... Si?

        J'ai fait des essaies en laissant bien le temps au serveur de répondre mais ça me donne le même résultat que dans le deuxième cas: "syntax error". J'ai isolé la commande "DATA\r\n" bloque vraiment à ce niveau que ça bloque.

        Envoyé par fred Voir le message
        Dans le 1er cas, c'est normal, tu utilises un tableau de caractères et non un tableau de chaînes de caractères, la syntaxe correct devrait être char data[?][]

        Dans le 2ème cas, il faut virer les chevrons me semble t-il

        Et pour conclure, tu fais du C et non du C++, en tout cas pour cette partie...
        @fred:
        J'ai suivi ta remarque pour les tableaux de chaînes et pour en ce qui concerne les chevrons je pense que le problème est ailler car j'ai toujours l'erreur (syntax).
        Et entre le C ou C++ j'ai encore un peux de mal à faire la différence ^^'


        Voici maintenant mon code source; j'ai isolé la commande "DATA" pour tenter de comprendre le problème. Je pensais qu'en l'isolant le serveur pourrait me renvoyer "la permission" de lui envoyer les données du mails mais apparemment j'ai une erreur dans la façon d'écrire la commande

        Code:
        char helo[][100] = {"HELO smtp.gmail.fr\r\n"
                            "MAIL FROM:<[email protected]>\r\n"
                            "RCPT TO:<[email protected]>\r\n"};
        
        char data[] = "DATA\r\n";
        
        char data1[][200] = {"From: <[email protected]>\r\n"
                             "To: <[email protected]>\r\n"
                             "Subject: Test\r\n"
                             "Le corp c'est ici =)\r\n"
                             "\r\n.\r\n"
                             "QUIT\r\n"};
        
        send(sock, helo, sizeof(helo), 0);
        sleep(2);
        recept_S(sock); //Recupere la reponse serveur
        
        send(sock, data, sizeof(data), 0);
        sleep(2);
        recept_S(sock);
        
        send(sock, data1, sizeof(data1), 0);
        sleep(2);
        recept_S(sock);
        Dernière modification par kiliko, 08 juillet 2014, 12h17.

        Commentaire


        • #5
          Lorsque tu déclares helo et data1 se sont des tableaux de chaînes... ces chaînes sont séparées par des virgules.

          Ce qui impose une boucle pour envoyer chaque chaîne sur le socket

          Voici un exemple, sachant que j'y connais pas grand chose en socket, faut juste lire la documentation

          Code:
          #include <stdio.h>
          #include <stdlib.h>
          #include <string.h>
          
          #ifdef WIN32 /* Windows */
          
          #include <winsock2.h>
          
          #elif defined (linux) /* 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 /* Autres */
          
          #error not defined for this platform
          
          #endif
          
          
          int main(void)
          {
              char test[2][100] = {"Bonjour\n", "comment ca va?\n"};
          
              int sock = socket(AF_INET, SOCK_STREAM, 0); /* à compléter */
              int len;
          
              int i;
              for (i=0; i<2; i++)
              {
                  len = send(sock, test[i], strlen(test[i]), 0);
                  if (len < 0) exit(EXIT_FAILURE); /* Au cas où rien est envoyé */
              }
          
              closesocket(sock);
          
              return 0;
          }
          Dernière modification par fred, 08 juillet 2014, 15h06.

          Commentaire


          • #6
            Nice, ça fonctionne

            Le problème que j'avais c'est que j'utilisais la fonction "sizeof" au lieux de "strlen" et aussi que je faisais n'importe quoi avec les tableaux ^^'. Je pensais que les choses ce passais différemment au niveau de l'envoi. Il faut également bien laisser le temps au serveur de gérer l'info comme l'a dit Dreamus sinon il ne prend rien.

            Par contre je ne comprend pas très bien la différence entre sizeof et strlen . Ces deux fonctions retourne bien la taille d'un char alors quelle différence?

            En tous cas merci beaucoup à vous deux, ça faisait quelques jours que je me prenais la tête là dessus

            Commentaire


            • #7
              Je pense que l'erreur viens de l'interprétation finale de chacunes :sizeof renvoie une valeur en taille mémoire et strlen ben renvoie le nombre de caractère d'une chaîne.Mais sur google tu trouve facilement la définition exacte de chacunes et par consèquence tu tire logiquement tes conclusions.

              Commentaire


              • #8
                Par contre je ne comprend pas très bien la différence entre sizeof et strlen
                Code:
                #include <stdio.h>
                #include <string.h>
                
                int main(void)
                {
                    const char tableau[100] = "Coucou";
                
                    printf("valeur de sizeof: %d\n", (int) sizeof(tableau));
                    printf("valeur de strlen: %d\n", (int) strlen(tableau));
                
                    return 0;
                }
                Testes et tu verras

                Commentaire


                • #9
                  Ha oui effectivement c'est pas exactement la même utilité enfaîte
                  En tous cas merci à tous les deux vous m'avez bien aidé

                  Commentaire

                  Chargement...
                  X