problema:mail con allegato a piu utenti da db

new_fantasy

Nuovo Utente
24 Feb 2010
7
0
0
Salve sto realizzando una pagina di contatto con invio allegato a n utenti presenti nel mio db,
il problema che con il codice vi riporto se ce un solo utente caricato sul db il msg viene recapito se esistono anche solo 2 utenti non viene restituito errore come da codice....
consigli????


<?php
$dbcnx = @mysql_connect ('localhost' , 'user' , 'pass');
if (!$dbcnx)
{ exit ('<p> Non e possibile connettersi alla base dati </p>');
}

if (!@mysql_select_db('database')) {
exit ('<p>Non trovato il database</p>');
}
// Recupero il valore dei campi del form
$listadestinatari = array(); $destinatario = '';
$query = mysql_query("SELECT email from utenti ");
while ($row = mysql_fetch_array($query)) {
$listadestinatari[] = $row['email'];
}
$destinatario .= implode(';', $listadestinatari);
$mittente = $_POST['mittente'];
$oggetto = $_POST['oggetto'];
$messaggio = $_POST['messaggio'];

// Valorizzo le variabili relative all'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];

// Creo 2 variabili che riempirò più avanti...
$headers = "From: " . $mittente;
$msg = "";

// Verifico se il file è stato caricato correttamente via HTTP
// In caso affermativo proseguo nel lavoro...
if (is_uploaded_file($allegato))
{
// Apro e leggo il file allegato
$file = fopen($allegato,'rb');
$data = fread($file, filesize($allegato));
fclose($file);

// Adatto il file al formato MIME base64 usando base64_encode
$data = chunk_split(base64_encode($data));

// Genero il "separatore"
// Serve per dividere, appunto, le varie parti del messaggio.
// Nel nostro caso separerà la parte testuale dall'allegato
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

// Aggiungo le intestazioni necessarie per l'allegato
$headers .= "\nMIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed;\n";
$headers .= " boundary=\"{$mime_boundary}\"";

// Definisco il tipo di messaggio (MIME/multi-part)
$msg .= "This is a multi-part message in MIME format.\n\n";

// Metto il separatore
$msg .= "--{$mime_boundary}\n";

// Questa è la parte "testuale" del messaggio
$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$msg .= "Content-Transfer-Encoding: 7bit\n\n";
$msg .= $messaggio . "\n\n";

// Metto il separatore
$msg .= "--{$mime_boundary}\n";

// Aggiungo l'allegato al messaggio
$msg .= "Content-Disposition: attachment;\n";
$msg .= " filename=\"{$allegato_name}\"\n";
$msg .= "Content-Transfer-Encoding: base64\n\n";
$msg .= $data . "\n\n";

// chiudo con il separatore
$msg .= "--{$mime_boundary}--\n";
}
else
{
$msg = $messaggio;
}

// Invio la mail
if (mail($destinatario, $oggetto, $msg, $headers))
{
echo "<p>Mail inviata con successo!</p>";
}else{
echo "<p>Errore!</p>";
}
?>
 
anche l'invio dovrebbe stare dentro un ciclo se vuoi inviare il messaggio a più utenti
 
Eliox, lui praticamente faceva un implode() dei destinatari in modo da avere una cosa del tipo: [email protected]; [email protected]; [email protected]. Prova correggendo così:
PHP:
<?php
$dbcnx = @mysql_connect('localhost' , 'user' , 'pass') or die('<p>Non è possibile connettersi alla base dati.</p>');
@mysql_select_db('database', $dbcnx) or die('<p>Non ho trovato il database.</p>');

// Recupero il valore dei campi del form
$listadestinatari = array();
$query = mysql_query("SELECT email from utenti ");
while ($row = mysql_fetch_array($query))
	$listadestinatari[] = $row['email'];

// Recupero i dati dal form
$mittente  = isset($_POST['mittente'])  ? trim($_POST['mittente'])  : '';
$oggetto   = isset($_POST['oggetto'])   ? trim($_POST['oggetto'])   : '';
$messaggio = isset($_POST['messaggio']) ? trim($_POST['messaggio']) : '';

// Valorizzo le variabili relative all'allegato
$allegato      = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];

// Creo due variabili che riempirò più avanti...
$headers = "From: {$mittente}";
$msg = '';

// Verifico che il file sia stato caricato correttamente via HTTP
if(is_uploaded_file($allegato))
{
	// Apro e leggo il file allegato
	$data = file_get_contents($allegato);
	
	// Adatto il file al formato MIME base64 usando base64_encode
	$data = chunk_split(base64_encode($data));
	
	// Genero il "separatore"
	$semi_rand = md5(time());
	$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
	
	// Aggiungo le intestazioni necessarie per l'allegato
	$headers .= "\nMIME-Version: 1.0\n";
	$headers .= "Content-Type: multipart/mixed;\n";
	$headers .= " boundary=\"{$mime_boundary}\"";

	// Definisco il tipo di messaggio (MIME/multi-part)
	$msg .= "This is a multi-part message in MIME format.\n\n";

	// Metto il separatore
	$msg .= "--{$mime_boundary}\n";

	// Questa è la parte "testuale" del messaggio
	$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
	$msg .= "Content-Transfer-Encoding: 7bit\n\n";
	$msg .= "{$messaggio}\n\n";
	
	// Metto il separatore
	$msg .= "--{$mime_boundary}\n";

	// Aggiungo l'allegato al messaggio
	$msg .= "Content-Disposition: attachment;\n";
	$msg .= " filename=\"{$allegato_name}\"\n";
	$msg .= "Content-Transfer-Encoding: base64\n\n";
	$msg .= "{data}\n\n";
	
	// Chiudo con il separatore
	$msg .= "--{$mime_boundary}--\n";

	// Ciclo tutti i destinatari
	foreach($listadestinatari as $destinatario)
	{
		// Invio la mail
		if (mail($destinatario, $oggetto, $msg, $headers))
			echo "<p>Mail inviata con successo a <b>{$destinatario}</b>!</p>";
		else
			echo "<p>Impossibile inviare la mail a <b>{$destinatario}</b>!</p>";
	}
}
// Altrimenti
else
{
	// Visualizzo un errore
	echo '<p>Impossibile caricare il file.</p>';
}
?>
Calcola però che, in questo modo, invierà tante e-mail quanti sono i destinatari.
 
ho provato il tuo nuovo script,allora ora dice che il msg e stato inviato come da codice ma la mail che arriva e solo una quella del primo utente..
che dite?? limite del server??
 
Che dipenda dalla funzione mail() ?

Potrebbe dipendere dalla funzione mail() del php.
Sotto certi sistemi non accetta l'invio multiplo (script originale).

In alcuni casi il blocco non viene fatto solo per invii multipli ma anche per invii troppo vicini nel tempo (secondo script).

Se il tuo sito ha tali restrizioni, non ti resta che usare la classe phpmailer, cosa che peraltro ti consiglio comunque...

Questa ti permette di bypassare il mail() ed il sendmail e dislogare direttamente col tuo server smtp e fargli fare quello che vuoi, anche invii massivi.
Non spaventarti: non è così difficile da domare.
 
ora provo a chiedere al mio mnt se nelle loro macchine sono presenti tali restrizioni...non conosco bene ma posso provare la funzione phpmailer e possibile comunque interfacciarla con la selezione degli utenti da db?
e l'invio allegati?
 
Phpmailer è una classe e non una funzione, ma può rimpiazzare la funzione mail() di php aggiungendo molte ulteriori funzionalità che a mail() mancano.

Devi procurarti i file class.phpmailer.php, class.smtp.php ed almeno un modulo delle lingue (localizzazione).
Poi nel tuo script php metti, all'inizio, un require("class.phpmailer.php");

Eventualmente aggiunstando il percorso.

Poi, sempre nel tuo php, sostituisci alla funzione mail() una chiamata alla classe, qualcosa come:

$mail = new phpmailer();
$mail->From = $mittente;
$mail->AddReplyTo($mittente);
$mail->AddAddress($un_destinatario, "");
$mail->IsHTML(true);
$mail->Body = $body;
$mail->Subject = $soggetto;
if(!$mail->Send()) {
//risposta positiva...
}else{
//risposta negativa...
};
unset($mail);

Chiaramente dovrai sostituire le variabili $mittente, $un_destinatario, $body ed $oggetto.
In particolare, dovresti fare un loop di
$mail->AddAddress($un_destinatario, "");
per ciascun destinatario.

Se hai ancora problemi di autenticazione potresti aggiungere alla chiamata anche i parametri:

$mail->Mailer = "smtp";
$mail->Host = $ip_del_server_smtp;
$mail->SMTPAuth = true;
$mail->Username = $user_del_server_smtp;
$mail->Password = $password_del_server_smtp;


Con questo sistema mando anche 100 email al colpo...

Inoltre se guardi i commenti di class.phpmailer.php scoprirai una miriade di altre cose che può fare con l'email.
 
dove recupero i file relativi alle classi?
per il recupero dell'allegato attraverso il form posso usare gia lo il mio script?
 
ho creato il nuovo script utilizzando la classe phpmailer,il problema e che ora invia 2 mail uguali per ogni indirizzo presente nel database...qui sotto riporto il codice

<?php
require_once('class.phpmailer.php');
// upload dell'allegato
if (!move_uploaded_file($_FILES['allegato']['tmp_name'],$_FILES['allegato']['name']))
{
echo"errore nel caricamento del file";
}
else{
//invio mail
$mail = new PHPMailer();

$mail->From =$_POST['mittente'];
$mail->Subject =$_POST['oggetto'];
$mail->AddAttachment($_FILES['allegato']['name']);

@MYSQL_CONNECT("localhost","root","pass");
@mysql_select_db("database");
$query="SELECT email FROM utenti";
$result=@MYSQL_QUERY($query);
while($row = mysql_fetch_array ($result)){
$mail->AddAddress($row["email"]);

$mail->IsHTML(true);
$mail->Body =$_POST['messaggio'];

if(!$mail->Send()){
echo "messaggio non inviato";
echo "errore:" . $mail->ErrorInfo;
}else {
echo "messaggio inviato a---->" . $row["email"] . "<br>";
}
}
$mail->ClearAddresses();
$mail->ClearAttachments();
}
?>
 
Loop while errato

Il ciclo while che aggiunge i destinatari
Codice:
while($row = mysql_fetch_array ($result)){
viene chiuso solo dopo l'invio dell'email
Codice:
if(!$mail->Send()){

In tal modo ad ogni ciclo viene aggiunto un nuovo destinatario
Codice:
$mail->AddAddress($row["email"]);
ed inviata l'emai a tutti quelli già aggiunti (1, poi 2, poi 3 etc).

Da cui il comportamento rilevato: 2 email al primo destinatario ed 1 al secondo, visto che il db evidentemente conteneva solo 2 indirizzi di prova...
 
ho visto un esempio che sta nella cartella exemple del phpmailer(test_db_smtp_basic.php) e non capisco in quanto il mio e uguale come struttura invii 2 mail ad account...
 

Discussioni simili