Les protocoles de messagerie : SMTP, POP et IMAP
SMTP :: Codes sources
Il est possible de télécharger le fichier source en C
ici,
celui en Java
ici et l'archive contenant les deux fichiers
ici.
En C
#include <stdio.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PACKET_SIZE 1024
void appli(char* f);
int writen(int fd, char* ptr, int n);
int readn(int fd, char* ptr, int n);
int to_server_socket=-1;
char server_name[] = "213.228.0.44"; /*smtp.free.fr*/
int port = 25;
char helo[] = "HELO 82.57.221.51\n";
char from[] = "MAIL FROM:<toto@gtre.com>\n";
char to[] = "RCPT TO:<diam@gtre.fr>\n";
char subject[] = "Subject: ";
int main(int argc, char* argv[])
{
struct sockaddr_in serverSockAddr; /*adresse de la socket*/
struct hostent* serverHostEnt; /*description du host server*/
unsigned long hostAddr; /*adresse du server*/
char* filename;
if(argc==2) filename = argv[1];
else filename= NULL; /*use stdin*/
bzero((void*)&serverSockAddr, sizeof(serverSockAddr)); /*initialise à zero serverSockAddr*/
hostAddr = inet_addr(server_name); /* converti l'adresse ip en entier long*/
if( (long)hostAddr!=(long)-1)
{
bcopy((void*)&hostAddr,(void*)&serverSockAddr.sin_addr,sizeof(hostAddr));
}
else /*si on donne un nom*/
{
printf("Hey!\n");
serverHostEnt = gethostbyname(server_name);
bcopy((void*)serverHostEnt->h_addr,(void*)&serverSockAddr.sin_addr,serverHostEnt->h_length);
}
serverSockAddr.sin_port = htons(port); /* host to network port */
serverSockAddr.sin_family = AF_INET; /* AF_*** : INET=internet */
/*creation de la socket */
to_server_socket = socket(AF_INET, SOCK_STREAM, 0);
/* requete de la connexion */
connect(to_server_socket,(struct sockaddr *)&serverSockAddr, sizeof(serverSockAddr));
/*appel de l'appli*/
appli(filename);
/*fermeture de la connexion */
shutdown(to_server_socket,2);
close(to_server_socket);
return 0;
}
void appli(char* filename)
{
char buf[PACKET_SIZE+1], *ptr;
FILE* bulk;
int nb;
if(filename==NULL) bulk=stdin;
else bulk=fopen(filename,"rb");
buf[0] = 0x00;
readn(to_server_socket, buf, PACKET_SIZE);
printf(buf);
writen(to_server_socket, helo, strlen(helo));
readn(to_server_socket, buf, PACKET_SIZE);
printf(buf);
writen(to_server_socket, from, strlen(from));
readn(to_server_socket, buf, PACKET_SIZE);
printf(buf);
writen(to_server_socket, to, strlen(to));
readn(to_server_socket, buf, PACKET_SIZE);
printf(buf);
writen(to_server_socket, "data\n", 5);
readn(to_server_socket, buf, PACKET_SIZE);
printf(buf);
sprintf(buf,"%s %s\r\n\r\n", subject, ((filename==NULL)?"STDIN":filename) );
writen(to_server_socket, buf, strlen(buf));
/* ecrit le fichier toto ds la socket */
while(!feof(bulk))
{
bzero((void*)buf,PACKET_SIZE+1);
nb = fread(buf,sizeof(char), PACKET_SIZE, bulk);
buf[nb] = 0x00;
while( (ptr=strstr(buf, "\r\n.\r\n"))!=NULL) *(ptr+3)='.';
writen(to_server_socket, buf, nb);
}
writen(to_server_socket, "\r\n.\r\n",5);
readn(to_server_socket, buf, PACKET_SIZE);
printf(buf);
fclose(bulk);
}
int writen(int fd, char* ptr, int n)
{
int nl, nw;
nl=n;
while(nl>0)
{
nw=write(fd,ptr,nl);
if(nw<=0) return nw; /*erreur*/
nl-=nw;
ptr+=nw;
}
return (n-nl);
}
int readn(int fd, char* ptr, int n)
{
int nl, nr;
nl = n;
while( nl> 0)
{
nr = read(fd, ptr, nl);
if(nr<0) return nr; /*erreur*/
else if(nr==0) break;
nl-=nr;
ptr+=nr;
if( *(ptr-2)=='\r' && *(ptr-1)=='\n')
break;
}
*ptr = 0x00;
return (n-nl);
}
en Java
/*
* Created on 2 nov. 2004
*
*/
package smtp;
import java.net.*;
import java.io.*;
/**
* @author Adrien BOUVET
*
*/
public class smtpClient
{
private String server, message, dest, origin;
private int port;
private Socket socket;
public smtpClient(String serv, int por, String org)
{
server = serv;
port = por;
origin = org;
}
public void createMsg(String dst, String msg)
{
message = msg;
dest = dst;
}
public void sendMsg()
{
PrintWriter to;
BufferedReader from;
String str;
try {
socket = new Socket(InetAddress.getByName(server),port);
to = new PrintWriter( new BufferedWriter(new OutputStreamWriter (socket.getOutputStream())),true);
from = new BufferedReader( new InputStreamReader(socket.getInputStream()));
str = from.readLine();
to.println("EHLO 82.57.221.51");
str = from.readLine(); System.err.println(str);
to.println("MAIL FROM:<"+origin+">");
str = from.readLine(); System.err.println(str);
to.println("RCPT TO:<"+dest+">");
str = from.readLine(); System.err.println(str);
to.println("DATA");
str = from.readLine(); System.err.println(str);
to.println("Subject: héhé\r\n\r\n" + message + "\r\n.\r\n");
str = from.readLine(); System.err.println(str);
socket.close();
}catch( Exception e) {}
}
public static void main(String[] args)
{
smtpClient c = new smtpClient("213.228.0.62", 25, "fake@free.fr");
c.createMsg("diam@gtre.fr", "yeah!!!!"); // (dest, msg)
c.sendMsg();
}
}