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
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
WIN APIWIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|