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
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
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
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
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Forum
ARBRE BINAIREARBRE BINAIRE par pacotheking
Cliquez pour lire la suite par pacotheking
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|