Script php: Inviare mail con PHPMailer con 2 allegati o oltre

   difficoltà:  script script script script script

Script simili
14/6/2007


Abbiamo visto come Inviare mail in formato html con allegato in php ma spesso mi viene chiesto come poter inviare 2 o più allegati. Nell'esempio precedente abbiamo visto come creare la nostra funzione di invio mail, in questo caso faremo uso di una semplice classe per l'invio delle mail in php: PHPMailer.

Questa classe in particolare ci permette di inviare mail con php in formato html, di inserire un testo alternativo per client che non visualizzano l'html (multipart/alternative), di aggiungere allegati (anche più di un allegato).

La classe è molto semplice da usare. Innanzitutto scarichiamo PHPMailer da questo link.

Dalla cartella preleviamo il file class.phpmailer.php che per ora sarà l'unico a servirci.

Per inviare la mail a questo punto basterà includere la classe e procedere con l'invio. Il codice completo sarà:

<?
require_once("class.phpmailer.php");

$mail = new PHPMailer();
$mail->From = "mittente@dominio.it";
$mail->FromName = "Nome Mittente";
$mail->AddAddress("destinatario@dominio.it");
$mail->IsHTML(true);
$mail->Subject = $oggetto;
$mail->Body = $bodyhtml;
$mail->AltBody = $bodytxt;
$mail->AddAttachment("public/filename_1.zip");
$mail->AddAttachment("public/filename_2.zip");
if(!$mail->Send()){
echo "Si è verificato un errore nell'invio della mail";
}else{
echo "Mail inviata con successo";
}
?>
Chiaramente $oggetto sarà l'oggetto della mail, $bodyhtml il testo della mail in formato html. Nel caso volessimo aggiungere il testo alternativo in formato testo aggiungeremo $mail->AltBody  =  $bodytxt; in cui $bodytxt è il testo della mail in formato testo.

Con AddAttachment allegheremo gli allegati, indicandone il percorso. Si possono aggiungere quanti allegati si desidera.

Social:


Donazione:
Se questo script ti è stato utile e ti ho fatto risparmiare tempo e denaro fai una
qualsiasi cifra è ben accetta! 1€, 3€, 5€ ,10€, 50€ ;-) fai te!

Permalink: Tag:
script   php   e-mail   allegato   invio   phpmailer  
Script Simili: Permalink: Link utili:
Tools:
Feed RSS    



Commenti


  Michele

15/6/2007 9:57:11

Proprio ieri l'ho provato per sviluppare un sistema di mailing list. Le mail in html arrivano bene ma gli allegati no.

Ecco il codice che ho scritto:


$mail->AddAttachment("/usr/local/apache2/htdocs/dipto/upload/doc/Bazzocchi_Kirchberg%202005.pdf"); // attachment
$mail->AddAttachment("/usr/local/apache2/htdocs/dipto/upload/doc/Bazzocchi_Kirchberg%202005.pdf", "new.jpg");

Il path dei file è corretto, l'ho appena verificato.



  Fabio

15/6/2007 10:10:09

Hai provato a inviare allegati con nome scritto senza caratteri particolari? Tipo lo spazio che vedo che c'è codificato? Giusto per fare una prova..
Invece nel secondo file, mandi l'allegato in pdf...ma lo rinomini in new.jpg.. quindi è normale che non si veda.

Altra prova da fare. Invece che inviare subito la newletter a più utenti prova a inviare la mail solo a un indirizzo. Infatti sugli esempi di PHPMailer alla fine di ogni invio c'è:


$mail->ClearAddresses();
$mail->ClearAttachments();

però se l'allegato lo inserisci fuori dal ciclo di invio dovrebbe bastare solo la prima voce, perchè se no ad ogni ciclo aggungi un utente.

  Vincenzo

18/6/2007 9:24:23

Ciao a tutti!

Ho provato a fare delle modifiche al codice php per l'invio di più allegati. Vi scrivo il codice:


<?
$destinatario = $_POST['destinatario'];
$nominativo = $_POST['nominativo'];
$mittente = $_POST['mittente'];
$indirizzo = $_POST['indirizzo'];
$telefono = $_POST['telefono'];
$oggetto = $_POST['oggetto'];
$messaggio = $_POST['messaggio'];
$allegato1 = $_FILE['allegato1'];
$allegato2 = $_FILE['allegato2'];

require_once("class.phpmailer.php");
$mail = new PHPMailer();
$mail->From = $mittente;
$mail->FromName = $nominativo;
$mail->AddAddress($destinatario);
$mail->IsHTML(true);
$mail->Subject = $oggetto;
$mail->Body = $nominativo, $indirizzo, $telefono, $messaggio, ;
$mail->AltBody = $bodytxt;
$mail->AddAttachment($allegato1);
$mail->AddAttachment($allegato2);
if(!$mail->Send()){
echo "Si è verificato un errore nell'invio della mail";
}else{
echo "Mail inviata con successo";
}
?>


I miei problemi sono i seguenti...

1- Su yahoo la mail non arriva (probabilmente perchè la individua come spam);
2- Su una mail della TOL arriva ma senza allegati;
3- Non riesco a far indicare nel testo della mail i dati "nominativo" - "indirizzo" - "telefono".

Potete darmi una mano?
Premetto che a livello di PHP sono un novellino! XD

  Fabio

18/6/2007 9:36:32

per i dati "nominativo" - "indirizzo" - "telefono" devi scrivere cosi:


$mail->Body = $nominativo."<br>".$indirizzo."<br>".$telefono."<br>".$messaggio;

mentre per gli allegati, innanzitutto conrolla che mel form di invio ci sia l'enctype:

<form enctype="multipart/form-data" method="post">


Inoltre ti conviene preso il file salvarlo in una cartella temporanea e poi in

$mail->AddAttachment

inserire il percorso del file che poi potai cancellare dopo l'invio.

  Vincenzo

18/6/2007 9:52:05

Innanzitutto ti ringrazio per la disponibilità e per la rapida risposta!

Il problema dell'inserimento dei dati aggiuntivi ora funziona!

Nel form di invio ho indicato questo enctype:


<form action="formmail.php" method="post" enctype="multipart/form-data">


Per salvare i file allegati in una directory temporanea come posso fare?

  Fabio

18/6/2007 9:58:11

Per vedere come fare l'upload vedi qua:

Upload file con filtro estensione e dimensione massima

Dall'esempio vedi come copiare il file sul server.

  Vincenzo

18/6/2007 10:35:41

Preferirei evitare di eseguire l'upload dei files...Sia per mia difficoltà nel verificare la correttezza delle istruzioni sia per sicurezza del server su cui si eseguirebbe l'upload!

Un altro metodo non c'è?

  Fabio

18/6/2007 11:22:20

Beh il file lo carichi comunue sul server quando lo invii tramite form, solo che non lo copi da nessuna parte e lo tiene in una sua cartella per i file temporanei con nome 'codificato'.
La soluzione migliore è caricare i file in una cartella da te creata e poi una volta effettuato l'invio eliminare il file.

  stefano

18/6/2007 13:51:01

io l'ho provato ma mi da questo messaggio di errore.

Parse error: syntax error, unexpected T_VARIABLE in /web/htdocs/www.plzalliance.com/home/.../isend/send.php on line 10.

Cosa posso fare?

  Fabio

18/6/2007 14:16:47

Cosa c'è nella riga 10?

  Vincenzo

18/6/2007 15:07:47

Il problema è che non sarei io il mittente delle mail ma i clienti dell'azienda per cui sto creando il sito internet.

Ce li avrebbero lo stesso i permessi per copiare i file in una cartella temporanea? Se si, come posso integrare il codice dell'upload dei files con il codice per l'invio delle mail con allegati?

  stefano

19/6/2007 18:35:27

@Fabio, nella riga 10: $mail->Body = $_GET['testo'];
anche se cambio la variabile con una costante non cambia nulla, il problema resta lo stesso!

Grazie.

  Fabio

19/6/2007 20:21:12

Vincenzo..se non mi scrivi la riga che ti da errore nn riesco a venirti in contro. Mi posti la riga 9 e la riga 10?

  Antonio

18/8/2007 11:27:01

help!!! ho rpvato a cercare in rete uno script che ni aiutassi a creare un form con molti allegati circa 10, ho trovato questo ma non riesco a capire come fare, premetto che conosco poco di php...
Spero che qualcuno mi aiuti a capire!!!

  LudinoX

21/10/2007 19:29:42

Scusate ma non c'ho capito una mazza, a me mi dici email inviata... .. ?!?!

  mario

12/5/2008 2:07:01

non si capisce niente dalla spiegazione, per favore spiegate che si deve fare con i 2 files da modificare, qui pè illustrato una modifica che non c'entra nulla

  cambiate redattore

12/5/2008 2:12:12

cambiare redattore, questo che ha scritto questo articolo non fa capire nulla, davvero pessimo

  fabio

12/5/2008 8:00:45

@mario:
qual'è il tuo livello di conoscenza di php?
se è zero o quasi penso sia normale tu non abbia capito nulla..
ma del resto non si puó per ogni articolo partire da zero. Per capire gli articoli di php e asp bisogna conoscere php e asp, per js e ajax bisogna averne delle basi + o - solide a seconda dell'articolo.
per chi conosce php questo script risulterà banale in quanto il programmatore poco o niente dovrà fare in quanto fa tutto la classe inclusa.
se hai dubbi in particolare chiedi..

  verdelite

5/3/2009 15:46:57

Fabio sto utilizzando phpmailer per l'invio di un allegato con estensione .doc. Il testo della mail arriva correttamente, ma come allegato arriva un file strano phpQsxx.dat. Quale può essere il motivo secondo te?

  Fabio

5/3/2009 15:56:02

Usi Outlook?
cerca nelle impostazioni e disabilita il controllo sugli allegati

  verdelite

5/3/2009 16:26:21

Sì uso outlook. Ho provato quello che dici tu però mi arriva sempre lo stesso allegato. Vabbè nessun problema, utilizzo move_uploaded_file(..) per l'upload dell'allegato in una cartella temporanea poi unlink(..) per rimuoverlo dopo l'invio della mail.

  Fabio

5/3/2009 16:46:51

beh è cosi che devi fare non inviare il file temporaneo.

  celesh

10/4/2009 19:46:53

Ciao a tutti, ho provato ad inviare una mail con due allegati, ma su gmail non arriva nulla, su libero mi arriva la mail con un solo allegato! :(
Qualcuno mi sa aiutare?
Grazie!

  Simone

7/5/2009 18:46:02

Dove si deve scrivere tutto
io o provato sull blocco note e lo salvo .php ma poi qnd lo apro internet mi dici che lo devo scaricare
BHO ?!?!?!?!

  Salvatore

8/6/2009 2:06:54

Simone non è HTML che si apre semplicemente tramite il browser così....devi avere apache e php installato sul pc ( se fai i test locali ) poi metti la pagina con estensione php nella directory web (ESEMPIO: c:\www\ ) e poi quando apri il tuo browser fai 127.0.0.1/pagina.php e ti carica la pagina php che hai nella dir .... Io avrei un problema con la classe, l'email in HTML se inviata a indirizzo Gmail viene messa in spam, come posso risolvere il problema??...ho metto accesso smtp del mio server e il resto ma non so come risolvere

  Fabio

8/6/2009 9:12:50

@Salvatore:
il problema puo' essere che il server è in qualche lista spam. O il contenuto è visto come spam. Se pero' non è questo puoi provare a risolvere inviando la mail autenticando la mail da cui invii e inviandola tramite l'smtp del server.
Per intenderci il tuo dominio avrà una mail del tipo mail@host.it che invia tramite smtp del tipo smtp.host.it(controlla qual'è effettivamente). Bisogna inviare tramite quella mail dal server. In questo modo la mail risulterà inviata da quella mail da un host esistente:


$mail->IsSMTP(); // invia la mail tramite smt
$mail->Host = "smtp.host.it"; // setto l'smtp tramite cui inviare (quello della mail che usi)
$mail->SMTPAuth = true; // usa una mail esistente e invia tramite autenticazione
$mail->Username = "mail@host.it"; // username(di solito la mail)
$mail->Password = "password"; // password della mail


  Sara

2/7/2009 15:52:49

salve a tutti io sto cercando un form da mettere sun un sito che mi invii delle email ad un indirizzo di posta senza usare client di posta sul pc e senza gestione e invio degli ALLEGATI (un qualcosa di molto simile all'inserimento di questa richiesta nel forum con la differenza che invece di mandarlo in coda alla pagina lo si manda per email) solo l' invio di alcuni campi che posso modificare a seconda della pagina richiesta

ES.
pagina 1 :

nome
email (del mittente)
testo

pagina 2:

nome
tel
email (del mittente)
testo

pagina 3:

nome
tel
email (del mittente)
titolo (da mettere di default)
testo

quindi bene o male solo l'aggiunta o l'eliminazione di campi
di php non so nulla ma di programmazione ci capisco un po quindi non cadrò dalle nuvole

ho letto in giro che mi serve un invio di email dal lato server e quindi serve esclusivamente il php

ho scaricato il file: class.phpmailer.php
e il codice non so bene dove metterlo credo su una pagina html ma credo che mi manca ancora qualcosa

spero che mi possiate aiutare
grazie

  stefano

10/7/2009 20:46:33

Per poter inviare più di un allegato con la classe di PHPmailer si devono apportare modifiche alla classe stessa.
Io ho modificato cosi

if (in_array($attachment[0], $incl)) { continue; }
$filename = $attachment[1];
$name = $attachment[2];
$encoding = $attachment[3];
$type = $attachment[4];
$disposition = $attachment[6];
$cid = $attachment[7];
$incl[] = $attachment[0];
if ( isset($cidUniq[$cid]) ) { continue; }
//$cidUniq[$cid] = true;

linea 1297 -1306
come si vede ho commentato la riga $cidUniq[$cid] = true;

  Daniele

21/4/2010 12:44:26

Mi da come errore che non posso istanziare la funzione mail..

come mai??

  daniele

30/3/2011 23:46:19

Ciao,
riesco ad inviare la mail, ma nell'oggetto visualizzo i caratteri accentati non codificati (tipo: è=è ò=ò etc.). Da cosa può dipendere?
Grazie

  sabatini

1/4/2016 15:34:09

Mah, a me questo script non funziona, le email non arrivano e neanche nello spam ci sono



Lascia un commento


Codice di controllo*:
Nome*:
Email/Link:
Testo*:
 
I campi contrassegnati con * sono obbligatori.