Accueil > > > [C/LINUX] ENVOYER UN MESSAGE PAR MAIL
[C/LINUX] ENVOYER UN MESSAGE PAR MAIL
Information sur la source
Description
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.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
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 <winsock2.h>#pragma comment(lib, "ws2_32.lib") void main
Soket sous LINUX [ par diablo31170 ]
Bonjour à 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
[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
|
Derniers Blogs
[MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA[MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA par cyril
Le deuxième keynote du mix fut très riche en contenu. Internet Explorer 9 Juste un après le lancement de Internet Explorer 8, Microsoft a dévoilé les nouveautés de Internet Explorer 9. Désormais, IE supportera HTML5, SVG et CSS3. L'élément ...
Cliquez pour lire la suite de l'article par cyril CERTIFICATIONS BETA .NET 4CERTIFICATIONS BETA .NET 4 par KooKiz
Les inscriptions pour les certifications beta .NET 4 ont commencé. L'inscription est offerte pour les examens suivants : - 71-511, TS: Windows Applications Development with Microsoft .NET Framework 4 - 71-515, TS: Web Applications Development with...
Cliquez pour lire la suite de l'article par KooKiz [MIX 2010] - MICROSOFT TRANSLATOR TECHNOLOGY PREVIEW V2[MIX 2010] - MICROSOFT TRANSLATOR TECHNOLOGY PREVIEW V2 par redo
J'imagine que la plupart d'entre vous connaissent bien et utilisent le service de traduction de Google, mais connaissez-vous celui de Microsoft . Microsoft Translator ? Effectivement, Microsoft nous annoncé le lancement version 2 de la Technologie Preview...
Cliquez pour lire la suite de l'article par redo LANCEMENT EN PREVIEW DE CYCLONE LORS DES TECHDAYS 2010!LANCEMENT EN PREVIEW DE CYCLONE LORS DES TECHDAYS 2010! par MPOWARE
Toutes les vidéos de ce lancement sont en ligne!
Partie I - Intro
http://www.youtube.com/watch?v=LkQzTQ8T6CA
Partie II - Démo 1
http://www.youtube.com/watch?v=drAhYQ7lqvo
Partie III - Démo 2
http://www.youtube.com/watch?v=c8KM_1Gqybc...
Cliquez pour lire la suite de l'article par MPOWARE [WP7] JE NE VEUX PAS D'UN NOUVEL IPHONE[WP7] JE NE VEUX PAS D'UN NOUVEL IPHONE par FREMYCOMPANY
Je pense qu'ils ont besoin d'une piqure de rappel chez Microsoft : c'est bien gentil d'avoir une interface jolie, mais si c'est pour avoir un truc qui ne convainct pas dedans, c'est peine perdue.
---->
Système ouvert ----> Fermé ?
P...
Cliquez pour lire la suite de l'article par FREMYCOMPANY
Logiciels
Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor
|