Contournement de la désactivation de mail()

Contenu du snippet

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

Source / Exemple :


<?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 ;)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.