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 ([email protected]_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>";
}
?>
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
anche l'invio dovrebbe stare dentro un ciclo se vuoi inviare il messaggio a più utenti
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
24
Roma
alessandro1997.netsons.org
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.
 

new_fantasy

Nuovo Utente
24 Feb 2010
7
0
0
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??
 

softhare

Utente Attivo
11 Feb 2010
57
0
0
Friuli
www.softhare.it
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.
 

new_fantasy

Nuovo Utente
24 Feb 2010
7
0
0
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?
 

softhare

Utente Attivo
11 Feb 2010
57
0
0
Friuli
www.softhare.it
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.
 

new_fantasy

Nuovo Utente
24 Feb 2010
7
0
0
dove recupero i file relativi alle classi?
per il recupero dell'allegato attraverso il form posso usare gia lo il mio script?
 

new_fantasy

Nuovo Utente
24 Feb 2010
7
0
0
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";
[email protected]_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();
}
?>
 

softhare

Utente Attivo
11 Feb 2010
57
0
0
Friuli
www.softhare.it
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...
 

new_fantasy

Nuovo Utente
24 Feb 2010
7
0
0
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
Autore Titolo Forum Risposte Data
Marti1! Problema con casella mail cancellata Posta Elettronica 3
A [PHP] Problema invio mail con funzione mail() PHP 3
filomeni Problema con mail() in html PHP 4
S Problema con Mail PHP 3
V problema con mail e php PHP 6
L problema email con funzione mail PHP 1
F Problema con mail in SPAM Hosting 2
C problema invio mail con form php PHP 0
A Problema con mail() PHP 2
C AJAX FORM MAIL - problema con gli a capo nel messaggio Javascript 0
L Problema invio allegati via mail con libero PHP 5
P Problema con la funzione mail PHP 13
V Problema con l'invio delle mail in locale (usando quindi easy php) PHP 16
Angel0 Problema invio e-mail (era: problemi con xoom) Posta Elettronica 4
D Problema con allegato tramite form mail PHP 2
B Problema invio mail con script php verso i dominii libero PHP 9
H problema con mail e i relativi browser... PHP 0
G problema con mail() PHP 2
R Form Mail: Problema con Frame Supporto Mr.Webmaster 4
M problema con form mail Flash 2
A problema con mail PHP 0
djfulmine Problema con PHP e Server Mail PHP 1
A problema con invio e-mail con CDONTS Classic ASP 0
V problema con invio mail Hosting 2
L problema mail con asp Classic ASP 15
Daniele_Carrara Problema timeout - invio mail PHP 7
L Problema funzione mail() PHP PHP 3
A problema mail Posta Elettronica 5
Punix [PHP] problema script invio e-mail PHP 2
cobra_72 [PHP] problema invio multiplo allegati mail PHP 21
A problema funzione mail() PHP 33
Il Matta Problema Form e invio mail PHP 2
B Problema form mail per invio doppio allegato PHP 1
A Problema orario invio mail per form PHP 4
S Problema istruzione mail() PHP 11
O [PHP] Problema Invio Mail PHP 2
P problema mittente e-mail Posta Elettronica 0
A IPad Air problema ricezione mail Smartphone e tablet 0
A Problema e-mail da un dominio Posta Elettronica 7
A problema invio mail PHP 5
annisdesigner problema attivazione mail PHP 1
G Problema [function mail] Aruba Hosting 0
F Problema form mail PHP 13
S Problema form mail matt's script archive PHP 3
Z problema pagina mail.php PHP 10
D Problema invio mail [GIA POSTATO ERRONEAMENTE IN HTML] PHP 0
D Problema invio mail PHP 6
LaKanka Problema invio e-mail, prima riga vuota PHP 0
C Mail e php problema invio PHP 11
C Problema Form Ivio Mail PHP 4

Discussioni simili