begin process at 2012 05 27 22:26:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

E-Mail / Messagerie

 > CONTOURNEMENT DE LA DÉSACTIVATION DE MAIL()

CONTOURNEMENT DE LA DÉSACTIVATION DE MAIL()


 Information sur la source

Note :
4 / 10 - par 4 personnes
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :E-Mail / Messagerie Niveau :Débutant Date de création :13/05/2003 Date de mise à jour :13/05/2003 18:42:44 Vu :5 487

Auteur : Lissyx

Ecrire un message privé
Site perso
Commentaire sur cette source (42)
Ajouter un commentaire et/ou une note

 Description

attention, ça necessite les sockets actives (c'est le cas chez free ;) )  

Source

  • <?php
  • /*
  • * Sendmail()
  • * fonction PHP pour l'envoie de mails
  • * avec mail() désactivée
  • *
  • * utilise les sockets
  • *
  • * la fonction getmxr a été repompée (et modifiée pour l'occasion) sur la doc de php.net, soncréateur ne m'en voudras pas d'avoir ommis son nom ;)
  • *
  • */
  • function sendMail($destinataire, $emetteur, $sujet, $message) {
  • $damail = "Subject: $sujet
  • To: <$destinataire>
  • From: <$emetteur>
  • \n $message \n
  • \n.\n
  • ";
  • $mx = getMX($destinataire);
  • $socket = connectTo($mx, 25);
  • $rep = getSMTPcode(read($socket));
  • if($rep == 220) {
  • sendTo("HELO ".$_SERVER['SERVER_NAME']."\n", $socket);
  • $rep = getSMTPcode(read($socket));
  • if($rep == 250) {
  • sendTo("MAIL FROM <".$emetteur.">\n", $socket);
  • $rep = getSMTPcode(read($socket));
  • if($rep == 250) {
  • sendTo("RCPT TO <".$destinataire.">\n", $socket);
  • $rep = getSMTPcode(read($socket));
  • if($rep == 250) {
  • sendTo("DATA\n", $socket);
  • $rep = getSMTPcode(read($socket));
  • if($rep == 354) {
  • sendTo($damail, $socket);
  • $rep = getSMTPcode(read($socket));
  • if($rep == 250) {
  • echo "mail envoyé";
  • }
  • socket_close($socket);
  • }
  • }
  • }
  • }
  • } else {
  • echo "Erreur durant l'envoi<br>";
  • echo read($socket);
  • }
  • }
  • function connectTo($server, $port) {
  • $socket = socket_create (AF_INET, SOCK_STREAM, 0);
  • $result = socket_connect ($socket, $server, $port);
  • if(!$result) {
  • echo "Impossible de se connecter au SMTP distant";
  • echo "\$result=".$result."; \$socket=".$socket."; \$server=".$server."; \$port=".$port."<br>";
  • exit;
  • }
  • return $socket;
  • }
  • function sendTo($buffer, $sock) {
  • socket_write($sock, $buffer, strlen($buffer));
  • }
  • function read($sock) {
  • $out = socket_read($sock, 2048);
  • return $out;
  • }
  • function getSMTPcode($str) {
  • $code = substr($str, 0, 3);
  • return $code;
  • }
  • function MXtest($MX) {
  • $mxsock = socket_create (AF_INET, SOCK_STREAM, 0);
  • if(socket_connect($mxsock, $MX, 25)) {
  • return true;
  • } else {
  • return false;
  • }
  • }
  • function getMX($email) {
  • $srv_array = explode("@", $email);
  • $srv = $srv_array[1];
  • $servsoft = $_SERVER["SERVER_SOFTWARE"];
  • if(!substr_count($servsoft, "Win")) {
  • getmxrr($srv, $servers);
  • $servers[0] = gethostbyname($servers[0]);
  • return $servers[0];
  • } else {
  • $servers = getmxr($srv);
  • for($i = 0; $i < count($servers); $i++) {
  • if(MXtest($servers[$i])) {
  • return $servers[$i];
  • break;
  • }
  • }
  • }
  • }
  • function getmxr($srv) {
  • if(substr_count($srv, ".") < 2) {
  • $command = "nslookup -type=mx ".$srv;
  • exec ( $command, $result );
  • $i = 0;
  • while ( list ( $key, $value ) = each ( $result ) ) {
  • if ( strstr ( $value, "mail exchanger" ) ) { $nslookup[$i] = $value; $i++; }
  • }
  • while ( list ( $key, $value ) = each ( $nslookup ) ) {
  • $temp = explode ( " ", $value );
  • $mx[$key][0] = $temp[3];
  • $mx[$key][1] = $temp[7];
  • $mx[$key][2] = gethostbyname ( $temp[7] );
  • }
  • for($i = 0; $i < count($mx); $i++) {
  • $mail[$i] = $mx[$i][2];
  • }
  • } else {
  • if(MXtest($srv)) {
  • $mail[0] = gethostbyname($srv);
  • }
  • }
  • return $mail;
  • }
  • ?>
<?php

/*
 * Sendmail()
 * fonction PHP pour l'envoie de mails
 * avec mail() désactivée
 *
 * utilise les sockets
 *
 * la fonction getmxr a été repompée (et modifiée pour l'occasion) sur la doc de php.net, soncréateur ne m'en voudras pas d'avoir ommis son nom ;)
 *
 */

function sendMail($destinataire, $emetteur, $sujet, $message) {
$damail = "Subject: $sujet 
To: <$destinataire>
From: <$emetteur>
\n $message \n
\n.\n
";	
	$mx = getMX($destinataire);
	$socket = connectTo($mx, 25);
		$rep = getSMTPcode(read($socket));
		if($rep == 220) {
			sendTo("HELO ".$_SERVER['SERVER_NAME']."\n", $socket);
			$rep = getSMTPcode(read($socket));
			if($rep == 250) {
				sendTo("MAIL FROM <".$emetteur.">\n", $socket);
				$rep = getSMTPcode(read($socket));
				if($rep == 250) {
					sendTo("RCPT TO <".$destinataire.">\n", $socket);
					$rep = getSMTPcode(read($socket));
					if($rep == 250) {
						sendTo("DATA\n", $socket);
						$rep = getSMTPcode(read($socket));
						if($rep == 354) {
							sendTo($damail, $socket);
							$rep = getSMTPcode(read($socket));
							if($rep == 250) {
								echo "mail envoyé";
							}
							socket_close($socket);
						}
					}
				}
			}
		} else {
			echo "Erreur durant l'envoi<br>";
			echo read($socket);
		}
}

function connectTo($server, $port) {
	$socket = socket_create (AF_INET, SOCK_STREAM, 0);	
	$result = socket_connect ($socket, $server, $port);
	if(!$result) {
		echo "Impossible de se connecter au SMTP distant";
		echo "\$result=".$result."; \$socket=".$socket."; \$server=".$server."; \$port=".$port."<br>";
		exit;
	}
	return $socket;
}

function sendTo($buffer, $sock) {
	socket_write($sock, $buffer, strlen($buffer));
}

function read($sock) {
	$out = socket_read($sock, 2048);
	return $out;
}

function getSMTPcode($str) {
	$code = substr($str, 0, 3);
	return $code;
}

function MXtest($MX) {
	$mxsock = socket_create (AF_INET, SOCK_STREAM, 0);
	if(socket_connect($mxsock, $MX, 25)) {
		return true;
	} else {
		return false;
	}
}

function getMX($email) {
	$srv_array = explode("@", $email);
	$srv = $srv_array[1];
	
	$servsoft = $_SERVER["SERVER_SOFTWARE"];
	
	if(!substr_count($servsoft, "Win")) {
		getmxrr($srv, $servers);
		$servers[0] = gethostbyname($servers[0]);
		return $servers[0];
	} else {
		$servers = getmxr($srv);
		for($i = 0; $i < count($servers); $i++) {
			if(MXtest($servers[$i])) {
				return $servers[$i];
				break;
			}
		}
	}
}

function getmxr($srv) {
	if(substr_count($srv, ".") < 2) {
		$command = "nslookup -type=mx ".$srv;
		exec ( $command, $result );
		
		$i = 0;
		while ( list ( $key, $value ) = each ( $result ) ) {
		   if ( strstr ( $value, "mail exchanger" ) ) { $nslookup[$i] = $value; $i++; }
		}
		
		while ( list ( $key, $value ) = each ( $nslookup ) ) {
		   $temp = explode ( " ", $value );
		   $mx[$key][0] = $temp[3];
		   $mx[$key][1] = $temp[7];
		   $mx[$key][2] = gethostbyname ( $temp[7] );
		}
		
		for($i = 0; $i < count($mx); $i++) {
			$mail[$i] = $mx[$i][2]; 	
		}
	} else {
		if(MXtest($srv)) {
			$mail[0] = gethostbyname($srv);
		}
	}	
	
	return $mail;
}
?>

 Conclusion

pour l'utiliser, le mieu est de mettre ça dans un script, à inclure, puis d'appeler la fonction par

sendMail($destinataire, $emetteur, $sujet, $message);

exemple, pour envoyer un courrier contenant "bonjour, ça va", et ayant comme sujet "bien?" à duchmol@laposte.net, depuis la boite trouduc@msn.com, on taperas

sendMail("duchmol@laposte.net", "trouduc@msn.com", "bien?", "bonjour, ça va?");

simple ;)

ça marche théoriquement (du moins, chez moi)
mais c'est certainement pas exempts de bug, alors n'hésitez pas à critiquer pour que je débug ça ;)


 Sources du même auteur

PHPGENPWD
Source avec Zip UN BON PTIT FORUM EN PHP

 Sources de la même categorie

Source avec Zip Source avec une capture FORM TO MAIL AVEC PROTECTION PAR TOKEN ET CAPTCHA CONTRÔLES ... par cod57
Source avec Zip Source avec une capture FORMULAIRE VERS COURRIEL BASIQUE AVEC CONTRÔLE CAPTCHA ANTI ... par cod57
Source avec Zip CHAT EN PHP ET JQUERY par pitchoubrazil
Source avec Zip Source avec une capture FORMULAIRE DE CHOIX MULTI-CONTACT VALIDE XHTML 1.0 TRANSITIO... par aventurier19
Source avec Zip Source avec une capture WEB MESSENGER par EvildarkEurope

Commentaires et avis

Commentaire de mehdibou le 13/05/2003 16:19:55

Sympa ça, bien trouvé :)
Je pense que le support des headers ne sera pas trop dur...1 ligne à ajouter ;)

Commentaire de Lissyx le 13/05/2003 16:21:42

wé, mais flemme ;)

Commentaire de iubito le 13/05/2003 17:12:09

ça marche chez free ça ?

Commentaire de Lissyx le 13/05/2003 17:13:56

théoriquement

Commentaire de iubito le 13/05/2003 17:18:43

j'essayerai alors !

Commentaire de Lissyx le 13/05/2003 17:26:59

apparement, ça passe pas, à cause du blocage de ... exec

vas donc falloir trouver un moyen pour récupérer les MX, si vous avez une idée, je prends :)

Commentaire de Lissyx le 13/05/2003 18:08:44

problème des MX réglé

mais reste que chez free, je me prends l'erreur

Warning: socket_read() unable to read from socket [107]: Transport endpoint is not connected in sendMail.php on line 63

Warning: socket_last_error() expects parameter 1 to be resource, null given in sendMail.php on line 64

Commentaire de Lissyx le 13/05/2003 18:45:16

bon, après plusieurs tentative, y a de la magie noire chez free ;)

en fait c'est la connexion connectTo() depuis chez free qui veux pas se faire, aucune idée du pourquoi

Commentaire de Kirua le 14/05/2003 07:39:34

ermf alors en définitive ça marche ou pas? :) parce qu'il y a déjà de très bon codes pr ça ;)

Commentaire de Magicking le 14/05/2003 08:29:13

Chez Free de toute maniere sa marche pas j'avais déjà utilisé sa y'a qque mois et sa marchez pas alors que sur mon pc sa marchais mais sa marche pas pasque Free bloque le port 25

Commentaire de Kirua le 14/05/2003 13:57:05

hum, alors qu'on m'explique, si t'as essayé le même script il y a des mois euh ? qu''est-ce que ça fait ici mtnt?

enfin, de tte façon c'est du pas testé puisque l'auteur mentionne Free mais ce n'est pas effectif!

qui a mis 9 ???

Commentaire de seed le 18/05/2003 22:24:58

Impossible de se connecter au SMTP distant$result=; $socket=Resource id #1; $server=; $port=25


voila ce que je recois comment ca se fais ??

Commentaire de Lissyx le 18/05/2003 22:29:34

apparement, y trouve pas le serveur...

Commentaire de Magicking le 19/05/2003 15:32:17

  Message de seed déposé le 18/05/2003 22:24:58
------------------------------------------------------------------------
Impossible de se connecter au SMTP distant$result=; $socket=Resource id #1; $server=; $port=25
voila ce que je recois comment ca se fais ??

C'est normal sur Free il bloque le port 25 pour eviter ce genre de script manque de pot
Mais sinon quand même bonne source

Commentaire de seed le 19/05/2003 19:05:27

bon d accord pendant que l on y est esque qqn pourrait m expliquer ce qu est un port pauqe j avouerais ne pas connaitre !!!!
je sais que pour se connecter en ftp sur free il fo obligatoirement etre sur le port 21 mais quesque cela signifi???
(je tient a signaler que j ai bien compris qu il fo mettre 21 dans le champ ^port mais je voudrais savoir ce que ca change vis a vis de l hebergeur .. AI-je ete claire???)

j ai oublier de dire que j etais chez free

Commentaire de iubito le 19/05/2003 19:10:53

si on veut simplifier, les ports, c comme à la radio... il faut être à la même fréquence que l'émetteur pour entendre.
Bon sur les serveurs, c pas une histoire de fréquence, l'envoi d'un message sur le point d'entrée du serveur free n° 21 prévient le serveur que c'est son logiciel ftp qui doit réagir.
Y'a un port (le 80 généralement) sur lequel ton navigateur internet envoie un message "je veux la page machin", et le serveur répond au navigateur par ce même canal 80 "je t'envoie la page machin".

y'a d ports pour pleins de truc, communiquer avec une base de données, un proxy, un ftp, un telnet (exécuter des commandes sur une machine distante), un VNC (prendre le contrôle d'un ordinateur distant)... mais il faut qu'au bout il y ait un logiciel pour comprendre le message.
je c pas si c clair, mais la notion n'est pas évidente en effet ;-)

Commentaire de Magicking le 19/05/2003 19:18:03

Hum je rectifie il renvoie pas la page sur le port 80 mais un autre port compris entre beaucoup et beaucoup

Commentaire de Kirua le 19/05/2003 21:29:28

et puis aussi, (je sais que tu le sais et que t'as voul ufaire simple iubito ;)), mais tu peux très bien faire passer du FTP sur le port 8080, 80, 563, 9747, tout ce que tu veux, mais disons que par convention, le FTP c 21, le TELNET sauf erreur c 20, le HTTP c 80 (ou 8080, par fois, ou même 88) le SMTP c 25, etc etc...

Commentaire de Lissyx le 19/05/2003 21:30:21

c'est pas 23 le telnet ? et 22 le SSH

Commentaire de Magicking le 19/05/2003 21:38:33

Message de Lissyx déposé le 19/05/2003 21:30:21
--------------------------------------------------------------------------------

c'est pas 23 le telnet ? et 22 le SSH

si

Pour Kirua se que je voulais dire c'est que la page renvoyais par le serveur n'est pas renvoye sur le port 80

Commentaire de iubito le 19/05/2003 22:03:42

23 telnet
20 et 21 ftp (l'un pour l'envoi, l'autre pour la réception)

y'a d ports pour KaZaA, eDonkey, trillian, Yahoo Messenger... bref pour pleins de trucs !
et puis y'a le port .... d'Amsterdam !
oups je m'égare un peu là, non? LOL

Commentaire de Kirua le 19/05/2003 22:30:55

y a les porres de la peau, les porcs qu'on mange, et tous pleisn d'autres.
oui le 23 en effet, désolé pr cette erreur.

Commentaire de beeline le 20/05/2003 13:13:35

juste pour rapelle,
il existe sur ce site une librairi qui s'apelle protomail et qui permet d'envoyer des mail de chez free.
Si vous avez prevu tout votre site avec mail()
faite juste une petite fonction du genre

funtion mail(par1,par2 etc.)
{
protomail(par1, par2 etc . )
}

jdi juste sa parceque j fait un truc dans le genre

Commentaire de Kirua le 20/05/2003 16:26:14

ben oui on en a déjà parlé plus haut, la fct protomail marche impec, et en plsu elle a été mise à jour pr etre exécutée jusqu'à ce que ça marche, donc c nickel ^^
tu es sur que PHP acceptera que tu lui bouffes ça fct? :/

Commentaire de sirena73 le 29/05/2003 10:47:46

Bonjour, je démarre juste en PHP, alors j'espère que vous me pardonnerez mes ignorances...
Pourriez-vous me dire où est cette fameuse librairie protomail et comment je dois l'utilliser dans mes scripts ?
Merci beaucoup.

Commentaire de Kirua le 29/05/2003 11:01:09

la librairie protomail est jsute là au dessus et y a un exemple dedans

Commentaire de poua le 20/07/2003 09:16:57

j'utilise easyphp et  un fatal error signale ne pas reconnaitre certains mots clés utilisés tels que socket, createsocket... peux-tu me dire ce qu'il faut ajouter pour que tout ça soit reconnu?

Commentaire de Lissyx le 20/07/2003 12:43:56

poua, mauvais php, changer php :-D

je sais pas comment activer les sockets avec le php de EasyPHP.....
c'est à eux qu'il faut demander

Commentaire de iubito le 20/07/2003 12:49:22

www.easyphp.org &gt; Forum ...

Commentaire de Magicking le 20/07/2003 15:19:21

personnellement j'utilise fsockopen et pfsockopen étant donne que "socket" n'est pas une fonction de php ni même createsocket etant donne que le nom c'est socket_create

http://fr3.php.net/manual-lookup.php?pattern=socket&lang=fr

Commentaire de kirikiri84 le 04/08/2003 11:12:51

alor, cescript marche ou pas chez FREE ?

Commentaire de Magicking le 04/08/2003 11:41:50

A partir du moment ou tu te connecte sur le port 25 a partir de Free normalement sa marche pas...

Commentaire de kirikiri84 le 04/08/2003 11:46:25

Désolé, donc comme Protomail ne marche plus depuis la mise à jour du service imap, il n'y a aucun moyen d'envoyer des mail !

Alor, queulqu'un pourré me donné le nom d'un hébergeur GRATUIT ayant la fonction mail activé

Commentaire de Magicking le 04/08/2003 11:48:56

il y'a peut-etre skreel(www.skreel.org) ou encore multimania(lol)

Commentaire de kirikiri84 le 04/08/2003 11:52:41

Pourquoi dis tu "Multimania(lol)"

Par contre skreel, sa à l'air bien

Commentaire de Magicking le 04/08/2003 11:56:15

Pasque multimania c de la M**** mais chuuuut!!!!

Commentaire de kirikiri84 le 04/08/2003 11:58:29

maisla commande mail , elle est activée ou pas ?

Commentaire de Magicking le 04/08/2003 12:44:56

...(sans reponse) je l'aurais pas mentionner si elle n'etait pas active bon dsl mais je vais plus repondre car mon email sature...

Commentaire de Nargzul le 12/08/2003 15:16:11

euh, mais cette fonction mail, ya pas de problème sur les site ou tu achetes ton nom de domaine et ton espace?(enfin plutot loue...)

si je vais bientot etre en possession d'un site en .net, et kil est hébergé chez OVH, ya pas de prob hein???

Commentaire de Lissyx le 12/08/2003 15:18:48

bah faut que les sockets soitent autorisés, sur OVH je crois que oui

Commentaire de Magicking le 12/08/2003 22:01:51

En generale les espace que tu loue/achete n'ont aucune fonction desactive(sauf peut-etre quand tu loue mais pas la fonction mail)

mais c'ette se voulais etre une alternative a la fonction mail sauf que manque de bol sur certain serveur comme free il vont jusqu'a bloque le port de mail...

mais sinon utilise la fonction mail qui evite de rajouter du code pour rien

Au faite il aurait mieux value utiliser fsockopen qui est plus utilise et qui marche même si l'option '--with-socket' est omise

Commentaire de Huugooo le 05/06/2004 16:52:29

Vous voulez une info ????

La fonction mail() est rétablie chez free depuis 2 ou 3 mois lol !!!

Perso je galèrais à renvoyer mes visiteurs sur une page multimania pour que ça marche.
Plus besoin maintenant !
Une preuve ? www.alacigogne.com (hébergé chez free)

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales