Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASS MAILEUR


Information sur la source

Catégorie :E-Mail / Messagerie Classé sous : maileur, smtp, mail, class, socket Niveau : Initié Date de création : 13/06/2005 Date de mise à jour : 14/12/2005 15:50:47 Vu : 6 130

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (44)
Ajouter un commentaire et/ou une note


Description

Comment envoyer un mail sans la fonction mail ? (elle est parfois désactivée)

j'ai aussi pris le temps de gérer les envois à de multiples personnes, les surnoms, le changement possible de la date, les pièces jointes... l'entête est rédigée automatiquement, on n'a juste à choisir le type de contenu.

Sachant que CC est un champ inutile, je ne l'ai pas mis ici.

Pour faire plaisir à certaines personnes, j'ai fait une class...
 

Source

  • <?php
  • class Mail_{
  • function coupe($str, $l){
  • /*
  • coupe la chaine $str en n lignes de $l caractères
  • */
  • $retour='';
  • while(($a=substr($str,0,$l))){
  • $str=substr($str,$l);
  • $retour.=$a.'
  • ';
  • }
  • return $retour;
  • }
  • function set($serveur, $timeout=15, $port=25, $auth=false){
  • $this->serveur=$serveur;
  • $this->timeout=$imeout;
  • $this->port=$port;
  • $this->auth=$auth;
  • }
  • function setFrom($from, $namefrom){
  • $this->from=$from;
  • $this->namefrom=$namefrom;
  • }
  • function send($toar, $nameto ,$message, $prioritee, $subject, $type='plain', $piece_jointes=false, $date=false){
  • /*
  • Cette fonction envoi un mail par le protocol SMTP, elle renvoi un tableau qui contient :
  • true or false selon le fait qu'il y ai eu une erreur ou non
  • puis les différentes phases de l'intervention : soit le message d'erreur et le code, soit
  • ce que le maileur à dit.
  • Elle permet :
  • de choisir son serveur, son port,
  • destinataire, nom du destinataire, sous forme de tableaux pour pouvoir en mettre plusieurs
  • destitinateur, nom du destinateur,
  • message,
  • prioritée,
  • sujet,
  • les pièces jointes sous formes de tableau (ou false, mais c'est un paramètre optionnel)
  • la date (ou false, mais c'est un paramètre optionnel)
  • le temps d'attente maximal pour la connexion (15 par défaut, c'est un paramètre optionnel)
  • le port réseau (25 par défaut, c'est un paramètre optionnel)
  • */
  • //effectue un prétraitement du message :
  • $sock=fsockopen($this->serveur, $this->port, $errno, $errstr, $this->timeout);
  • if (!$sock) {
  • return array(false, $errstr, $errno);
  • }else{
  • if ($date===false){
  • $date=date('r');
  • }
  • $r="\r\n";
  • $message=str_replace("\n.","\n..",$message);
  • if ($piece_jointes===false)
  • $message='Content-Type: text/'.$type.'; charset=ISO-8859-1; format=flowed'.$r.
  • 'Content-Transfer-Encoding: 7bit'.$r.
  • $message.$r;
  • else{
  • $boundary='------------000505030409000304030606';
  • $message='Content-Type: multipart/mixed;'.$r.
  • ' boundary="'.$boundary.'"'.$r.$r.
  • 'This is a multi-part message in MIME format.'.$r.
  • '--'.$boundary.$r.
  • 'Content-Type: text/'.$type.'; charset=ISO-8859-1; format=flowed'.$r.
  • 'Content-Transfer-Encoding: 7bit'.$r.
  • $message.$r.$r.
  • '--'.$boundary.$r;
  • $end=count($piece_jointes)-1;
  • foreach ($piece_jointes as $n=>$a){
  • $message.='Content-Type: application/'.filetype($a).';'.$r.
  • ' name="'.$a.'"'.$r.
  • 'Content-Transfer-Encoding: base64'.$r.
  • 'Content-Disposition: attachement;'.$r.
  • ' filename="'.$a.'"'.$r.
  • $r.coupe(base64_encode(file_get_contents($a)),72).'--'.$boundary;
  • if ($n==$end)
  • $message.='--'.$r;
  • else
  • $message.=$r;
  • }
  • }
  • $tostr='';
  • $msg=array();
  • $msg[]=true;
  • //les présentations
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • fwrite($sock, 'HELO coucou'.$r);
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • if ($this->auth!==false){
  • fwrite($sock, 'AUTH LOGIN'.$r);
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • fwrite($sock, base64_encode($auth[0]).$r);
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • fwrite($sock, base64_encode($auth[1]).$r);
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • }
  • //indique le destinateur
  • fwrite($sock, 'MAIL FROM: <'.$this->from.'>'.$r);
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • //indique le destinataire
  • foreach ($toar as $n=>$to){
  • fwrite($sock, 'RCPT TO: <'.$to.'>'.$r);
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • $tostr.=$nameto[$n].' <'.$to.'>,';
  • }
  • //indique que l'on commence à envoyer le message
  • fwrite($sock, 'DATA'.$r);
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • fwrite($sock,'From: '.$this->namefrom.' <'.$this->from.'>'.$r
  • .'To: '.substr($tostr,0,strlen($tostr)-1).$r
  • .'Subject: '.$subject.$r
  • .'X-Priority: '.$prioritee.$r
  • .'Date: '.$date.$r
  • .$message.'.'.$r);
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • //quitte
  • fwrite($sock, 'QUIT'.$r);
  • $msg[]=fgets($sock, 4096);
  • if (substr($msg[count($msg)-1],0,1)=='5'){
  • $msg[0]=false;
  • return $msg;
  • }
  • fclose($sock);
  • }
  • return $msg;
  • }
  • }
  • ?>
<?php

class Mail_{
	function coupe($str, $l){
		/*
			coupe la chaine $str en n lignes de $l caractères
		*/
		$retour='';
		while(($a=substr($str,0,$l))){
			$str=substr($str,$l);
			$retour.=$a.'
	';
		}
		return $retour;
	}
	function set($serveur,  $timeout=15, $port=25, $auth=false){
		$this->serveur=$serveur;
		$this->timeout=$imeout;
		$this->port=$port;
		$this->auth=$auth;
	}
	function setFrom($from, $namefrom){
		$this->from=$from;
		$this->namefrom=$namefrom;
	}
	function send($toar, $nameto ,$message, $prioritee, $subject, $type='plain', $piece_jointes=false, $date=false){
		/*
		Cette fonction envoi un mail par le protocol SMTP, elle renvoi un tableau qui contient :
		true or false selon le fait qu'il y ai eu une erreur ou non
		puis les différentes phases de l'intervention : soit le message d'erreur et le code, soit
		ce que le maileur à dit.
		Elle permet :
		de choisir son serveur, son port,
		destinataire, nom du destinataire, sous forme de tableaux pour pouvoir en mettre plusieurs
		destitinateur, nom du destinateur,
		message,
		prioritée,
		sujet,
		les pièces jointes sous formes de tableau (ou false, mais c'est un paramètre optionnel)
		la date (ou false, mais c'est un paramètre optionnel)
		le temps d'attente maximal pour la connexion (15 par défaut, c'est un paramètre optionnel)
		le port réseau (25 par défaut, c'est un paramètre optionnel)
		*/
		//effectue un prétraitement du message :
		$sock=fsockopen($this->serveur, $this->port, $errno, $errstr, $this->timeout);
		if (!$sock) {
			return array(false, $errstr, $errno);
		}else{
			if ($date===false){
				$date=date('r');
			}
			$r="\r\n";
			$message=str_replace("\n.","\n..",$message);
			if ($piece_jointes===false)
				$message='Content-Type: text/'.$type.'; charset=ISO-8859-1; format=flowed'.$r.
				'Content-Transfer-Encoding: 7bit'.$r.
				$message.$r;
			else{
				$boundary='------------000505030409000304030606';
				$message='Content-Type: multipart/mixed;'.$r.
				' boundary="'.$boundary.'"'.$r.$r.
				'This is a multi-part message in MIME format.'.$r.
				'--'.$boundary.$r.
				'Content-Type: text/'.$type.'; charset=ISO-8859-1; format=flowed'.$r.
				'Content-Transfer-Encoding: 7bit'.$r.
				$message.$r.$r.
				'--'.$boundary.$r;
				$end=count($piece_jointes)-1;
				foreach ($piece_jointes as $n=>$a){
					$message.='Content-Type: application/'.filetype($a).';'.$r.
					' name="'.$a.'"'.$r.
					'Content-Transfer-Encoding: base64'.$r.
					'Content-Disposition: attachement;'.$r.
					' filename="'.$a.'"'.$r.
					$r.coupe(base64_encode(file_get_contents($a)),72).'--'.$boundary;
					if ($n==$end)
						$message.='--'.$r;
					else
						$message.=$r;
				}
			}
			$tostr='';
			$msg=array();
			$msg[]=true;
			//les présentations
			$msg[]=fgets($sock, 4096);
			if (substr($msg[count($msg)-1],0,1)=='5'){
				$msg[0]=false;
				return $msg;
			}
			fwrite($sock, 'HELO coucou'.$r);
			$msg[]=fgets($sock, 4096);
			if (substr($msg[count($msg)-1],0,1)=='5'){
				$msg[0]=false;
				return $msg;
			}
			if ($this->auth!==false){
				fwrite($sock, 'AUTH LOGIN'.$r);
				$msg[]=fgets($sock, 4096);
				if (substr($msg[count($msg)-1],0,1)=='5'){
					$msg[0]=false;
					return $msg;
				}
				fwrite($sock, base64_encode($auth[0]).$r);
				$msg[]=fgets($sock, 4096);
				if (substr($msg[count($msg)-1],0,1)=='5'){
					$msg[0]=false;
					return $msg;
				}
				fwrite($sock, base64_encode($auth[1]).$r);
				$msg[]=fgets($sock, 4096);
				if (substr($msg[count($msg)-1],0,1)=='5'){
					$msg[0]=false;
					return $msg;
				}
			}
			//indique le destinateur
			fwrite($sock, 'MAIL FROM: <'.$this->from.'>'.$r);
			$msg[]=fgets($sock, 4096);
			if (substr($msg[count($msg)-1],0,1)=='5'){
				$msg[0]=false;
				return $msg;
			}
			//indique le destinataire
			foreach ($toar as $n=>$to){
				fwrite($sock, 'RCPT TO: <'.$to.'>'.$r);
				$msg[]=fgets($sock, 4096);
				if (substr($msg[count($msg)-1],0,1)=='5'){
					$msg[0]=false;
					return $msg;
				}
				$tostr.=$nameto[$n].' <'.$to.'>,';
			}
			//indique que l'on commence à envoyer le message
			fwrite($sock, 'DATA'.$r);
			$msg[]=fgets($sock, 4096);
			if (substr($msg[count($msg)-1],0,1)=='5'){
				$msg[0]=false;
				return $msg;
			}
			fwrite($sock,'From: '.$this->namefrom.' <'.$this->from.'>'.$r
			.'To: '.substr($tostr,0,strlen($tostr)-1).$r
			.'Subject: '.$subject.$r
			.'X-Priority: '.$prioritee.$r
			.'Date: '.$date.$r
			.$message.'.'.$r);
			$msg[]=fgets($sock, 4096);
			if (substr($msg[count($msg)-1],0,1)=='5'){
				$msg[0]=false;
				return $msg;
			}
			//quitte
			fwrite($sock, 'QUIT'.$r);
			$msg[]=fgets($sock, 4096);
			if (substr($msg[count($msg)-1],0,1)=='5'){
				$msg[0]=false;
				return $msg;
			}
			fclose($sock);
			
		}
		return $msg;
	}
}
?>

Historique

30 novembre 2005 13:41:14 :
ajouts de mots clefs
14 décembre 2005 15:50:48 :
Débugage, plus transformation de la fonction en class

Commentaires et avis

signaler à un administrateur
Commentaire de Kevin007 le 13/06/2005 20:54:31

Salut,

La source a l'air pas mal :D bravo mais deux points importants :

_ As-tu pensé à la commande EHLO remplaçant la commande HELO sur certains serveurs ?

_ As-tu aussi pensé à la réponse du serveur avec ses codes ?

Bonne continuation pour la suite :P

signaler à un administrateur
Commentaire de coucou747 le 13/06/2005 21:12:44

La commande EHLO n'existe pas, or, la commande HELO fonctionne partout...

la réponse du serveur est prise en compte, si tu regardes ce qu'a renvoyé la fonction...

signaler à un administrateur
Commentaire de GRenard le 14/06/2005 04:13:49

D'après toi, pourquoi CC est inutile ?
while(($a=substr($str,0,$l))) est un peu ambigue
Ca s'rait cool d'avoir les specs :)

signaler à un administrateur
Commentaire de Kevin007 le 14/06/2005 08:00:42

Je vois que tu aimes critiquer les autres mais pas être critiqué...

Quand je parle de réponse du serveur, je ne parle pas de la REPONSE FINALE mais d'une réponse étape par étape...

A bon entendeur salut ;)

signaler à un administrateur
Commentaire de malik7934 le 14/06/2005 08:03:09

Hello Coucou,

Alors comme ca la commande EHLO n'existe pas...

http://www.sourcekeg.co.uk/www.python.org/doc/2.2.3/lib/SMTP-objects.html:

helo([hostname])
Identify yourself to the SMTP server using "HELO". The hostname argument defaults to the fully qualified domain name of the local host.
In normal operation it should not be necessary to call this method explicitly. It will be implicitly called by the sendmail() when necessary.

ehlo([hostname])
Identify yourself to an ESMTP server using "EHLO". The hostname argument defaults to the fully qualified domain name of the local host. Examine the response for ESMTP option and store them for use by has_option().
Unless you wish to use has_option() before sending mail, it should not be necessary to call this method explicitly. It will be implicitly called by sendmail() when necessary.

hehe ;o)

signaler à un administrateur
Commentaire de coucou747 le 14/06/2005 08:38:05

dans les commentaires, à la ligne 18, tu vois que le maileur renvoi les différentes étapes de ce que le maileur a dit...

en effet, ligne 73 et 104, tu comprends qu'un tableau est renvoyé avec LES DIFFERENTES PHRASES QUE RENVOI LE SERVEUR !

donc, il ne renvoi pas que la réponse finale.

être critiqué ne me dérange pas, aparement, c'est plutôt moi qui te dérange en expliquant que mon script gère ce que tu demandes (plutôt paradoxal non ?)...

CC est inutile parceque le serveur le prends de la même façon que RCPT TO, la seule différence est dans l'entête du message... c'est en fait la même chose que RCPT TO... c'est juste le logiciel de réception qui les différencie.

pour mon while, j'ai mis des parenthèses en trop, c'est pas grave, mais je corrigerais. Cette fonction prends une chaine et une longueur en argument, elle est appelée quand on veut envoyer un fichier joint, elle permet de couper le fichier en lignes de 72 caractères. J'aurais pu prendre en considération les retours naturels à la ligne, mais comme le fichier subbit avant un encodage en 64 bits, on n'en a pas besoin.

pour EHLO, je n'avais jamais entendu parler de cette commande, je m'excuses d'avoir nié son existance, mais je ne pourrais pas la mettre en place, je n'ai aucun serveur qui accèpte cette commande... aucun test possible...

signaler à un administrateur
Commentaire de babid le 14/06/2005 09:48:14

Salut,

Excellent, mais petite question pourquoi n'as tu pas créer une class ?? de sorte à utiliser certaines méthodes pour définir les paramètres et d'autres pour utiliser différents types d'envoies (mail, SMTP). Enfin ce n'est qu'un avis, je dois même avoir une class de ce genre mais il faut que je la retrouve, si c'est le cas je vous la mettrai.

Bonne continuation

signaler à un administrateur
Commentaire de coucou747 le 14/06/2005 10:06:15

Pour moi, une class, ce n'est pas quelquechose que l'on peut remplacer facilement par une fonction, ce n'est pas une fonction qui a un grand nombre de paramètres, c'est tout simplement un nouveau type de variable (objets).

En perl, un objet, c'est une table de hash bénit (j'ai jamais fait de perl, mais j'ai lu linux mag), php est dérivé du perl, mais ils n'ont pas le même modèle objet, mais ça ne change rien, un objet, c'est un tas de variable, et des fonctions POUR LES TRAITER, la, les fonctions n'auraient servit qu'a utiliser les variables sans les modifier vraiment (à part message), donc, j'ai fait une fonction et non une class (même si j'ai hésité)...

si j'avais fait une class, je l'aurais appelée Message, et elle aurait permi le dialogue POP3, IMAP, SMTP, et si possible d'autres formes...
il y aurait eu une fonction encodemsg, une fonction decodemsg, et des fonctions d'envoi et de réception, ça c'est un type... Dans les livres sur le C++, on voit souvent des noms communs comme noms de classe, pas des verbes, une class ne doit donc pas faire qu'une seule action...

class Chat{
function Chat($age, $nom){
...
}
function miauler($son){
..
}
function nourrir(){
...
}
var $nom
var $prenom
}

il peut faire plein de choses mon chat, c'est donc un objet, quelquechose qui ne peut faire qu'une chose est une fonction... (un tounre visse est un visseur/dévisseur, il ne peut faire que deux choses, et je ne suis pas sur que ça soit assez pour en faire une class)

faut pas faire de class par effet de mode...

signaler à un administrateur
Commentaire de babid le 14/06/2005 10:25:10

Je suis d'accord avoir toi sur le principe de class, je ne dis pas "faut pas faire de class par effet de mode...". Pas du tout, je pensai juste que ce serait plus interressant car tu peux créer plusieurs fonctions comme :
- ajout de message en texte brut
- ajout de message en html
- ajout d'image
- ajout d'une ou plusieurs pieces jointes
- utiliser un modele (entete et pied de page)
- utiliser un modele de fond
- ajout un ou plusieurs destinataires  cachés ou non
- ajout d'un swf
- ....
Donc tu vois bien que je ne parlais pas d'une class avec une seule petite méthode mais plusieurs méthodes qui permette plus de choses.
Voila, en tout merci pour ta réponse.

Bye

signaler à un administrateur
Commentaire de Kevin007 le 14/06/2005 18:19:48

Je parlais plutôt d'une fonction retournant la réponse du serveur SMTP à chaque traitement exemple :

Fonction :

function smtp_get_answer()
{

$num_args    = func_num_args();
$code_accept = array();

for ( $i = 0; $i < $num_args; $i++ )
{
$argid = func_get_arg( $i );

if ( is_numeric( $argid ) )
{
$code_accept[] = $argid;
}

else
{
return FALSE;
}
}

return TRUE;
}

Après :

$this -> smtp_send_data( 'EHLO ' . $this -> smtp_server_from );

if ( $this -> smtp_get_answer( 250, FALSE ) )
{
$this -> smtp_send_data( 'HELO ' . $this -> smtp_server_from );

if ( !$this -> smtp_get_answer( 250 ) )
{
if ( !$this -> smtp_critical_error )
{
return FALSE;
}

$this -> smtp_error( 'This SMTP server doesn\'t know &quot;EHLO&quot; or &quot;HELO&quot; SMTP command' );
exit;
}
}

Voilà A+ ( merci pour le MP mais je n'ai rien de personnel à te reprocher, juste ta critique genre "Cette source existe des dizaines et des dizaines de fois..." )

signaler à un administrateur
Commentaire de Kevin007 le 14/06/2005 18:21:23

Désolé pour la mise en page mais PHPCS la gère très mal... :D

signaler à un administrateur
Commentaire de Kevin007 le 14/06/2005 19:40:30

Il faudrait aussi rajouter l'authentification...
Bref, tu as du travail ;)

signaler à un administrateur
Commentaire de coucou747 le 14/06/2005 20:12:45

je te remercie pour ces idées, j'ai cherché sur le site php.net, j'avais pas vu qu'on pouvait ouvrir des connexions SSL, ils n'en parlent pas énormément (un paragraphe...), mais je vais corriger ça.

donc, grace ç la doc que tu m'as filé, (j'ai un nouveau signet), je vais pouvoir complèter ce script pour la partie authentification...

signaler à un administrateur
Commentaire de Antidote le 20/06/2005 19:40:47

Salut Moi j'ai fais ma propre class email, de un parce que parce que quand tu codes un fonction de 25 paramètres que tu ne rempli pas tout le temps et dont tu ne te souvient pas forcément c'est chiant tout simplement. Mais je reconnais que le principes de la classe n'est pas la même si j'y trouve un avantage certain.

Je considère un email comme un objet, parce qu'il gère de nombreux paramètres, dans ma class on peut ajouter, retirer autant de pièces jointe que l'on veut, images dans l'email, accusé de réception ou pas etc ... par contre je ne gère pas la connexion à un serveur mail, j'utilise simplement la fontion mail() qui me suffit amplement. C'est pour ça que j'arrive à cette question :

L'utilité de ce script ? C'est surement très con et stupide et j'ai surement l'esprit fermé sur certaine ouverture que je ne doit pas voir. Mais pourquoi refaire ce que php sait faire ?

signaler à un administrateur
Commentaire de coucou747 le 20/06/2005 19:57:54

ma fonction permet aussi l'accusé de réception, et les pièces jointes...

l'utilité vient du fait qu'on n'a pas partout un serveur smtp pour utiliser la fonction mail...

signaler à un administrateur
Commentaire de jimymd64 le 28/07/2005 22:55:39

sur ma page sa marche pas
[url=http://stabno.free.fr/test.php3]http://stabno.free.fr/test.php3[/url]

signaler à un administrateur
Commentaire de coucou747 le 30/07/2005 15:06:41

je croyais que le php était mort...

signaler à un administrateur
Commentaire de zoukozouko le 17/09/2005 10:38:07

Antidote, peux tu poster ta source mail STP?
Merci.
Elle a  l'air complete telle que tu la décris...

signaler à un administrateur
Commentaire de themioux le 14/12/2005 15:10:45

-----
sur ma page sa marche pas
[url=http://stabno.free.fr/test.php3]http://stabno.free.fr/test.php3[/url]
-----

C'est normal, free refuse les communications sur port 25 avec php (enfin du moins c'est ce que j'ai lu récement sur un autre forum)

signaler à un administrateur
Commentaire de coucou747 le 14/12/2005 15:14:06

si c'est normal, alors pourquoi tu dis ça ici ?

free est l'un des pires hébergeurs du marché... (php3)

signaler à un administrateur
Commentaire de themioux le 14/12/2005 15:34:23

Je n'ai fais que répondre à un commentaire d'une personne qui se demande pourquoi ca ne marche pas sur sa page...
or elle est hébergée chez free...
donc cette source ne peut pas fonctionner chez free, ou du moins pas avec un serveur smtp dialoguant sur le port 25...

C'est sympa ici, on apporte une information et aussitot on te dit "pourquoi tu dis ca ici"... ben parce que la question a été posée ici...

Sinon, je viens de tester ta source (parce que j'ai un problème avec la fonction mail() sous win) et j'ai un bug ligne 83 : "Warning: Invalid argument supplied for foreach()" ?!?

signaler à un administrateur
Commentaire de coucou747 le 14/12/2005 15:52:11

ah dsl, je croyais avoir répondu à cette question quand j'ai dit : "je croyais que le php était mort", je voulais dire : "je croyais que le php3 était mort", je n'avais pas encore activé verr num...

Bon, avant, je n'étais pas en error_reporting(E_ALL); j'ai corrigé ce bug depuis quelques temps, mais je n'ai pas pris le temps de mettre à jour, je le fais de suite !

signaler à un administrateur
Commentaire de themioux le 14/12/2005 16:02:38

En fait, j'ai trouvé le bug... j'ai pas lu la notice et j'ai pas passé un tableau pour la liste des destinataires :P... bref, ca marche mais ca marche pas (même resultat que la fonction mail(), le mail atteint le serveur, le mail est traité par le serveur, mais le mail n'est pas envoyé RHAAAAAAAAA

j'ai essayé avec un autre serveur (je passait par celui de IIS du boulot)
j'ai installé MySMTP sur la machine avec le serveur apache (easyPhp (parce que c'est pas le même serveur O_o) mais MySMTP me réponds
"500 unknown command"
"500 unknown command"
"500 ....."

je regarderai ca demain, c'est l'heure de la débauche :D

signaler à un administrateur
Commentaire de coucou747 le 14/12/2005 16:17:59

voila comment je le fais chez moi :

$mail=new Mail_();
$mail->set($smtp_serveur);
$mail->setfrom('monmail', 'coucou747');
$a=$mail->send(array($email), array($emailname]), $content, 1, 'sujet', 'HTML');
if ($a[0]===false)
echo 'mail à '.$mail.' impossible à envoyer ! ('.implode($a).')<br />';

signaler à un administrateur
Commentaire de themioux le 15/12/2005 09:23:02

salut

c'est marrant, j'avais pas cette source dans l'après midi, j'avais mailBySmtp() :D
T'as fais la mise à jour entre temps ?

Bon, je teste la classe, et je te dis si ca marche :D
-------------------------------------------------------
ligne 18, il manque un t à $timeout ($imeout)
-------------------------------------------------------
ENFIN CA MARCHE :DDDDD

Je vais ENFIN pouvoir finir mon projet :DDDDDD (super source en tout cas, il faudra que je l'étudie de près, parce que là, j'ai fais que du copier coller :D)

signaler à un administrateur
Commentaire de coucou747 le 15/12/2005 21:14:02

super, merci, je suis content de voir que ça sert !

signaler à un administrateur
Commentaire de Antidote le 17/12/2005 16:10:44

zoukozouko >>

Si tu veux je te la passe dans l'état actuelle, mais je suis en train de la modifié ^^ Je met un envoie possible avec mail en socket SMTP dans le cas ou y aurait pas de serveur local. de plus j'y rajoute aussi le POP3 pour le SMTP qui n'accepte le relaie qu'après une auth pop ce qui le paramétrage courant aujourd'hui sinon n'importe quel serveur smtp servirai de relai pour du spam.
Et je prépare par dessus tout ça un petit système qui offre le possibilité d'archiver le mail mais aussi de les enregistrer sur le serveur au lieu de les envoyé directement si on le souhaite, tous les mails serais envoyé ensemble toutes les dix minutes (par une tache cron forcément)

Pourquoi ça ? pour ne faire qu'une auth pop et qu'un connexion smtp avec le serveur. c'est plus rapide et ça évite de saturé le serveur avec de multiple sokect etc...

Mon administrateur ma mis en garde. J'ai un de mes site qui génère 5 mails par seconde. Imaginer le nb de socket. je pense que cette méthode sera très utile à un certain nombre.

signaler à un administrateur
Commentaire de jemozone le 13/07/2006 10:56:47

Seriez vous assez aimable pour copier-coller le code complet et corrigé (fonctionnant) : je suis novice debutant (en plus autodidacte...ouinnnn)

J'ai copié le code présent en haut de cette page.

puis j'ai lu vos commentaires et ai appliqué les modif ($mail=new Mail_();
$mail->set($smtp_serveur);
$mail->setfrom('monmail', 'coucou747');
$a=$mail->send(array($email), array($emailname]), $content, 1, 'sujet', 'HTML');
if ($a[0]===false)
echo 'mail à '.$mail.' impossible à envoyer ! ('.implode($a).')<br />';) mais là  je suis perdu...

j'arrive pas a adapter....


une question :

comment exploiter ce code (si c possible bien sure) : je sais a peu pret exploiter une fonction mais pas les "class".
Cela signifie t-il que ce code se trouve dans un css et appliquer à un formulaire cette même class ? (comme pour le design d'un site) ou je suis à coté de la plaque ? (merci de m'aiguiller)

encore petite question :

j'ai créé un formulaire "contact" dont voici le code de cette page (fonctionne) :

<html>
<head>
<title>Spad - contact</title>
<link href="spad.css" rel="stylesheet" type="text/css" />
<?php
if ($statut == "ok") {
$message = "Votre message nous a bien été envoyé. Merci et à très bientôt.";
} else {
$message = "";
}
?></head> <body>

<table width="960" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="35" height="37" background="images/tab_blanc_trans/coin_haut_gauche.gif">&nbsp;</td>
    <td height="37" background="images/tab_blanc_trans/hauteur_haut.gif">&nbsp;</td>
    <td width="38" height="37"><img src="images/tab_blanc_trans/coin_haut_droit.gif" alt="coin haut droit" width="36" height="37" /></td>
  </tr>
  <tr>
    <td width="35" background="images/tab_blanc_trans/largeur_gauche.gif">&nbsp;</td>
    <td><div align="center"><table width="760" border="0" align="center" cellpadding="0" cellspacing="3" class="table">
<script language="JavaScript">
      // Teste si le mail a une forme correcte
      function checkmail(email) {
         var reg = /^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,4}$/
         return (reg.exec(email)!=null)
      }
      // Teste le contenu des champs du form avant submit
      function test(civilite,nom,societe,ville,email,message) {
         if(civilite.value=="") {
            alert("Veuillez indiquer votre civilite."); civilite.focus(); return false;
} else if(nom.value=="") {
            alert("Veuillez indiquer votre nom."); nom.focus(); return false;
} else if(prenom.value=="") {
            alert("Veuillez indiquer votre prenom."); prenom.focus(); return false;
} else if(numero.value=="") {
            alert("Veuillez indiquer votre numéro de téléphone."); numero.focus(); return false;
         } else if(!checkmail(email.value)) {
            alert("Votre email est incorrect."); email.focus(); return false;
} else if(sujet.value=="") {
            alert("Veuillez renseigner l'objet de votre demande !"); sujet.focus(); return false;
} else if(message.value=="") {
            alert("Veuillez compléter de votre demande !"); message.focus(); return false;
         }
         return true;
      }
  </script><form action="mail.php" method="post" enctype="multipart/form-data" onSubmit="return test(this.civilite,this.nom,this.prenom,this.numero,this.email,this.sujet,this.message)">
<tr>
<td width="149" valign="top" class="menu_passif"><div align="right"><input type="hidden" name="date" value="<?php setlocale(LC_TIME, 'fr', 'fr_FR', 'fr_FR.ISO8859-1');
echo strftime("%A %d %B %Y"); ?>"><input type="hidden" name="heure" value="<?php echo date('H : i : s'); ?>"></div></td>
<td colspan="3">&nbsp;</td>
</tr>
<tr>
  <td colspan="4" valign="top" class="menu_passif"><div align="center"></div></td>
  </tr>
<tr>
  <td colspan="4" valign="top" class="menu_passif"><div align="center" class="pubrouge_majuscule_clignotant"><?php echo "$message"; ?></div></td>
</tr>
<tr>
  <td colspan="3" valign="top" class="menu_passif"><strong class='pubnoire'><span class="menu_passif"><img src="images/logo.jpg" alt="Spad" width="149" height="95" longdesc="http://www.spad-nord.fr" /></span></strong><strong class='pubrouge'><br>
    S</strong><strong class='pubnoire'>&eacute;curit&eacute;&nbsp;</strong><strong class='pubrouge'>P</strong><strong class='pubnoire'>r&eacute;vention&nbsp;</strong><strong class='pubnoire'>des&nbsp;</strong><strong class='pubrouge'>A</strong><strong class='pubnoire'>ccidents&nbsp;</strong><strong class='pubrouge'>D</strong><strong class='pubnoire'>omestiques</strong>&nbsp;</td>
  <td><div align="right">
    <table width="300" border="0" align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td width="59" height="56" background="images/tab_presentation/bout_gauche.jpg">&nbsp;</td>
        <td background="images/tab_presentation/fond.jpg"><div align="center"><span class="pubnoire">Bienvenue sur le formulaire de</span> <span class="pubrouge_majuscule">contact</span></div></td>
        <td width="36" height="56" background="images/tab_presentation/bout_droit.jpg">&nbsp;</td>
      </tr>
    </table>
  </div></td>
</tr>
<tr>
  <td colspan="4" valign="top" class="menu_passif"><div align="center"></div>    </td>
  </tr>

<tr>
  <td colspan="4" valign="top" class="menu_passif"><hr /></td>
</tr>
<tr>
  <td colspan="4" valign="top" class="menu_passif"><div align="center"><span class="texte_fin">Remplissez ce formulaire en indiquant l'objet de votre demande. Un de nos conseiller vous rappelera au plus vite. </span></div></td>
</tr>
<tr>
  <td colspan="4" valign="top" class="menu_passif"><hr /></td>
  </tr>
<tr>
  <td valign="middle" class="menu_passif"><div align="right"></div></td>
  <td colspan="3">&nbsp;</td>
</tr>
<tr>
  <td valign="middle" class="menu_passif"><div align="right">Civilit&eacute;<span class="menu_actif">*</span> : </div></td>
  <td colspan="3"><span class="comcarre">
    <select name="civilite" class="inputs" id="civilite">
      <option value="Mr" selected="selected">Mr</option>
      <option value="Mme">Mme</option>
      <option value="Mlle">Mlle</option>
    </select>
  </span></td>
</tr>
<tr>
  <td valign="middle" class="menu_passif"><div align="right">Nom<span class="menu_actif">*</span> : </div></td>
  <td width="194"><input name="nom" type="text" id="nom" size="24" /></td>
  <td width="173" class="menu_passif"><div align="right">Pr&eacute;nom<span class="menu_actif">*</span> : </div></td>
  <td width="323"><input name="prenom" type="text" id="prenom" size="24" /></td>
</tr>
<tr>
  <td valign="middle" class="menu_passif"><div align="right">Courriel<span class="menu_actif">*</span> : </div></td>
  <td><input name="email" type="text" id="email" size="24" value="@" /></td>
  <td class="menu_passif"><div align="right">T&eacute;l&eacute;phone<span class="menu_actif">*</span> : </div></td>
  <td><input name="numero" type="text" id="numero" size="24" /></td>
</tr>
<tr>
<td valign="middle" class="menu_passif"><div align="right">Priorit&eacute;<span class="menu_actif">*</span> : </div></td>
<td><span class="menu_actif">
  <select name="priority" id="priority" size="1">
    <option value="Urgent">Urgent </option>
    <option value="Haute">Haute </option>
    <option value="Moyenne">Moyenne </option>
    <option value="Basse">Basse </option>
    <option value="Tr&egrave;s basse" selected>Tr&egrave;s basse </option>
  </select>
</span></td>
<td class="menu_passif"><div align="right">Mobile : </div></td>
<td><input name="mobile" type="text" id="mobile" size="24" /></td>
</tr>
<tr>
  <td colspan="4" valign="middle" class="menu_passif"><div align="center">
    <hr>
  </div>    <div align="center"></div></td>
  </tr>
<tr>
  <td colspan="4" valign="middle" class="menu_passif"><hr></td>
</tr>
<tr>
  <td colspan="4" valign="middle" class="menu_passif"><table width="654" border="0" align="center" cellpadding="0" cellspacing="0">
    <tr>
      <td width="326"><p align="center" class="texte">Vous souhaitez<span class="menu_actif">*</span> : </p>
        <div align="center">
          <table cellspacing=2 cellpadding=1 >
            <tr>
              <td valign=top><input  type="radio" name="type_demande" value="info / recevoir plaquette commerciale" ></td>
              <td class="menu_passif">Recevoir une plaquette commerciale</td>
            </tr>
            <tr>
              <td><input  type="radio" name="type_demande" value="Poser une question" ></td>
              <td class="menu_passif">Poser une question</td>
            </tr>
            <tr>
              <td><input  type="radio" name="type_demande" value="Devis / Diagnostic" checked></td>
              <td class="menu_passif">Demander un devis / expertise </td>
            </tr>
            <tr>
              <td><input  type="radio" name="type_demande" value="r&eacute;clamation" ></td>
              <td class="menu_passif">Faire une r&eacute;clamation/suggestion</td>
            </tr>
            <tr>
              <td><input  type="radio" name="type_demande" value="&ecirc;tre rappel&eacute;" ></td>
              <td class="menu_passif">Etre rappel&eacute; par un conseill&eacute; <span class="menu_actif">Spad</span>  </td>
            </tr>
                </table>
        </div></td>
      <td width="328"><div align="center"><span class="texte">Concernant la solution<span class="menu_actif">*</span> :<br>
          <br>
        </span>
          <table cellspacing=2 cellpadding=1 >
              <tr>
                <td><input  type="radio" name="type_produit" value="D&eacute;tecteurs incendie" checked></td>
                <td class="menu_passif">D&eacute;tecteurs incendie </td>
              </tr>
              <tr>
                <td><input  type="radio" name="type_produit" value="D&eacute;tecteurs Monoxyde" ></td>
                <td class="menu_passif">D&eacute;tecteurs Monoxyde carbone </td>
              </tr>
              <tr>
                <td><input  type="radio" name="type_produit" value="Installation / Intervention" ></td>
                <td class="menu_passif">Installation/intervention</td>
              </tr>
              <tr>
                <td><input  type="radio" name="type_produit" value="Maintenance" ></td>
                <td class="menu_passif">Maintenance</td>
              </tr>
              <tr>
                <td><input  type="radio" name="type_produit" value="Echange Standard" ></td>
                <td class="menu_passif">Echange standard </td>
              </tr>
              <tr>
                <td><input  type="radio" name="type_produit" value="Garantie" ></td>
                <td class="menu_passif">Garantie</td>
              </tr>
              <tr>
                <td><input  type="radio" name="type_produit" value="Partenariat" ></td>
                <td class="menu_passif">Partenariat</td>
              </tr>
                    </table>
      </div></td>
    </tr>
  </table></td>
  </tr>
<tr>
  <td colspan="4" valign="middle" class="menu_passif"><hr></td>
  </tr>

<tr>
  <td colspan="4" valign="middle" class="menu_passif"><div align="center">Votre Message<span class="menu_actif">*</span> : </div></td>
  </tr>
<tr>
  <td colspan="4" valign="middle" class="menu_passif"><hr></td>
</tr>
<tr>
  <td valign="middle" class="menu_passif"><div align="right">Objet  <span class="menu_actif">*</span> : </div></td>
  <td colspan="3" valign="middle" class="menu_passif"><input name="sujet" type="text" id="sujet" size="80" /></td>
  </tr>
<tr>
  <td colspan="4" valign="middle" class="menu_passif"><div align="center">
  
  </div></td>
  </tr>
<tr>
<td valign="middle" class="menu_passif"><div align="right">Message<span class="menu_actif">*</span> : </div></td>
<td colspan="3"><textarea name="message" cols="80" rows="5" id="message"></textarea></td>
</tr>
<tr>
<td colspan="4" valign="middle"><div align="right"><hr></div></td>
</tr>
<tr>
  <td colspan="2" valign="middle"><div align="right"><span class="comcarre"><span class="menu_passif">Je d&eacute;sire recevoir la lettre d'information de </span><span class="menu_actif">Spad-nord.fr</span></span></div></td>
  <td><span class="menu_actif">
    <input name="newsletter" type="checkbox" id="newsletter" value="Oui" />
  </span></td>
  <td>&nbsp;</td>
</tr>
<tr>
<td colspan="4" valign="top"><div align="left">
  <hr />
</div>  <div align="center"></div></td>
</tr>
<tr>
  <td height="26" colspan="4" valign="middle"><div align="center" class="menu_actif">Avant de cliquer sur le bouton &quot;Envoyer&quot; <br />
    V&eacute;rifiez bien que vous avez remplis tout les champs marqu&eacute;s d'une ast&eacute;rix *</div></td>
</tr>
<tr>
  <td height="26" colspan="4" valign="middle"><hr /></td>
</tr>
<tr>
  <td colspan="4" valign="top"><div align="center">
    <input type="hidden" name="ip" id="ip" value="<? echo $REMOTE_ADDR ?>" />
    <input name="submit" type="submit" id="submit" value="Submit" />
  </div></td>
</tr>
</form>
</table>
    </div></td>
    <td width="38" background="images/tab_blanc_trans/largeur_droit2.gif">&nbsp;</td>
  </tr>
  <tr>
    <td width="35" height="33" background="images/tab_blanc_trans/coin_bas_gauche.gif">&nbsp;</td>
    <td height="33" background="images/tab_blanc_trans/bas.gif">&nbsp;</td>
    <td height="33" background="images/tab_blanc_trans/coin_bas_droit.gif">&nbsp;</td>
  </tr>
</table>
</body>
</html>


Avec la class d'envoie, je souhaiterai, une fois ce formulaire rempli et validé (envoyé), recevoir par email le contenu de ce formulaire MAIS INCLUANT LE DESIGN.

voici comment le contenu du mail que je souhaite recevoir :

"<html><body>
<link href=\"http://www.spad-nord.fr/spad.css\" rel='stylesheet' type='text/css'><table width='960' border='0' align='center' cellpadding='0' cellspacing='0'>
  <tr>
    <td width='35' height='37' background=\"http://www.spad-nord.fr/images/tab_blanc_trans/coin_haut_gauche.gif\">&nbsp;</td>
    <td height='37' background=\"http://www.spad-nord.fr/images/tab_blanc_trans/hauteur_haut.gif\">&nbsp;</td>
    <td width='38' height='37'><img src=\"http://www.spad-nord.fr/images/tab_blanc_trans/coin_haut_droit.gif\" alt='coin haut droit' width='36' height='37' /></td>
  </tr>
  <tr>
    <td width='35' background=\"http://www.spad-nord.fr/images/tab_blanc_trans/largeur_gauche.gif\">&nbsp;</td>
    <td><table width='797' border='0' align='center' cellpadding='0' cellspacing='3' class='table'>
<tr>
  <td width='91' valign='top'><span class='menu_passif'><img src=\"http://www.spad-nord.fr/images/logo.jpg\" alt='Spad' width='149' height='95'/></span></td>
  <td colspan='2'><strong class='pubrouge'>S<span class='pubnoire'>&eacute;curit&eacute;&nbsp;</span>P<span class='pubnoire'>r&eacute;vention&nbsp; des&nbsp;</span>A<span class='pubnoire'>ccidents&nbsp;</span>D<span class='pubnoire'>omestiques</span>&nbsp;</strong></td>
  <td align='right'>
    <table width='300' border='0' align='center' cellpadding='0' cellspacing='0'>
      <tr>
        <td width='59' height='56' background=\"http://www.spad-nord.fr/images/tab_presentation/bout_gauche.jpg\">&nbsp;</td>
        <td background=\"http://www.spad-nord.fr/images/tab_presentation/fond.jpg\" align='center'><a class='pubnoire'>www.spad-nord.fr <br> </a><a class='pubrouge'>contact</a></td>
        <td width='36' height='56' background=\"http://www.spad-nord.fr/images/tab_presentation/bout_droit.jpg\">&nbsp;</td>
      </tr>
    </table>
</td>
</tr>
<tr>
  <td colspan='4'align='center'>
    <p ><span class='pubnoire'>$civilite&nbsp;</span><span class='pubrouge'>$nom</span><span class='pubnoire'> nous a contacté </span></p><br><span class='pubnoire'>le </span><span class='pubrouge'>$date</span><span class='pubnoire'> à </span><span class='pubrouge'>$heure</span>
    </td>
  </tr>
<tr>
  <td colspan='4' valign='middle' class='menu_passif'><hr size='1'></td>
</tr>
<tr>
  <td colspan='4' valign='middle'><p class='menu_passif' align='center'><span class='texte_fin'>L'ip enregistr&eacute; pour ce contact est : </span><span class='texte_bold'>$ip</span></p></td>
</tr>
<tr>
  <td colspan='4' valign='middle'><p class='menu_passif'><hr size='1'></p></td>
  </tr>
<tr>
  <td valign='middle' class='menu_passif'><p align='right'></p></td>
  <td colspan='3' valign='middle'>&nbsp;</td>
</tr>
<tr>
  <td valign='middle'><p class='menu_passif' align='right'>Civilit&eacute;<span class='menu_actif'>*</span> : </p></td>
  <td colspan='3' valign='middle' class='menu_passif'>$civilite</td>
</tr>
<tr>
  <td valign='middle'><p class='menu_passif' align='right'>Nom<a class='menu_actif'>*</a> : </p></td>
  <td width='194' valign='middle'><p class='menu_actif'>$nom</p></td>
  <td width='213' valign='middle'><p class='menu_passif' align='right'>Pr&eacute;nom<a class='menu_actif'>*</a> : </p></td>
  <td width='284' valign='middle'><span class='menu_actif'>$prenom</p></td>
</tr>
<tr>
  <td valign='middle'><p class='menu_passif' align='right'>Courriel<a class='menu_actif'>*</a> : </p></td>
  <td valign='middle'><p class='menu_actif'>$email</p></td>
 &nbs