J_G
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
10
13 déc. 2005 à 11:35
Salut,
J'ai jamais eu besoin de configurer quoique se soit pour envoyer un mail avec Apache 2 sous mdk.
Mais bon, si tu coinces dans l'envoi des mail, je peux te proposer un source qui envoi Ca$h !!!
1. chope le nom de domaine depuis l'adresse mail (derrière le @)
2. demande aux serveur dns l'IP (ou les IP) correspondant à ce domaine (getmxrr & gethostbyname)
3. Pour chaque IP trouvé, tente une connexin fsockopen sur port 25 du
serveur destinataire. Et envoi directos le mail au gars concerné !
4. Si pas d'IP trouvé, je tente d'envoyer quand même la connexion avec le nom de domaine.
Intérets :
1 => plus rapide que mail()
2 => certitude de la bonne réception du mail, et donc la validité de l'adresse mail est testée en directe (return false)
3 => fonctionne sous Windows ! (même si tu t'en fout, et moi aussi)
Inconveniant :
1 => La source d'origine n'est pas de moi ;)... Mais je l'ai pas mal modifié
2 => n'envoi qu'un seul mail à la fois (donc pour des envois groupés, faire une boucle sur les destinataires)
3 => Le destinataire du mail et les entêtes du mail n'ont rien à
voir !!!! Je le dis, car ça m'a pris une demi heure avant de percuter
ex:
Pour envoyer une Copie du mail (Cc: )... Ahahah ! genre
--------header-------
To: moi@moi.fr, lui@lui.fr
Cc: elle@elle.fr
--------/header-------
Ben tu te connecte à elle.fr (elle.fr est la destinataire).
Puis tu envoi le header defini ci dessus...
Et donc pour envoyer des Bcc, ne pas oublier de les effacer de l'header
(sauf celui à qui tu envoi, sinon tu vas passer pour spam)
Bon, je te laisse décortiquer la source, c'est pas très compliqué, tu verras...
A+
PS : je viens de faire deux-trois modif pour toi, excuses les éventuelles fautes de syntaxe
--------------------------SOURCE------------------------------
<?php
// getmxrr() - fix for windows users
if(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'){
function getmxrr($hostname, &$mxhosts){
$mxhosts = array();
exec('nslookup -type=mx '.$hostname, $result_arr);
foreach($result_arr as $line){
if(preg_match("/.*mail exchanger (.*)/", $line, $matches)) $mxhosts[]
$matches[1];
}
return (count($mxhosts) > 0);
}
}
// usleep() - fix for >= php5 windows users
function msleep($usecs){
$temp = gettimeofday();
$start = (int)$temp['usec'];
while(true){
$temp = gettimeofday();
$stop = (int)$temp['usec'];
if(($stop-$start) >= $usecs) break;
}
}
/**
* Return an array with tow values: boolean and string
*
* @author Laurentiu Tanase <expertphp@yahoo.com>
* @Modifier Julien Garand (expertphp ;) frimeur... )
*
=> Traduction en français des messages d'erreur
* => quelques améliorations passagères
* => ajout de la variale de débuggage
*
=> ajout du "on essaye avec le nom de domaine"
* @version 2.4
* @param string $to To e-mail address
* @param string $subject Mail Subject
* @param string $message Message ( Mixed )
* @param string $from From e-mail address
* @param string $header Additional headers
* @param integer $timeout Time out connection
*/
function smtp_mail($to, $subject, $message, $from, $header, $timeout = 30, $debug=false){
$exp_to = explode("@", $to);
getmxrr($exp_to[1], $mxhost);
$iparr = array();
// ici, on chope une colection d'IP
foreach($mxhost as $hostname) {
$iphost = gethostbyname($hostname);
if($debug and ($hostname $iphost or $hostname $exp_to[1]))
echo
"$hostname pas trouvé, on essaye avec le nom de domaine
\n";
$iparr[] = $iphost;
}
$vphp (strtoupper(substr(PHP_OS, 0, 3)) 'WIN'
&& version_compare(phpversion(), "5.0.0", ">=")) ? true :
false;
$ret = false;
// Et là, on essaye les IP les uns après les autres
foreach($iparr as $ipaddr){
if( !($connect = @fsockopen($ipaddr, 25, $err_num, $err_msg, $timeout)) ) {
if($debug) echo "Connexion à $ipaddr échouée
\n";
continue;
}
$rcv0 = fgets($connect, 1024);
if(substr($rcv0, 0, 3) != "220"){
fclose($connect);
if($debug)
echo "Le serveur à répondu $rcv0 à la connexion
\n";
continue;
}
$exp_from = explode("@", $from);
fputs($connect, "HELO ".$exp_from[1]."\r\n");
$rcv1 = fgets($connect, 1024);
if(substr($rcv1, 0, 3) != "250"){
fclose($connect);
if($debug)
echo "Le serveur à répondu $rcv1 à l'envoi de 'HELO
{$exp_fro[1]}'
\n";
continue;
}
fputs($connect, "MAIL FROM:<".$from.">\r\n");
$rcv2 = fgets($connect, 1024);
if(substr($rcv2, 0, 3) != "250"){
fclose($connect);
if($debug)
echo "Le serveur à répondu $rcv2 à l'envoi de 'MAIL
FROM:<".$from.">'
\n";
continue;
}
fputs($connect, "RCPT TO:<".$to.">\r\n");
$rcv3 = fgets($connect, 1024);
if(substr($rcv3, 0, 3) != "250"){
fclose($connect);
if($debug)
echo "Le serveur à répondu $rcv3 à l'envoi de 'RCPT
TO:<".$to.">'
\n";
continue;
}
fputs($connect, "DATA\r\n");
$rcv4 = fgets($connect, 1024);
if(substr($rcv4, 0, 3) != "354"){
fclose($connect);
if($debug)
echo "Le serveur à répondu $rcv4 à l'envoi de 'DATA'
\n";
continue;
}
// entête par défaut...
// Les entêtes spécifiées écraseront celles-ci (genre un To remplacera le To d'ici)
$arrH = array('Date'=>strftime(DATEFR_XL),
'Subject'=>"$subject",
'To'=>""$exp_to[0]"
<$to>",
'From'=>""{$exp_from[0]}"
<$from>");
$h = str_replace("\r",'',$header);
$h = explode("\n",$h);
foreach($h as $v) {
$v = str_replace(': ',':',$v);
if( !isset($v[0],$v[1]) ) continue;
list($a,$b) = explode(':',$v);
if(!$a or !$b) continue;
$arrH[$a] = $b;
}
$h = '';
foreach($arrH as $k=>$v) {
$h.="$k: $v\r\n";
}
$rep = array(".\r\n", ".\n", ".\r");
fputs($connect, $h."\r\n".str_replace($rep, ". \r\n", $message)." \r\n");
fputs($connect, ".\r\n");
$rcv5 = fgets($connect, 1024);
if(substr($rcv5, 0, 3) != "250"){
fclose($connect);
if($debug)
echo "Le serveur à répondu $rcv5 à l'envoi des entêtre
\n$header
\net du message
\n$message
\n";
continue;
}
fputs($connect, "QUIT\r\n");
if($vphp) msleep(1);
else usleep(1);
$rcv6 = fgets($connect, 1024);
if($vphp) msleep(1);
else usleep(1);
fclose($connect);
$ret = true;
break;
}
return $ret;
} // End smtp_mail() -----------------------------
?>
-------------------FIN-------SOURCE------------------------------