Php mail_class [Résolu]

Messages postés
17
Date d'inscription
mercredi 27 février 2008
Dernière intervention
20 août 2014
- 14 août 2014 à 16:59 - Dernière réponse :
Messages postés
17
Date d'inscription
mercredi 27 février 2008
Dernière intervention
20 août 2014
- 20 août 2014 à 10:51
Salut à tous
J'ai mis en place un script php en utlisant la class http://codes-sources.commentcamarche.net/source/50607-formulaire-email-avec-piece-jointe-repris-de-littlebubu
Sans problème à exception d'un string BCC issue d'une requête MySQL... erreur Class Mail, method Mail : invalid address
J'ai retourné le problème dans tous les sens, pas moyen de trouver le format adéquate

Voici le code qui m'anime :-)

$sql = mysql_query(" SELECT 'email' FROM '$table27' WHERE ADDTIME('dat_sent', '00:00:30') < NOW() AND 'comm' LIKE '%C%' ORDER BY 'email' ASC") or die ("") ;
while( $data = mysql_fetch_array($sql) )
{$bcc .= $data['email'].", \r\n";
}
require_once "mail_class.php" ;
Merci pour votre aide
Afficher la suite 

Votre réponse

11 réponses

Messages postés
23284
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 15 août 2014 à 11:08
0
Merci
Bonjour,

Déjà... (vu que tu ne m'as pas répondu précédement...) quelles sont les extensions utilisées dans tes adresses mail ?
Car... dans le fichier : formmail.php

Le message d'erreur que tu obtiens vient de la fonction :
function CheckAdresses( $aad )
{
        for($i=0;$i< sizeof( $aad); $i++ ) {
                if( ! $this->ValidEmail( $aad[$i]) ) {
                        echo "Class Mail, method Mail : invalid address $aad[$i]";
                        exit;
                }
        }
}


Qui utilise La fonction :
function ValidEmail($address)
{
        if( ereg( ".*<(.+)>", $address, $regs ) ) {
                $address = $regs[1];
        }
         if(ereg( "^[^@  ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$",$address) )
                 return true;
         else
                 return false;
}


Qui ... comme tu peux le voir... as comme extension possibles les suivantes :
|net|com|gov|mil|org|edu|int
Si ton extension contient 3 caractères ou plus.. il te faudra l'ajouter à cette liste
|net|com|gov|mil|org|edu|int 


Ensuite.. vu ton message d'erreur... il se peut simplement que ta requête ne te retourne pas le résultat attendu...
As tu mis des ECHO / PRINT .. sur tes variables pour voir ce qu'"elles valent ??
As tu essayé ta requête en directe pour voir si elle fonctionne ?
...et... n'aurais tu pas une virgule en trop dans ta variable $bcc (à la fin) ?



Messages postés
17
Date d'inscription
mercredi 27 février 2008
Dernière intervention
20 août 2014
- 15 août 2014 à 15:35
Re
J'ai augmenté la liste des extensions et dans un premier temps j'ai travaillé avec 2 adresses gmail et un string
bcc = "xxx@gmail.com, ccc@gmail.com" ;
J'ai mis des PRINT et des ECHO mais ça ne fonctionne pas
J'en perds mon PHP :-)
Merci
Commenter la réponse de jordane45
Messages postés
23284
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 15 août 2014 à 20:26
0
Merci
Il faudrait peut être que tu penses à nous montrer le code que tu as essayé pour qu'on puisse éventuellement t'aider......
Messages postés
23284
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 16 août 2014 à 16:16
Pour ce qui est des ECHO/ PRINT... où les as tu mis ?

A mon avis commence par ceci :

$sql = mysql_query(" SELECT 'email' FROM '$table27' WHERE ADDTIME('dat_sent', '00:00:30') < NOW() AND 'comm' LIKE '%C%' ORDER BY 'email' ASC") or die ("") ;
while( $data = mysql_fetch_array($sql) )
{
   $bcc .= $data['email'].", \r\n";
}

echo "<br> BCC = <br".$bcc."<br>";
require_once "mail_class.php" ;



je pense que ce code... t'ajoute une virgule en trop à la fin !

éventuellement... essaye plutôt ainsi :

//-----------------------------------------------------------
// Je sépare la requête de l'instruction QUERY... ça permet d'en faire un ECHO si besoin
//et  Je fais des retour à la ligne pour la requête afin qu'elle soit plus lisible !
//-----------------------------------------------------------
$sql=" SELECT 'email' 
           FROM '$table27' 
           WHERE ADDTIME('dat_sent', '00:00:30') < NOW() 
           AND 'comm' LIKE '%C%' ORDER BY 'email' ASC"

//echo $sql;
//-----------------------------------------------------------
$query = mysql_query($sql) or die ("Erreur dans la requête <br>".$sql) ;

$arrBCC = array();
while( $data = mysql_fetch_array($query) ){
  $arrBCC[] =  $data['email'];
}
$bcc = join(",",$arrBCC);
echo "<br> BCC = <br".$bcc."<br>";


Messages postés
17
Date d'inscription
mercredi 27 février 2008
Dernière intervention
20 août 2014
- 16 août 2014 à 20:26
Merci pour toutes ces pistes de sioux
Je suis en weekend, je tente ça à dès mon retour
Bon weekend
Commenter la réponse de jordane45
Messages postés
17
Date d'inscription
mercredi 27 février 2008
Dernière intervention
20 août 2014
- 17 août 2014 à 22:26
0
Merci
Bonsoir

Je viens de passer un certain temps à jongler dans tous les sens et il y a effectivement une erreur dans ma requête sql (contrôlée correcte sous phpMyAdmin) : Warning: mysql_query() expects parameter 1 to be string, resource given in /home/clients/cineferte.fr/http/mail_asso.php on line 228
Erreur dans la requête Resource id #6
C'est bien la première fois que je tombe sur cet os et je ne vois pas comment le solutionner car je n'en comprends pas le sens !

De plus en donnant une valeur en dur à $bcc, seul le mail au destinataire principal arrive mais pas au BCC
Par contre un destinataire CC reçoit le mail !!!!!!

donc voici mon code et encore merci pour tout ce temps passé
<?php	require_once "./connex_cine.php" ;
//require_once "../log_check.php" ;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-15" />
</head>
<body>
<? if ( $_POST["go_mail"] )
{ $reponse=StripSlashes("Votre Message a été envoyé avec succé <a href=".""../index.php"."">index</a>");
class Mail
{ var $sendto= array();
var $from, $msubject;
var $acc= array();
var $abcc= array();
var $aattach= array();
var $priorities= array( '1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)' );
// Mail contructor
function Mail()
{ $this->autoCheck( true );
}
/* autoCheck( $boolean )
* activate or desactivate the email addresses validator
* ex: autoCheck( true ) turn the validator on
* by default autoCheck feature is on
*/
function autoCheck( $bool )
{ if( $bool )
$this->checkAddress = true;
else
$this->checkAddress = false;
}
/* Subject( $subject )
* define the subject line of the email
* $subject: any valid mono-line string
*/
function Subject( $subject )
{ $this->msubject = strtr( $subject, "\r\n" , "Envoi de cv de depuis le site " );
}
/* From( $from )
* set the sender of the mail
* $from should be an email address */
function From( $from )
{ if( ! is_string($from) ) {
echo "Class Mail: error, From is not a string";
exit;
}
$this->from= $from;
}
/* To( $to )
* set the To ( recipient )
* $to : email address, accept both a single address or an array of addresses */
function To( $to )
{ // TODO : test validité sur to
if( is_array( $to ) )
$this->sendto= $to;
else
$this->sendto[] = $to;
if( $this->checkAddress == true )
$this->CheckAdresses( $this->sendto );
}
/* Cc()
* set the CC headers ( carbon copy )
* $cc : email address(es), accept both array and string */
function Cc( $cc )
{ if( is_array($cc) )
$this->acc= $cc;
else
$this->acc[]= $cc;
if( $this->checkAddress == true )
$this->CheckAdresses( $this->acc );
}
/* Bcc()
* set the Bcc headers ( blank carbon copy ).
* $bcc : email address(es), accept both array and string */
function Bcc( $bcc )
{ if( is_array($bcc) ) {
$this->abcc = $bcc;
} else {
$this->abcc[]= $bcc;
}
if( $this->checkAddress == true )
$this->CheckAdresses( $this->abcc );
}
/* Body()
* set the body of the mail ( message ) */
function Body( $body )
{ $this->body= $body;
}
/* Send()
* fornat and send the mail */
function Send()
{ // build the headers
$this->_build_headers();
// include attached files
if( sizeof( $this->aattach > 0 ) ) {
$this->_build_attachement();
$body = $this->fullBody . $this->attachment;
}
// envoie du mail aux destinataires principal
for( $i=0; $i< sizeof($this->sendto); $i++ ) {
$res = mail($this->sendto[$i], $this->msubject,$body, $this->headers);
// TODO : trmt res
}
}
/* Organization( $org )
* set the Organisation header */
function Organization( $org )
{ if( trim( $org != "" ) )
$this->organization= $org;
}
/* Priority( $priority )
* set the mail priority
* $priority : integer taken between 1 (highest) and 5 ( lowest )
* ex: $m->Priority(1) ; => Highest */
function Priority( $priority )
{ if( ! intval( $priority ) )
return false;
if( ! isset( $this->priorities[$priority-1]) )
return false;
$this->priority= $this->priorities[$priority-1];
return true;
}
/* Attach( $filename, $filetype )
* attach a file to the mail
* $filename : path of the file to attach
* $filetype : MIME-type of the file. default to 'application/x-unknown-content-type'
* $disposition : instruct the Mailclient to display the file if possible ("inline") or always as a link ("attachment")
* possible values are "inline", "attachment" */
function Attach( $filename, $filetype='application/x-unknown-content-type', $disposition = "inline" )
{ // TODO : si filetype="", alors chercher dans un tablo de MT connus / extension du fichier
$this->aattach[] = $filename;
$this->actype[] = $filetype;
$this->adispo[] = $disposition;
}
/* Get()
* return the whole e-mail , headers + message
* can be used for displaying the message in plain text or logging it */
function Get()
{ $this->_build_headers();
if( sizeof( $this->aattach > 0 ) ) {
$this->_build_attachement();
$this->body= $this->body . $this->attachment;
}
$mail = $this->headers;
$mail .= "\n$this->body";
return $mail;
}
/* ValidEmail( $email )
* return true if email adress is ok - regex from Manuel Lemos (mlemos@acm.org)
* $address : email address to check */
function ValidEmail($address)
{ if( ereg( ".*<(.+)>", $address, $regs ) ) {
$address = $regs[1];
}
if(ereg( "^[^@ ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int|fr|uk)\$",$address) )
return true;
else return false;
}
/* CheckAdresses()
* check validity of email addresses
* if unvalid, output an error message and exit, this may be customized
* $aad : array of emails addresses */
function CheckAdresses( $aad )
{ for($i=0;$i< sizeof( $aad); $i++ ) {
if( ! $this->ValidEmail( $aad[$i]) ) {
echo "Class Mail, method Mail : invalid address $aad[$i]";
exit;
}
}
}
/********************** PRIVATE METHODS BELOW **********************************/
/* _build_headers()
* [INTERNAL] build the mail headers*/
function _build_headers()
{ // creation du header mail
$this->headers= "From: $this->from\n";
$this->to= implode( ", ", $this->sendto );
if( count($this->acc) > 0 ) {
$this->cc= implode( ", ", $this->acc );
$this->headers .= "CC: $this->cc\n";
}
if( count($this->abcc) > 0 ) {
$this->bcc= implode( ", ", $this->abcc );
$this->headers .= "BCC: $this->bcc\n";
}
if( $this->organization != "" )
$this->headers .= "Organization: $this->organization\n";
if( $this->priority != "" )
$this->headers .= "X-Priority: $this->priority\n";
}
/*
* _build_attachement()
* internal use only - check and encode attach file(s)*/
function _build_attachement()
{ $this->boundary= "------------" . md5( uniqid("myboundary") ); // TODO : variable bound
$this->headers .= "MIME-Version: 1.0\nContent-Type: multipart/mixed;\n boundary="$this->boundary"\n\n";
$this->fullBody = "This is a multi-part message in MIME format.\n--$this->boundary\nContent-Type: text/plain; charset=us-ascii\nContent-Transfer-Encoding: 7bit\n\n" . $this->body ."\n";
$sep= chr(13) . chr(10);
$ata= array();
$k=0;
// for each attached file, do...
for( $i=0; $i < sizeof( $this->aattach); $i++ ) {
$filename = $this->aattach[$i];
$basename = basename($filename);
$ctype = $this->actype[$i]; // content-type
$disposition = $this->adispo[$i];
if( ! file_exists( $filename) ) {
echo "Class Mail, method attach : file $filename can't be found"; exit;
}
$subhdr= "--$this->boundary\nContent-type: $ctype;\n name="$basename"\nContent-Transfer-Encoding: base64\nContent-Disposition: $disposition;\n filename="$basename"\n";
$ata[$k++] = $subhdr;
// non encoded line length
$linesz= filesize( $filename)+1;
$fp= fopen( $filename, 'r' );
$data= base64_encode(fread( $fp, $linesz));
fclose($fp);
$ata[$k++] = chunk_split( $data );
}
$this->attachment= implode($sep, $ata);
}
} // class Mail
if ( $_POST["dest"] == 111 )
{ $sql = mysql_query(" SELECT 'email' FROM 'mailing' WHERE 'email' LIKE '@cineferte.fr' ORDER BY 'email' ASC ");
$dest = "wm@cineferte.fr" ;
$query = mysql_query($sql) or die ("Erreur dans la requête <br>".$sql) ;
$arrBCC = array();
while( $data = mysql_fetch_array($query) ){
$arrBCC[] = $data['email'];
}
$bcc = join(",",$arrBCC);
echo "BCC = ".$bcc."";
}
elseif ( $_POST["dest"] == 110 )
{ $subject = "test destinataire unique" ;
$dest = "wm@cineferte.fr" ;
}
$subject="{$_POST['subject']}";
$msg="{$_POST['msg']}";
$email="wm@cineferte.fr";
$NomFichier="{$_FILES["NomFichier"]}";
$NomFichier_name="{$_FILES["NomFichier"]["name"]}";
$priority="{$_POST['priority']}";

$subject=StripSlashes($subject);
$msg=StripSlashes($msg);
$msg="Message depuis votre site web:
$msg";
$m= new Mail; // create the mail
$m->From( $email );
$m->To( $dest);
$m->Subject( $subject );
$m->Body( $msg); // set the body
if ($bcc!="") { $m->Bcc( $bcc); }
if ($cc!="") { $m->Cc( $cc); }
$m->Priority($priority) ;
if ($NomFichier_name!="") {
//copy($NomFichier,"../upload/".$NomFichier_name);
//chargement du fichier
$uploaddir = './temp/';
$uploadfile = $uploaddir . basename($NomFichier_name);
//copy($NomFichier,"../upload/".$NomFichier_name);
//
if (move_uploaded_file($_FILES['NomFichier']['tmp_name'], $uploadfile)) {
echo "Le fichier est valide, et a été téléchargé
avec succès. Voici plus d'informations :\n";
} else {
echo "Attaque potentielle par téléchargement de fichiers.
Voici plus d'informations :\n";
}
//
$m->Attach( "./temp/".$NomFichier_name, "application/octet-stream" );
}
$m->Send();
if ($NomFichier_name!="") {
Unlink("./temp/".$NomFichier_name); }
echo "$reponse";
}
?>
<form name="myform" vname="FormName" enctype="multipart/form-data" id="myform" action="mail_asso.php" method="post" onsubmit = "if(confirm('Merci de confirmez l\'envoie de ce message'))return true; else return false" />
<input name="go_mail" type="hidden" value="1">
<div style="font-size: 0.75em" >Sujet du message</div><span onmouseover="BulleWrite('Sujet du message.');" />
<input type="text" name="subject" placeholder="  Sujet du message" style="width:100%; border:solid 1px black; FONT-SIZE:0.7em; font-family:tahoma; background-color:lightsteelblue;" />
<textarea name="msg" id="f11" placeholder="  Votre message" rows="15" style="width:100%; FONT-SIZE:0.7em; border:solid 1px black; font-family:tahoma; background-color:lightsteelblue;" /></textarea>
<input type="hidden" name="MAX_FILE_SIZE" value="10000000"><input name="NomFichier" type="file" size="16">
<input name="dest" type="radio" value="110" />TEST destinataire unique </td>
<input name="dest" type="radio" value="111" checked="checked" />TEST destinatires multiples<br>
<input value="Submit" src="../icon/go.gif" valign="bottom" border="0" type="image">
</form></div>
</body>
</html>

Commenter la réponse de catem
Messages postés
23284
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 18 août 2014 à 00:48
0
Merci
tu as un message d'erreur :
Warning: mysql_query() expects parameter 1 to be string, resource given in /home/clients/cineferte.fr/http/mail_asso.php on line 228
Erreur dans la requête


... relativement clair ....

1 - Il t'indique que tu as une erreur à la ligne : 228 du fichier mail_asso.php ... donc... qu'as tu à cette ligne ?

2 - Il te dit qu'il y a une erreur dans ta requête... (que tu me dis avoir testé directement dans phpmyadmin...).... as tu fais un ECHO de ta requête puis.. collé celle-ci dans phpMyadmin ( cellle fournie par le echo... pas celle telle qu'écrite dans ton code) ??

PS: n'oublie pas que pour une meilleur lisibilité du code et pour faciliter le debogage.. il vaut mieux séparer la "requête" de l'instruction mysql_query() . (comme je te l'ai montré précédement).

... Commence déjà par regarder tout ça.. (et si tu coinces toujours de nous coller le resultat ici).

Commenter la réponse de jordane45
Messages postés
17
Date d'inscription
mercredi 27 février 2008
Dernière intervention
20 août 2014
- Modifié par jordane45 le 18/08/2014 à 09:51
0
Merci
Re

Donc la requête a bien été corrigée (par phpmyadmin) en tant que
$sql = 'SELECT 'email' 
FROM 'mailing' 
WHERE 'email' LIKE CONVERT(_utf8 \'%@cineferte.fr\' USING latin1) COLLATE latin1_general_ci ';

MERCI pour celle-la

Quant au résultat de la requête : toujours une erreur
Class Mail, method Mail : invalid address xxx@cineferte.fr, yyy@cineferte.fr, zzz@cineferte.fr


Ce qui m'étonne, c'est que ça fonctionne en CC en limitant à un seul résultat mais rien du tout en BCC

Re-merci pour les conseils et le temps passé
Hi fly
Messages postés
23284
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 18 août 2014 à 09:56
Si tu regarde le code ... il attend visiblement soit un STRING (mais UNE seule Adresse) .. soit un ARRAY ...
Donc... tu peux virer le JOIN et ne garder que le ARRAY à passer en paramêtres...
Commenter la réponse de catem
Messages postés
17
Date d'inscription
mercredi 27 février 2008
Dernière intervention
20 août 2014
- 18 août 2014 à 10:34
0
Merci
toujours le même...mais on s'en rapproche

Ça fonctionne très bien en CC uniquement
En BCC, le mail part au destinataire uniquement sans message d'erreur
Commenter la réponse de catem
Messages postés
17
Date d'inscription
mercredi 27 février 2008
Dernière intervention
20 août 2014
- 20 août 2014 à 10:51
0
Merci
Bonjour,

En fait ça fonctionne très bien avec
$query = mysql_query($sql) or die ("Erreur dans la requête <br>".$sql) ;
$bcc = array();
while( $data = mysql_fetch_array($query) )
{ $bcc[] = $data['email'];
}

Merci beaucoup pour l'aide apporté
Commenter la réponse de catem

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.