begin process at 2010 03 18 06:32:36
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > [C/LINUX] ENVOYER UN MESSAGE PAR MAIL

[C/LINUX] ENVOYER UN MESSAGE PAR MAIL


 Information sur la source

Note :
8,8 / 10 - par 5 personnes
8,80 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Classé sous :smtp, socket, linux Niveau :Débutant Date de création :24/06/2006 Vu / téléchargé :15 666 / 692

Auteur : katsankat

Ecrire un message privé
Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
C'est fait de la manière la plus simple qui soit,
avec un minimum de variables déclarées.

Si quelqu'un s' attend à un client mail complet, qu'il passe son chemin
ou qu'il en installe un! Pour les autres, ce code constituera l' ossature
d'une application. C'est une des raisons pour lesquelles je le poste.
L' autre raison étant bien entendu de présenter brièvement le protocole SMTP
à ceux qui s'y intéressent.

A vous de l' étoffer en déclarant 60 variables, pour le FROM, le TO, etc...
Parce qu'il faut bien reconnaitre que tout est en dur!

Aussi, le code est du C -toujours par souci de flexibilité- pour
sa facilité de passage vers le C++. Qui peut le moins peut le plus.

Source

  • // Envoyer un mail
  • // gcc -Wall -o mail mail.c
  • #include <stdio.h> // pour puts()
  • #include <string.h> // pour bzero() bcopy() strlen()
  • //includes réseau
  • #include <unistd.h> // pour close()
  • #include <netdb.h> // pour gethostbyname()
  • #include <arpa/inet.h> // pour sockaddr_in
  • int sk = -1; //le descripteur du socket
  • char serveur[] = "smtp.wanadoo.fr";
  • char lemail[] = "HELO wanadoo.fr\r\n"
  • "MAIL FROM: <blabla@orange.fr>\n"
  • "RCPT TO: <truc@truc.fr>\n"
  • "DATA\r\n"
  • "Subject: le mur et les oreilles\r\n"
  • "FROM: François <blabla@orange.fr>\r\n"
  • "TO: Segolene <truc@unautre.fr>\r\n"
  • "Bijour\r\n"
  • "petit message\r\n"
  • ".\r\n"
  • "QUIT\r\n\r\n";
  • //Déclaration des Prototypes de fonctions
  • unsigned short init_socket();
  • void recevoir_reponse();
  • int main (int argc, char *argv[])
  • {
  • if (init_socket())
  • {
  • send(sk, lemail, strlen(lemail)-1, 0);
  • recevoir_reponse(); //fermera le socket.
  • }
  • return 0;
  • }
  • unsigned short init_socket()
  • {
  • struct sockaddr_in serveurSockAddr; // addresse
  • struct hostent *serveurHostEnt; // description host serveur
  • unsigned long hostAddr; // addr du serveur
  • bzero(&serveurSockAddr,sizeof(serveurSockAddr));
  • hostAddr = inet_addr(serveur); // convertit l'adresse ip en entier long
  • if ( (long)hostAddr != (long)-1)
  • bcopy(&hostAddr,&serveurSockAddr.sin_addr,sizeof(hostAddr));
  • else // on a donné un nom, pas une IP
  • {
  • serveurHostEnt = gethostbyname(serveur);
  • if (serveurHostEnt == NULL)
  • {
  • puts("probleme gethost");
  • return 0;
  • }
  • bcopy(serveurHostEnt->h_addr,&serveurSockAddr.sin_addr, serveurHostEnt->h_length);
  • }
  • serveurSockAddr.sin_port = htons(25); //port 25 pour SMTP
  • serveurSockAddr.sin_family = AF_INET;
  • if ( (sk = socket(AF_INET,SOCK_STREAM,0)) < 0)
  • {
  • puts("Impossible de creer le socket");
  • return 0;
  • }
  • if(connect(sk,(struct sockaddr *)&serveurSockAddr, sizeof(serveurSockAddr)) < 0)
  • {
  • puts("probleme sur connect()");
  • return 0;
  • }
  • else
  • {
  • printf("Connecté au serveur %s\n",serveur);
  • return 1;
  • }
  • }
  • void recevoir_reponse()
  • {
  • puts("En attente de la reponse ...\n");
  • char tempBuffer[1024];
  • int retval;
  • while(1)
  • {
  • retval = recv(sk, tempBuffer, sizeof(tempBuffer)-1, 0);
  • if (retval==0)
  • {
  • shutdown(sk,2); //ferme le socket
  • close(sk);
  • puts("Socket fermé.");
  • break;
  • }
  • else if (retval == -1)
  • {
  • puts("Erreur pendant la reception");
  • }
  • else
  • {
  • tempBuffer[retval] = 0;
  • puts(tempBuffer);
  • }
  • }
  • }
// Envoyer un mail
// gcc -Wall -o mail mail.c

#include <stdio.h>	// pour puts()
#include <string.h>	// pour bzero() bcopy() strlen()

//includes réseau
#include <unistd.h>	// pour close()
#include <netdb.h>	// pour gethostbyname()
#include <arpa/inet.h>  // pour sockaddr_in

int sk = -1;		//le descripteur du socket

char serveur[] = "smtp.wanadoo.fr";

char lemail[] = "HELO wanadoo.fr\r\n"
		"MAIL FROM: <blabla@orange.fr>\n"
		"RCPT TO: <truc@truc.fr>\n"
		"DATA\r\n"
		"Subject: le mur et les oreilles\r\n"
 		"FROM: François <blabla@orange.fr>\r\n"
		"TO: Segolene <truc@unautre.fr>\r\n"
		"Bijour\r\n"
		"petit message\r\n"
		".\r\n"
		"QUIT\r\n\r\n";

//Déclaration des Prototypes de fonctions
unsigned short init_socket();
void recevoir_reponse();





int main (int argc, char *argv[])
{

	if (init_socket())
	{
	send(sk, lemail, strlen(lemail)-1, 0);
	recevoir_reponse(); //fermera le socket.
	}

	return 0;
}





unsigned short init_socket()
{
	struct sockaddr_in serveurSockAddr;	// addresse
	struct hostent *serveurHostEnt;		// description host serveur
	unsigned long hostAddr;			// addr du serveur

	bzero(&serveurSockAddr,sizeof(serveurSockAddr));
	hostAddr = inet_addr(serveur); // convertit l'adresse ip en entier long

	if ( (long)hostAddr != (long)-1)
		bcopy(&hostAddr,&serveurSockAddr.sin_addr,sizeof(hostAddr));
	else  // on a donné un nom, pas une IP
	{
 		serveurHostEnt = gethostbyname(serveur);
		if (serveurHostEnt == NULL)
  		{
			puts("probleme gethost");
			return 0;
		}
 		bcopy(serveurHostEnt->h_addr,&serveurSockAddr.sin_addr, serveurHostEnt->h_length);
	}

	serveurSockAddr.sin_port = htons(25); //port 25 pour SMTP
	serveurSockAddr.sin_family = AF_INET;

	if ( (sk = socket(AF_INET,SOCK_STREAM,0)) < 0)
	{
		puts("Impossible de creer le socket");
		return 0;
 	}

	if(connect(sk,(struct sockaddr *)&serveurSockAddr, sizeof(serveurSockAddr)) < 0)
	{
		puts("probleme sur connect()");
		return 0;
	}
	else
	{
		printf("Connecté au serveur %s\n",serveur);
		return 1;
	}
}


void recevoir_reponse()
{
	puts("En attente de la reponse ...\n");
	char  tempBuffer[1024];
	int retval;

	while(1)
	{
	    retval = recv(sk, tempBuffer, sizeof(tempBuffer)-1, 0);
	    if (retval==0)
	    { 
			shutdown(sk,2); //ferme le socket
			close(sk);
			puts("Socket fermé.");
	        break;
	    }
	    else if (retval == -1)
	    {
	        puts("Erreur pendant la reception");
	    }
	    else
	    {
	        tempBuffer[retval] = 0;
	        puts(tempBuffer);
	    }
	}
}

 Conclusion

Note pour les nouveaux Linuxiens:

Pour compiler "à la main" dans une console c'est:
$ cd repertoire
$ gcc -Wall -o mail mail.c

Puis pour exécuter le prog c'est:
$ ./mail
En sachant que double-cliquer sur l' exécutable marche aussi.

Note2: si vous avez des problèmes avec les accents dans la console, faut voir
si vos "Locales" sont bien configurées pour le français.


La conversion vers le Win32 est ultra simple, je modifie le code
à cet effet si quelqu'un le demande. Deux ou trois directives pré-processeur
et le binz devient portable à 100%, sans danser la java. De toute façon Java
est écrit en langage C ...


Le main() appelle 2 routines:
- init_socket() qui crée un socket et se connecte sur le port 25,
- recevoir_reponse() qui lit les paquets entrants et les affiche sur la sortie standard.

Il n' y a effectivement pas de conversation protocolaire entre le client et le serveur,
puisque le prog envoie un string complet au serveur sans écouter ce que lui répond le
serveur, à la manière d'une requête HTTP! C'est du brut, du simple et du pas compliqué.

J'espère que vous apprécierez.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture [C, WIN32/LINUX] LIB POUR TRAVAILLER DES IMAGES BITMAPS
Source avec Zip Source avec une capture [C/WIN32] REJOINDRE UN AMI SUR COD2 (CALL OF DUTY 2)
Source avec Zip Source avec une capture [WIN32/SPEECH SDK] CONNECTION SERVEUR DE MESSAGERIE POP3
Source avec Zip Source avec une capture [GTK+] FENÊTRE POPUP ANIMÉE EN BAS À DROITE DE L' ÉCRAN
Source avec Zip Source avec une capture [C/LINUX] BALISAGE HTML DE FICHIERS SOURCE C/C++

 Sources de la même categorie

Source avec Zip ÊTRE AVERTIS LORS D'UN NOUVEL ARTICLE SUR UN BLOG DE TYPE SK... par jojo930
Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta

 Sources en rapport avec celle ci

Source avec Zip SERVEUR/CLIENT LINUX par ghost4
Source avec une capture REMOTE POST PHP WITH SOCKET LINUX par 0x0syscall
Source avec Zip Source avec une capture POPUX PETIT CLIENT POP3 POUR POSIX par xtremejames183
Source avec Zip SQUELETTE DE COMMUNICATION PAR SOCKET EN MODE CONNECTÉ POUR ... par AlexN
Source avec Zip MK_SOCKET : UNE BIBLIOTHÈQUE COMPLÈTE ET TRÈS SIMPLE DE GEST... par dnob700

Commentaires et avis

Commentaire de psyphi le 03/07/2006 18:10:11

Normalement le smtp de wanadoo ne demande t'il pas une identification?

Commentaire de katsankat le 07/07/2006 17:39:20

Il la prend sans la demander.

Commentaire de psyphi le 07/07/2006 19:18:32

Ouai mais seulement si t'es abonné chez eux.
Faudrait codé la partie authentification.

Commentaire de katsankat le 08/07/2006 15:37:29

L'auth n'est requise que pour le POP.
Pas besoin pour le SMTP, puisque comme tu l'as souligné il faut généralement avoir un compte.

Commentaire de edu94 le 26/10/2006 15:57:17

il manque \r dans la ligne MAIL FROM: et RCP TO:

Commentaire de Thy le 17/01/2007 11:50:32

Beau boulot,
Débutant en C c'est exactement e que je cherchait, sauf qu'il faudrait qu'il tourne sous Windows...

Si quelqu'un peut m'orienter ca serait cool

Commentaire de tofke le 20/11/2007 19:18:45 10/10

Merci pour le source, on ne peut plus simple c'est vrai mais c'est exactement ce que je cherchais, parfait pour expliquer comment fonctionne l'envoi d'un mail en c.

Juste une petite remarque pour la phrase citée plus haut: " Qui peut le moins peut le plus "... c'est plutôt qui peut le plus, peut le moins ;o)

Merci encore pour le source

Commentaire de CeeBeeWii le 07/05/2008 10:12:06 10/10

Excellent le code pour comprendre les e-mails en C. Par contre, pourrais-tu m'indiquer ce qu'il faut changer pour pouvoir le compiler et l'utiliser sur XP ?

Merci d'avance ^^

Commentaire de modafine le 21/05/2008 15:25:37

Bonjour katsankat;

J'ai exécuter ce code (mail.c) mais il me retoune le message suivant:

probleme sur connect()

Comment puis-je résoudre ce problème.

Merci.

Commentaire de katsankat le 21/05/2008 17:39:53

Salut,
Connection sur quel serveur?

Pour win32 j'ai une solution, malheureusement le code sera un peu plus long.

Commentaire de modafine le 23/05/2008 08:42:29

Salut KATSANKAT,

J'ai essayé l'exécution du code que vous l'avez déposé mais j'ai eu le message suivant :"probleme sur connect()". Je l'ai exécuté sur linux suse10.3

Je suis entrain de réaliser un projet de fin d'études et le résultat de mon application est un email. Je programme en c++. D'après la recherche que j'ai fait je dois utiliser le serveur SMTP.

Merci.

Commentaire de modafine le 27/05/2008 16:51:27

Salut a tous,

Pouvez vous m'aider à comprendre pourquoi j'arrive pas à envoyer le mail.

est ce que je dois configurer le serveur smtp et comment.

En plus j'ai pas compris comment ce code arrive a tenir en compte du mail du destinataire et de l'expéditeur.

Désolée mais je suis débutante et j'en ai vraiment besoin d'envoyer un mail à partir d'un application développée en c++.

Merci d'avance.

Commentaire de katsankat le 27/05/2008 17:55:58

Salut,
Regardes le code au-dessus et modifies-le:

Ligne 14, il faut mettre l'adresse de ton serveur SMTP (dans l'exemple l'expéditeur dispose d'un compte sur le serveur smtp.wanadoo.fr). Celà règlera le problème de connect().

Lignes 17 et 21, Il faut mettre ton adresse email.

Lignes 18 et 22, Il faut mettre l'adresse mail du destinaire.

Commentaire de modafine le 27/05/2008 17:59:35

Merci pour votre reponse mais comment je peux connaitre l'adresse de mon serveur smtp.

en fait j'ai essayé smtp.gmail.com mais j'ai eu la meme reponse

Merci d'avance.

Commentaire de katsankat le 27/05/2008 19:54:57

Pour gmail -qui fonctionne par défaut par une interface web- il faut se connecter à son compte gmail, puis cliquer sur "paramètres" en haut à droite, puis "Transfert POP" et activer le protocole POP.

Commentaire de katsankat le 27/05/2008 19:56:24

non ce n'est pas tout à fait ça.

Commentaire de modafine le 10/06/2008 18:38:42

Bonjour katsankat,

j'ai tester encore une fois votre code mais il lui manque l'authentification pour accéder au serveur smtp.

Pouvez vous m'aider sur ce problème.

Merci. je suis en attente de votre aide.

modafine.

Commentaire de bloodfired le 16/11/2008 20:05:13

salut j'ai un petit problème : j'aimerais que dans le corp du message que j'envoie il y est une saisi que j'ai faite auparavant ( une chaine de caractère de type char) j'ai essayez de remplacer le "bijour" par un nom de variable ou encore mettre %s mais la j'avoue que étant débutant je sèche

Sinon très bon code  pour comprendre le fonctionnement du protocole smtp  ;)

Commentaire de Maknash le 24/10/2009 23:22:47

Salut, serait-il possible d'avoir le source pour Windows XP svp?
Thx

Commentaire de katsankat le 25/10/2009 02:42:38

Salut, pour les amis de windows ... Bon ... il faut inclure windows.h puis winsock2.h ensuite, il faut linker avec ws2_32.lib ou .a puis dans le code initialiser ws2_32.dll par un appel de wsastartup() sans oublier d'appeler wsacleanup() lorsque l'appli se ferme et ceci autant de fois que wsastartup() a été invoqué. Un joli bronx ce windows. D'ailleurs vista n'est pas encore adolescent qu'un autre -windows 7- va renflouer le tiroir-caisse ça me gonfle prodigieusement et j'ai bien fait de ne pas l'acheter ça date du jour où j'ai juré ne plus jamais donner un seul centime à microsoft. C'est pas une question d'argent, mais de principes. Bref Linux c'est la classe, surtout pour les développeurs c'est vraiment adapté; retour à nos moutons
Le mieux est de regarder ma source "speech POP3" car elle contient un exemple de sockets sous windoze. Après à vous d'employer au mieux les directives pré-processeur pour exécuter le code correspondant à la plateforme sur laquelle le code sera compilé:

#ifdef WIN32
...includes windose
#else
...includes UNIX
#endif

MODAFINE pour l'authentification SMTP il faut carrément jeter ce code et effectuer une réelle conversation entre machines : le client alterne tout simplement les send() et les recv() en prenant juste soin d'encoder en MD5 le mot de passe, ce n'est pas plus compliqué que ça mais il faut chercher. CPPfrance propose un bon code en C pour l'encodage MD5 ça marche au poil je confirme. Un coup d'oeil rapide à la RFC822 qui spécifie le protocole SMTP et c'est tout!

En espérant vous avoir répondu merci les amis, bonne programmation à vous.

Commentaire de Zestyr le 12/02/2010 20:43:20

Salut, très bon code !
Par contre quand tout mes mails envoyé son pas valide et vont en indésirable : comment rectifier le problème ? Header ? Possible avec ton code ?

Ps: sous windows windows.h n'est pas nécessaire pour manipuler, on l'utilise pour les thread mais la lib pthread est préférable puisqu'elle multiplate-form ( Windows & Linux : rien à foutre de Mac )

++

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Socket et linux : serveur smtp [ par LuckyNut ] Bonjour,J'ai développé un petit serveur smtp sous linux et j'ai un pb que je n'arrive pas à résoudre.Il marche nickel si je le fais écouter sur le por socket et serveur smtp [ par lombredudragon ] Voila j'aimerais savoir si c'est possible d'envoyer un mail de cette maniere:#include &lt;winsock2.h&gt;#pragma comment(lib, "ws2_32.lib") void main Soket sous LINUX [ par diablo31170 ] Bonjour &#224; tous le monde, comme le nom l'indique, cela va parler de soscket sous linux (en C++). Il aut savoir que je travaille en mode connect&#2 [C] Un timeOut sur Socket en détails [Linux] [ par ZedMaTrix ] Salut a tous.Bon j'ai pas mal cherché sur le site, et appart des débuts de réponses, je n'ai rien trouvé qui m'ai aidé à résoudre ce problème de TimeO Socket UDP linux [ par elinep ] Bonjour à tous, J'ai une application qui communique en wifi entre deux machines linux en utilisant des liaisons UDP. En fait la machine A envoie rég programmation socket sous linux [ par blazman34 ] Bonjour à tous !!Voici mon probleme :Je suis en train de programmer une application client serveur sous linux, tout a bien marcher juska présent juska SOCKET ASYNCHRONE LINUX [ par nicompx ] Salut, Je cherche un exemple de communication par socket en C sous LINUX! J'aimerais que plusieurs client puissent laisser des messages au serveur, le Problème de socket UDP sous linux [ par RaygKross ] Salut à tousMon problème est je dois créer un programme manager snmpLes port de SNMP sont 161 et 162J'initialise ma structure de type sockaddr_in avec socket raw sous linux [ par gpg ] quelqu'un aurait-il un petit exemple de programmation de socket raw sous linux SANS librairies additionelle (C/C++ brut) Linux, C & Sockets [ par cbismuth ] Bonjour! Je pense devenir fou...Je programme actuellement une architecture serveur/client en C.Le problème est que pour tous les clients qui se conne


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales