Visualizzazione dei risultati da 1 a 10 su 255

Hybrid View

  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
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854
    Non me ne vogliano gli amministratori, ma trovo tale post molto importante, quindi posto anche se è un pò datato.


    Volevo chiedere:
    codice:
    $mail->Sender = "tuomail@tuosito.com";
    effettivamente cosa restituisce? deve essere la stessa casella mail con cui invio la mia newsletter o può essere un'altra?

    Io non ho mai usato:
    codice:
    $mail->ClearAddresses();
    e non mi hai mai dato errori di invio multiplo o simili, è normale?

    Grazie!

  3. #3
    Ciao a tutti,
    sto utilizzando questa libreria per l'invio di una newsletter e l'invio viene eseguito tramite l'autenticazione smtp.

    io avrei bisogno del file eml per la gestione della newsletter, attualmente non ho trovato il modo di poter creare quest'ultimo .. qualcuno ha qualche idea su come poterlo creare?

    Grazie
    Sviluppatore web e web application.
    Svolgo con passione e determinazione il proprio lavoro dedicando tempo alla ricerca e all'approfondimento di novità.
    www.decadeweb.it

  4. #4
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854
    Perchè il file .eml?

  5. #5
    Quote Originariamente inviata da Felino Visualizza il messaggio
    Perchè il file .eml?
    Il file viene creato sul server e mi permette di gestire eventuali code o errori o eventualmente in caso di mancata connessione non mi perdo le newsletter e posso comunque rinviarle dal server.
    Per questo ho bisogno che venga creato quest'ultimo...
    Sviluppatore web e web application.
    Svolgo con passione e determinazione il proprio lavoro dedicando tempo alla ricerca e all'approfondimento di novità.
    www.decadeweb.it

  6. #6
    Ciao, avrei una domandina su phpmailer.
    Vorrei mandare un'email che invii delle tabelle SOLO se hanno i POST 'riempiti'. Ad esempio: ho sei tabelle dove si possono inserire delle quantità, nella pagina successiva viene fatta un riassunto della 'spesa', però sono state riempite solo due tabelle su sei. Ecco, come posso fare in modo che nell'email ricevuta arrivino solo quelle tabelle con le quantità, mentre le altre vuote rimangano invisibili?

  7. #7
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854
    Credo che sia una problema più relativo a PHP e non a PHPMailer.

  8. #8
    Bella guida.
    Avrei un quesito: per inviare email con allegati (pdf non localizzati nel server, ma sono all'interno di un database mysql) nel sito c'è quest'esempio:

    require_once('../class.phpmailer.php');
    //include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

    $mail = new PHPMailer();

    $body = file_get_contents('contents.html');
    $body = eregi_replace("[\]",'',$body);

    $mail->IsSMTP(); // telling the class to use SMTP
    $mail->Host = "smtp1.site.com;smtp2.site.com";
    $mail->SMTPAuth = true; // enable SMTP authentication
    $mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent
    $mail->Host = "mail.yourdomain.com"; // sets the SMTP server
    $mail->Port = 26; // set the SMTP port for the GMAIL server
    $mail->Username = "yourname@yourdomain"; // SMTP account username
    $mail->Password = "yourpassword"; // SMTP account password
    $mail->SetFrom('list@mydomain.com', 'List manager');
    $mail->AddReplyTo('list@mydomain.com', 'List manager');

    $mail->Subject = "PHPMailer Test Subject via smtp, basic with authentication";

    @MYSQL_CONNECT("localhost","root","password");
    @mysql_select_db("my_company");
    $query = "SELECT full_name, email, photo FROM employee WHERE id=$id";
    $result = @MYSQL_QUERY($query);

    while ($row = mysql_fetch_array ($result)) {
    $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
    $mail->MsgHTML($body);
    $mail->AddAddress($row["email"], $row["full_name"]);
    $mail->AddStringAttachment($row["photo"], "test.pdf");

    if(!$mail->Send()) {
    echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->ErrorInfo . '<br>';
    } else {
    echo "Message sent to :" . $row["full_name"] . ' (' . str_replace("@", "&#64;", $row["email"]) . ')<br>';
    }
    // Clear all addresses and attachments for next loop
    $mail->ClearAddresses();
    $mail->ClearAttachments();
    }


    la mail parte, il nome dell'allegato parte con il pdf inserito... ma all'interno è vuoto.
    Sicuramente è un problema della composizione

  9. #9
    Raga urge aiutino

    Mi sono letto l'intera pillola, ma non mi sembra di avere rilevato spiegazioni circa l'impostazione della priorità di consegna.
    La proprietà PHPMailer è Priority di default impostata su 3 = Normal
    Email priority (1 = High, 3 = Normal, 5 = low).

    Io vorrei modificarla, le sto provando tutte ma non va, ho provato;

    Codice PHP:
    $mail->set('X-Priority''1'); 
    Codice PHP:
    $mail->Priority 1

    Qualcuno può aiutarmi ?

    Thanks


    .

  10. #10
    Ciao raga, urge aiutino
    innanzitutto che coincidenza, avevo scritto io l'ultimo post un bel pò di mesi fa, purtroppo senza risposta... vabbè
    Adesso ho un latro problema.
    Devo riuscire ad inviare una serie di allegati ai rispettivi destinatari.

    Ecco il codice:

    codice:
    <?php
    error_reporting(E_STRICT | E_ALL);
    date_default_timezone_set('Etc/UTC');
    
    include('inc/config.php');
    require 'plugins/phpmailer/PHPMailerAutoload.php';
    $mail = new PHPMailer;
    
    $mail->setFrom('info@xxxx.com', 'xxxxxxxx');
    $mail->addReplyTo('info@xxxx.com', 'xxxxxxxx');
    
    $mail->Subject = "Elenco prodotti del giorno";
    $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';
    
    $sql = $db->getArrayRow("SELECT email, codice_cliente FROM clienti");
    
    foreach ($sql as $row) {
        
        $mail->addAddress($row['email'], $row['codice_cliente']);
        
        $body = " invio allegato per il cliente codice: " . $row['codice_cliente'];
        $mail->msgHTML($body);
    
        
        $path_file_attached = 'docs/phpexcel/daily_'.$row['codice_cliente'].'.xls';
        $mail->addAttachment($path_file_attached); 
       
       
        if(!$mail->send()) {            
            echo "Mailer Error (" . str_replace("@", "@", $row["email"]) . ') ' . $mail->ErrorInfo . '<br />';
            break;         
        } 
        else{            
            echo "Message sent to: " . $row['codice_fornitore'] . ' '.$path_file_attached.' (' . str_replace("@", "@", $row['email']) . ')<br />';
        }
        // Clear all addresses and attachments for next loop
        $mail->clearAddresses();
        $mail->clearAttachments();
    }
    ?>

    Il mio problema è che mi invia solo la prima email !

    Se non includo l'allegato, funziona, le email raggiungono tutti i destinatari.
    Può essere un problmea di tempi di esecuzione del server, o cosa ?


    Mi aiutate per favore ?

    Thanks

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.