Bonjour,
Je souhaite mettre une réponse automatique indiquant que le serveur mail est en maintenance.
J’utilise postfix, qui peux m’indiquer la manipulation.
Merci
Bonjour,
Je souhaite mettre une réponse automatique indiquant que le serveur mail est en maintenance.
J’utilise postfix, qui peux m’indiquer la manipulation.
Merci
A qui tu veux faire la réponse??? Si c’est au serveur SMTP, tu peux faire simplement un script
#!/bin/sh
echo "421 Temporary failure, please retry"
exit 0
que tu nommes /usr/local/bin/waitsmtp avec les droits rwxr-xr-x
et tu rajoutes une ligne
dans /etc/inetd.conf.
Tu peux également compiler le programme suivant, puis tu fais
et tu lances ce programme en root.
Tu fais ta manip, il enverra un signal d’erreur aux sqerveur se connectant.
[code]#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#define PORT 25
struct sockaddr_in desc_douille;
void erreur(message)
char *message;
{
printf(“Erreur %s\n”,message);
perror("Message d’erreur: ");
exit(1);
}
int cree_douille (const char * nom_hote,
const char * nom_service,
const char * nom_proto,
const int num_port)
{
int sock;
struct sockaddr_in adresse;
struct hostent * hostent = NULL;
struct servent * servent = NULL;
struct protoent * protoent = NULL;
if (nom_hote != NULL)
if ((hostent = gethostbyname (nom_hote)) == NULL) {
erreur (“gethostbyname”);
return (-1);
}
if ((protoent = getprotobyname (nom_proto)) == NULL) {
erreur (“getprotobyname”);
return (-1);
}
if (nom_service != NULL)
if ((servent = getservbyname (nom_service,
protoent -> p_name)) == NULL) {
erreur (“getservbyname”);
return (-1);
}
if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
erreur (“création douille”);
return (-1);
}
memset (& adresse, 0, sizeof (struct sockaddr_in));
adresse . sin_family = AF_INET;
if (servent != NULL)
adresse . sin_port = servent -> s_port;
else
if (num_port != 0) adresse.sin_port = htons(num_port);
else adresse . sin_port = htons (0);
if (hostent != NULL)
adresse . sin_addr . s_addr =
((struct in_addr *) (hostent -> h_addr)) -> s_addr;
else
adresse . sin_addr . s_addr = htonl (INADDR_ANY);
if (bind (sock, (struct sockaddr *) & adresse,
sizeof (struct sockaddr_in)) < 0) {
close (sock);
erreur (“localisation douille”);
return (-1);
}
return (sock);
}
traite(connexion)
int connexion;
{
write(connexion,“421 Temporary failure, please retry later\n”,42);
}
main(argc,argv)
int argc;
char *argv;
{
int douille,douille_connecte;
int prt=PORT;
int longueur;
struct sockaddr sock_interlocuteur;
int option;
while ((option = getopt(argc,argv,“p:a:vh”)) != -1) {
switch(option) {
case ‘p’:
sscanf(optarg,"%d",&prt);
break;
case ‘h’:
case ‘?’:
default:
break;
}
}
douille = cree_douille(NULL,NULL,“tcp”,prt);
if (listen(douille,5) < 0) erreur(“écoute douille”);
longueur = sizeof(struct sockaddr);
/ évite au processus fils de rester au zombie */
signal(SIGCHLD,SIG_IGN);
/* attente d’une connexion */
for(;
{
if ((douille_connecte = accept(douille,&sock_interlocuteur,&longueur))< 0)
erreur(“problème à la connexion”);
/* Traitement de connexion /
switch(fork()) {
case -1 :
erreur(“problème au fork”);
case 0 :
/ le fils /
close(douille);
/ traitement de la connexion /
traite(douille_connecte);
/ fin de la connexion */
close(douille_connecte);
exit(0);
default :
close(douille_connecte);
}
}
}
[/code]
[edit: erreurs de syntaxe supprimées, programme testé]