Bonjour à tous.

Je suis débutant en C et je suis en train de réaliser un petit programme capable d'envoyer des mails.

Le principe est simple, je me connecte à un serveur smtp par l'intermédiaire de sockets, j'effectue les requetes necessaires et l'envoit est terminé. Jusque là pas de soucis et tout est merveilleux dans le meilleur des mondes. Je suis chez free, donc j'utilise le serveur smtp : smtp.free.fr.

Par contre, j'ai voulu en tester d'autres et la...le programme plante. Il m'envoit un joli message : Erreur de segmentation (core dumped) (je suis sur ubuntu).
J'ai essayé sur smtp.hotmail.fr et pareil : Erreur de segmentation (core dumped)

Si vous avez le courage de lire mon code et si par hasard vous trouvez le problème, je vous en remercie par avance.

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
#include <time.h>
#define SOCKET_ERROR -1
#define TAILLE_BUFFER 20000
 
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
typedef int SOCKET;
 
void questionnaire(char *serveur, char *hello, char *expediteur, char *destinataire, char *message, char *sujet, char *corps, char *destinataire2, char* expediteur2, char *data);
void entrerChaine(char *buffer);
 
int main(int argc, char *argv[])
{
        //Initialisation des variables
        char serveur[512] ="" ;
        char hello[512] = "";
        char expediteur[512] = "";
        char expediteur2[512] = "";
        char destinataire[512] = "";
        char destinataire2[512] = "";
        char sujet[512]="";
        char data[] ="DATA\r\n";
        char message[30000] = "";
        char quit[] = "QUIT\n";
        char buffer[20000];
        char corps[20000] = "";
        SOCKADDR_IN sin;
        int sock_err;
        struct hostent *strAdresse;
        SOCKET serveurSock;
 
        questionnaire(serveur, hello, expediteur, destinataire, message, sujet, corps, destinataire2, expediteur2, data);
 
        //On a donné l'adresse du serveur sous forme de nom de domaine, il faut donc la convertir
        strAdresse = gethostbyname(serveur);
        bcopy(strAdresse->h_addr,&sin.sin_addr, strAdresse->h_length);
        sin.sin_family = AF_INET;
        sin.sin_port = htons(25);
 
        //Attribution de la socket
        serveurSock = socket(AF_INET, SOCK_STREAM, 0);
        if(serveurSock != SOCKET_ERROR)
        {
                printf("Socker numero : %d attribuée\n", serveurSock);
                sock_err = connect(serveurSock, (SOCKADDR*)&sin, sizeof(sin));
 
                if(sock_err != SOCKET_ERROR)//Si la connection a réussie
                {
 
                        printf("Nous voila à présent connecté\n");
                        send(serveurSock, message, sizeof(message), 0);
                        sock_err=recv(serveurSock, buffer, sizeof(buffer), 0);
                        write(STDOUT_FILENO, buffer, sizeof(sock_err));
                }
        }
 
 
 
        close(serveurSock);
        return 0;
}
 
 
 
 
void questionnaire(char *serveur, char *hello, char *expediteur, char *destinataire, char *message, char *sujet, char *corps, char *destinataire2, char* expediteur2, char *data)
{
        char buffer[TAILLE_BUFFER] = "";
        printf("\nEntrez le nom de votre fournisseur d'acces : ");
        entrerChaine(buffer);
        sprintf(serveur, "smtp.%s.fr", buffer);
        printf("\nVotre serveur smtp est \"%s\"\n", serveur);
 
        sprintf(hello, "HELO %s.fr\r\n", buffer);      
 
        printf("\nEntrez l'adresse de l'expéditeur (votre adresse) : ");
        entrerChaine(buffer);
        sprintf(expediteur2, "FROM: <%s>\r\n", buffer);
        sprintf(expediteur, "MAIL FROM: <%s>\r\n", buffer);
        printf("\nCommande expediteur : \"%s\"\n", expediteur);
 
        printf("\nEntrez l'adresse de votre correspondant : ");
        entrerChaine(buffer);
        sprintf(destinataire2, "TO: <%s>\r\n", buffer);
        sprintf(destinataire, "RCPT TO: <%s>\r\n", buffer);
        printf("\nCommande destinataire : \"%s\"\n", destinataire);
 
        printf("\nEntrez le sujet du message : ");
        entrerChaine(buffer);
        sprintf(sujet, "Subject: <%s>\r\n", buffer);
        printf("\nSujet : \"%s\"\n", sujet);
 
        printf("\nEntrez le corps du message : ");
        entrerChaine(buffer);
        sprintf(corps, "%s", buffer);
        printf("\nMessage : \"%s\"\n", corps);
 
        sprintf(message, "%s%s%s%s%s%s%s%s\n.\r\nQUIT\n", hello, expediteur, destinataire, data, sujet, expediteur2, destinataire2, corps);
        printf("\nMessage : \"%s\"\n", message);
}
 
void entrerChaine(char *buffer)
{
        int i, t;
        fgets(buffer, (TAILLE_BUFFER*sizeof(char)), stdin);
        for(i=0; i<TAILLE_BUFFER; ++i)
        {
                if(buffer[i]=='\n')
                {
                        buffer[i] = 0;
                        i = TAILLE_BUFFER;
                }
                if(buffer[i] == '\0')
                {
                        i = TAILLE_BUFFER;
                }
        }
}