Pagina 1 di 26 1 2 3 11 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 255
  1. #1

    [PILLOLA] classe PHPMailer: mai più problemi nell'invio di email in PHP

    ATTENZIONE: Questa pillola fa riferimento alla versione 2.0 di PHPMailer che non é più quella attuale. Verificate nella documentazione eventuali differenze (ad esempio gli argomenti passati dai metodi, i nomi dei metodi e delle proprietà).

    Spesso mi capita di aiutare utenti di questo forum alle prese con problemi riguardo alla funzione mail. Per esperienza, il 90% di questi problemi si risolvono utilizzando la celebre classe PHPmailer. Questa classe ci permette di inviare email con grande semplicità ed eleganza non dovendoci curare, ad esempio, di quel campo minato che sono gli headers. Ho pensato di scrivere questa pillola in particolare per gli utenti meno esperti, ai quali viene consigliato sempre di utilizzare questa classe, ma che potrebbero farsi intimorire dalla sintassi “ad oggetti”. Ho quindi pensato di scrivere una piccola guida in modo semplice e didattico affinché sia possibile anche per il neofita utilizzare PHPmailer.

    - Procurarsi PHPmailer

    PHPmailer è un progetto gratuito e open source. Può essere scaricato dal sito ufficiale:
    http://phpmailer.codeworxtech.com/


    - Operazioni preliminari

    Per prima cosa dovremo includere la classe nel nostro script
    Codice PHP:
    include_once('percorso.../PHPMailer/class.phpmailer.php'); 

    - Istanziare la classe

    Chi non conosce la terminologia della programmazione ad oggetti non si spaventi per il parolone. Istanziare una classe significa semplicemente:
    Codice PHP:
    $mail = new PHPMailer(); 
    A questo punto $mail è l’istanza che ci permetterà di manipolare i numerosi metodi e proprietà della nostra classe (non spaventatevi, vedrete che è molto semplice).


    - L’ uso basilare

    Creeremo ora uno script che ci permetterà di inviare un semplice mail testuale. Ci serviranno le proprietà:
    From: L’indirizzo email del mittente
    FromName: Il nome del mittente
    Subject: Il soggetto dell’email
    $Body: Il corpo del messaggio


    Ed i metodi:
    AddAddress: Aggiunge un indirizzo di posta elettronica. Siccome la proprietà AddAddress è un array, possiamo usarla quante volte vogliamo così da aggiungere tutti i destinatari che ci servono.
    Send: E’ ovviamente il metodo che ci permette finalmente di inviare il messaggio. Restituisce un valore boleano che ci permetterà tramite la struttura if else di dare un’informazione circa l’invio del nostro email. Va detto che il fatto che venga restituito TRUE, non ci da nessuna garanzia che il destinatario riceva realmente l’email. Send restituisce TRUE se è stato processato e non ha generato nessun errore, il che non vuol dire ancora che sia stato inviato l’email.

    Codice PHP:
    include_once('percorso.../PHPMailer/class.phpmailer.php');

    $mail = new PHPMailer();

    $mail->From "email@tuosito.com";
    $mail->FromName "Nome Cognome";
    $mail->Subject "Il mio primo email con PHPmailer";
    $mail->Body "Testo del messaggio";

    $mail->AddAddress("nome1@sito.com");
    $mail->AddAddress("nome2@sito.com");

    if(
    $mail->Send()) 
    {
        echo 
    'mail inviato correttamente';

    else 
    {
        echo 
    'Errore: mail non inviato';

    AddAddress Può essere evidentemente anche utilizzato in un ciclo, tipicamente quando estraiamo una lista di email da un database

    Codice PHP:
    while ($row mysql_fetch_array($res))
    {
        
    $mail->AddAddress("$row[mail]");

    I metodi AddCC e AddBCC funzionano nello stesso modo e servono rispettivamente a definire la copia per conoscenza e la copia per conoscenza nascosta.

    Passiamo ora a cose più succose:

    - Il metodo MsgHTML:

    Se vogliamo inviare un email in formato html non abbiamo che da usare questo metodo in modo semplicissimo:

    Codice PHP:
    include_once('percorso.../PHPMailer/class.phpmailer.php');

    $mail = new PHPMailer();

    $mail->From "email@tuosito.com";
    $mail->FromName "Nome Cognome";
    $mail->Subject "Il mio primo email con PHPmailer";

    $html_body '<html>
    <body>
    Sono un messaggio [b]html[/b]
    </body>
    </html>
    '
    ;

    $mail->MsgHTML($html_body);

    $mail->AddAddress("nome1@sito.com");
    $mail->AddAddress("nome2@sito.com");

    if(
    $mail->Send()) 
    {
        echo 
    'mail inviato correttamente';

    else 
    {
        echo 
    'Errore: mail non inviato';

    Sarebbe buona cosa quando si invia un mail html, utilizzare il metodo AltBody con il quale si definisce il testo alternativo se il client di posta elettronica non è abilitato a ricevere messaggi html.

    Codice PHP:
    $mail->AltBody ("Per poter leggere correttamente questo messaggio è indispensabile che il tuo client di posta elettronica sia abilitato per l'html"); 
    Certo si potrebbe inserire lo stesso messaggio inviato in html ma in formato testuale.



    - Il metodo AddAttachment.

    Dimenticate le notti insonni provando ad inviare un allegato con la funzione mail. Con il metodo AddAttachement dobbiamo solo dire che file vogliamo allegare:

    Codice PHP:
    $email->AddAttachment('./percorso/nomefile'); 

    - Il metodo getFile.


    E’ possibile prelevare direttamente un file da inviare come body del messaggio utilizzando questo metodo.

    Codice PHP:
    $body $mail->getFile('file.html');
    $mail->MsgHTML($body); 
    In questo caso il contenuto html dell’email viene letto direttamente dal file.


    - La proprietà ErrorInfo.

    In ErrorInfo è contenuto il messaggio di errore (se c’è stato un errore) prodotto dal metodo Send. Potremo cosi modificare la parte finale del nostro script non limitandoci ad eseguire il controllo, ma in caso di errore daremo anche delle informazioni in merito all’errore stesso.

    Codice PHP:
    if($mail->Send()) 
    {
        echo 
    'mail inviato correttamente';

    else 
    {
        echo 
    'mail non inviato a causa del seguente errore: ' $mail->ErrorInfo;


    - Definizione del sistema di invio.

    Se non altrimenti specificato, PHPmailer eseguirà l’invio tramite la funzione mail di php (notate che a sua volta la funzione mail si appoggia a SMTP sui sistemi windows o a sendmail sui sistemi linux; si veda in proposito il file di configurazione di php).
    Con la proprietà Mailer potremo decidere di utilizzare ad esempio il sistema SMTP bypassando di fatto la funzione mail ed utilizzando un qualsiasi server SMTP al quale siamo autorizzati ad accedere.

    Codice PHP:
    $mail->Mailer "smtp";
    $mail->Host "smtp.server.com";
    # se il server smtp richiede autorizzazione:
    $mail->SMTPAuth TRUE;
    $mail->Username "username";
    $mail->Password "password"

    Dopo avere passato in rassegna i metodi e le proprietà principali di PHPmailer vorrei concludere con due note.


    - Spam:

    Spesso nel nostro forum arrivano richieste del tipo: il mio script invia messaggi correttamente a tutti, ma ai domini xxxx.com e yyyyy.it non arriva nulla. Per esperienza posso dire che in molti casi sono i software anti spam che ovviamente interpretano i nostri messaggi come non desiderati. Dico “ovviamente” perché i così detti spammer utilizzano le nostre stesse tecnologie o comunque delle tecnologie molto simili. Se poi il vostro script è una newsletter, le cose si complicano. Infatti i software antispam non amano molto ricevere email con molti destinatari. Soluzioni assolute non ce ne sono, si possono fare alcuni accorgimenti uno dei quali, a quanto pare è di mettere il return-path nell’header. Con PHPmailer basterà usare la proprietà Sender:
    Codice PHP:
    $mail->Sender "tuomail@tuosito.com"
    In generale dobbiamo comunque rassegnarci; i nostri messaggi, in alcuni casi, verranno marcati come spam.


    Un’ultima nota: Sfruttando le proprietà del paradigma di programmazione ad oggetti, possiamo ulteriormente semplificare il nostro lavoro.

    Codice PHP:
    class PHPMailerPersonale extends PHPMailer
    {
        var 
    $Form "email@tuosito.com";
        var 
    $FromName "Nome Cognome";
        var 
    $Subject "News dal sito";
        var 
    $AltBody "testo alternativo";
        
            function 
    SendConControllo ()
            {
                if(
    PHPMailer::Send()) 
                {
                    echo 
    'mail inviato correttamente';
                } 
                else 
                {
                    echo 
    'mail non inviato a causa del seguente errore: ' PHPMailer::ErrorInfo;
                }
            }

    In questo caso definisco delle proprietà che sono sempre valide per me, così non le devo definire ogni volta. Inoltre creo un metodo con il quale posso inviare il messaggio ed eseguire il controllo in modo semplificato.
    A questo punto istanziamo la classe child ed inviamo il messaggio ma con un codice molto più leggero
    Codice PHP:
    $mail = new PHPMailerPersonale();

    $mail->Body "Testo del messaggio";
    $mail->AddAddress("xxx@yyy.com");

    $mail->SendConControllo(); 

  2. #2
    bravo utilissima!!!


    ti segnalo lo questi errori:
    Form: L’indirizzo email del mittente
    FormName: Il nome del mittente


    inoltre una domanda io quando invio in formato html

    setto il a true la proprietà isHTML e non utilizzo come fai tu $mail->MsgHTML($body);

    è la stesa cosa?
    « Se nella prima mezz'ora non capisci chi è il pollo, allora il pollo sei tu. » [Thomas "Amarillo Slim" Preston, campione del mondo di poker]

  3. #3
    ottimo, avrei un paio di quesiti a riguardo.

    Per motivi a me ignoti stiamo utilizzando una libreria di terzi per inviare mails ... che e' cosa buona e giusta ma non quando si hanno problemi specifici dove bisogna piegare la lib a proprio vantaggio e risulta piu' dispendioso studiarsi il source altrui ... comunque sia, il sistema da noi utilizzato e' l'alternativa, forse l'unica altrettanto valida, chiamata Swift Mailer.

    Quello che vorrei sapere e' se hai mai testato Swift Mailer o confrontato con PHPMailer.

    Nello specifico vorrei sapere qualcosa riguardo le performances: quante mail puo' inviare PHPMailer al secondo tramite sendmail, con tanto di attachment e codifica in UTF-8 dei messaggi?

    Swift Mailer me ne invia circa 1 ogni 0.4 secondi, ma la codifica in utf-8 usa giri e rigiri magari validi, ma a mio avviso lenti ... io vorrei trovare il modo, senza scrivere tutto da zero affrontando problemi che per ora non mi interessano (codifiche, attachments, sendmail, etc) di inviare 1 mail al decimo, 0.1, massimo 0.2

    Grazie per l'eventuale risposta, grazie a prescindere per l'utile pillola
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Originariamente inviato da king size slim
    bravo utilissima!!!
    Bravo anche da parte mia

    inoltre una domanda io quando invio in formato html

    setto il a true la proprietà isHTML e non utilizzo come fai tu $mail->MsgHTML($body);

    è la stesa cosa?
    Non proprio, il metodo MsgHTML fa qualcosa in più:

    Evaluates the message and returns modifications for inline images and backgrounds. Sets the IsHTML() method to true, initializes AltBody() to either a text version of the message or default text.
    In pratica oltre a fare quello che fai tu imposta un valore per la mail in formato testo, che è sempre bene includere, per fare in modo che chi visualizza le mail in formato testuale possa vedere qualcosa del messaggio che tu spedisci.

    (l'alternativa è andare a valorizzare manualmente la proprietà AltBody.)

    Ciao

  5. #5
    per king size slim: Vedo che ti hanno già risposto. Intanto grazie per la segnalazione degli errori. from e form sono due parole che si usano così spesso che è facile sbagliarsi.

    per andr3a: Non conosco lo script che hai segnalato. Riguardo alla velocità, non so. Così a naso direi che non dovrebbe cambiare. Sia PHPMailer che Swift Mailer se usano sendmail il lavoro vero e proprio lo fa sendmail, quindi non dovrebbe cambiare. Penso che la potenza del server sia più determinante.

  6. #6
    Originariamente inviato da mtx_maurizio
    Sia PHPMailer che Swift Mailer se usano sendmail il lavoro vero e proprio lo fa sendmail, quindi non dovrebbe cambiare. Penso che la potenza del server sia più determinante.
    purtroppo Swift Mailer impiega tanto per normalizzare testo e/o html in UTF-8 , ecco il perche' della mia domanda: sai dirmi in media quanto ci mette PHPMailer a normalizzare in UTF-8 testi piu' o meno corposi?
    Grazie
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    Questo non lo so, si dovrebbe provare.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    145
    da buon utilizzatore di phpmailer mi aggiungo ai bravo per l'apertura di questo thread

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    118
    Originariamente inviato da mtx_maurizio
    Questo non lo so, si dovrebbe provare.
    quoto anche io

  10. #10

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.