Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23

Discussione: mail() iterato

  1. #1

    mail() iterato

    Ciao ragaz, ho una domanda abbastanza tecnica: sto costruendo un sistema di mailing list conscio del fatto che mandare 2000 mail in un colpo solo può creare diversi problemi al server e al mittente (ban, black list etc).
    Pensavo quindi di mettere uno sleep nel ciclo che manda le mail; secondo voi quale può essere un tempo abbastanza ragionevole per evitare sovraccarichi? Pensavo a 5 secondi tra un send e l'altro...
    Inoltre è possibile settare il server SMTP via php?

    Ringrazio

  2. #2
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Ti sconsiglio di creare uno script che mandi 2000 mail, con o senza sleep dovresti innanzitutto gestire il problema del tempo di esecuzione dello script, con il rischio che se lo script si pianta devi poter gestire la ripresa della coda... a quel punto sapresti dove sei arrivato?

    Personalmente preferisco il seguente approccio:

    Tabella su db con memorizzato indirizzo a cui mandare la mail e stato (0 se da spedire e 1 se spedita).

    Dopodichè richiamo uno script che preleva N indirizzi alla volta tra quelli che hanno lo stato settato a 0.

    A questo punto puoi mandare la mail in bcc in una volta sola e settare a 1 lo stato di spedizione per questi indirizzi, oppure ciclare questi indirizzi e mandare una mail alla volta.

    In questo modo sai sempre a chi hai già spedito la mail, e a chi no, inoltre scegliendo un numero basso non hai problemi di tempi di esecuzione.

    La cosa da fare è poi tramite un sistema di cron richiamare la pagina che fa la spedizione ogni tot minuti.

    ciao

  3. #3
    Ciao Gianiaz, molto interessanti i tuoi spunti. Riflettendoci la questione del db è utile perchè ti permette proprio di capire se la mail è stata mandata oppure no.

    Ma ho un dubbio: utilizzare un cron richiede avere accesso alle "radici" del php, cosa che non credo sia fattibile su hosting a pagamento, o comunque su qualsiasi cosa non risieda sul tuo pc/server (correggimi se sbaglio però!). Dunque mi chiedo: fare una cosa simile in locale, utilizzando nel contempo un smtp esterno?

  4. #4
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Originariamente inviato da Tobler
    Ciao Gianiaz, molto interessanti i tuoi spunti. Riflettendoci la questione del db è utile perchè ti permette proprio di capire se la mail è stata mandata oppure no.

    Ma ho un dubbio: utilizzare un cron richiede avere accesso alle "radici" del php, cosa che non credo sia fattibile su hosting a pagamento, o comunque su qualsiasi cosa non risieda sul tuo pc/server (correggimi se sbaglio però!). Dunque mi chiedo: fare una cosa simile in locale, utilizzando nel contempo un smtp esterno?
    Per il cron, a seconda del tipo di servizio che usi, potresti avere la possibilità di attivare questa opzione.

    Altrimenti esistono dei servizi sia a pagamento che gratuiti che ti permettono di fare un cron da un server esterno (alla fine basta chiamare un indirizzo web dove ci sarà il tuo script).

    L'idea di farlo in locale chiamando un smtp esterno è fattibile a patto che il server smtp accetti connessioni esterne (magari con autenticazione), anche se è una soluzione che sinceramente sconsiglio, perchè il sistema dovrebbe vivere di vita propria e non dovrebbe essere dipendente da un pc casalingo che potrebbe spegnersi per un calo di tensione, o peggio danneggiarsi.

    Ciao

  5. #5
    Grazie mille per i suggerimenti davvero utili.
    Alla prossima!

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    145
    ciao ragazzi,
    mi accodo a questo thread...io ho lo stesso problema ed avevo già risolto utilizzando un campo 0/1 nel database per poter continuare con l'invio delle mail in caso di errore, senza cominciare da capo ogni volta.
    Il fatto è questo...gianiaz consiglia di creare uno script che preleva N email in copia nascosta e le invia...mettiamo che so, 20 o 30 per volta...ma poi come arrivo al totale?
    Devo fare n cicli di invio finchè non esaurisco i destinatari, giusto?
    Io al momento ho 200 email, ovviamente non so quanto crescerà questo valore, ma lavoriamo con 200.....diviso 20 destinatari in BCC diventano 10 invii...cosa faccio, un ciclo for fino a 10, ognuno contenente un'invio? Non rallenta anche questo l'esecuzione del codice?
    Un'altra domanda...se un indirizzo è scritto male, blocca l'invio a tutti e 20 i destinatari in BCC? non mi riferisco a daemon che poi tornano indietro ma errori di battitura, che so, un email scritta come emaildominio.it senza la chioccioletta, cose così...perchè se blocca tutto l'invio allora tocca tornare a fare 20 invii e qui ritorniamo al discorso dei cicli, ecc....
    Cosa mi consigliate?
    Grazie mille!

  7. #7
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Per quanto riguarda il discorso del prelevamento degli indirizzi, io non mi pongo il problema, chiamo la pagina periodicamente prelevo con una query del tipo:

    codice:
    SELECT * FROM coda_invio WHERE sent = 0 LIMIT 0, 10
    Se non c'è nessun indirizzo con sent = 0 non preleva nulla e la cosa finisce li.

    Per il controllo di correttezza sintattica della mail, non sono sicuro che blocchi il bcc, comunque è sempre buona cosa controllare l'indirizzo quando ti viene fornito, se non puoi, o se devi lavorare con dati già inseriti in precedenza, puoi comunque verificare la sintassi di un indirizzo con questa regex:

    codice:
    ^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$
    ciao

  8. #8
    Utente di HTML.it L'avatar di thitan
    Registrato dal
    Feb 2001
    Messaggi
    716
    non puoi inviare una mailing list e mettere tutti gli indirizzi in bcc..

    io usavo questo:
    Codice PHP:
    function sendMail($emailDestinatario$nomeDestinaratio$emailMittente$nomeMittente$oggetto$testoEmail$myAllegati=''$bcc=''$isHTML$hostSmtp$userSmtp$passSmtp$istanza=0){
        include_once(
    "class.phpmailer.php");
        if(
    checkMail($emailDestinatario)){
            
    $mail[$istanza] = new PHPMailer();
            
    $mail[$istanza]->IsHTML($isHTML);
            
    $mail[$istanza]->From $emailMittente;
            
    $mail[$istanza]->FromName $nomeMittente;
            
    $mail[$istanza]->IsSMTP();
            
    $mail[$istanza]->Mailer "smtp";
            
    $mail[$istanza]->Host $hostSmtp;
            
    $mail[$istanza]->Username $userSmtp;
            
    $mail[$istanza]->Password $passSmtp;
            
    $mail[$istanza]->SMTPAuth true;
            
    $mail[$istanza]->Body$testoEmail;
            
    $mail[$istanza]->Subject $oggetto;
            
    $mail[$istanza]->AddAddress($emailDestinatario$nomeDestinaratio);
            
            if(
    $bcc!=''){
                
    $rayBcc=explode(','$bcc);
                foreach(
    $rayBcc as $copiaCarbone){
                    if(
    checkMail($copiaCarbone)){
                        
    $mail[$istanza]->AddBcc($copiaCarbone);
                    }
                }
            }
            
    $rayAllegati=unserialize($myAllegati);
            if(
    $rayAllegati!=''){
                foreach(
    $rayAllegati as $allegato){
                    
    $nomeFile=$allegato['nome'];
                    
    $urlFile=$allegato['url'];
                    
    $mail[$istanza]->AddAttachment($urlFile$nomeFile);
                }
            }
            
            if(!
    $mail[$istanza]->Send()){
                
    //$tb=0;
                
    $tb=$mail[$istanza]->ErrorInfo;
            }else{
                
    $tb="1";
            }
        
            unset(
    $mail[$istanza]);
        }else{
            
    $tb "Email non valida";
        }

        return 
    $tb;

    che usava phpmailer (la vecchia versione, non quella nuova.. non ho ancora avuto il tempo di darci un'occhiata)

    e garantisco che fino a 1800 indirizzi circa non si è mai bloccato, mail in html con allegato pdf di circa 200 kb..

    il codice sopra è un pelo vecchiotto, e riguardandolo ora ci sono un paio di cose da mettere a posto

    www.inter-rail.it
    travellers, not tourist
    Is cuma cá mhinice a théann tú ar strae; is é is tábhachtaí gurb áil leat do bhealach a aimsiú arís.

  9. #9
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Originariamente inviato da thitan
    non puoi inviare una mailing list e mettere tutti gli indirizzi in bcc..
    non è che non puoi, è vero che è più carino vedersi recapitare una mail personalizzata..

    e garantisco che fino a 1800 indirizzi circa non si è mai bloccato, mail in html con allegato pdf di circa 200 kb..
    Puoi garantirlo per il server in cui l'hai provato tu, perchè su altri server non puoi di sicuro.

    In pratica tu crei una connessione SMTP per ogni destinatario, e se il server SMTP risiede su un altra macchina o se è particolarmente lento avrai il problema che magari ti manda in timeout lo script, e anche se puoi settare il tempo massimo di esecuzione, non è detto che possa accadere un crash proprio nel bel mezzo del tuo ciclo, a quel punto come fai a sapere se la mail è stata spedita ad un particolare indirizzo?

    Certo si possono mixare i 2 metodi, ripeto nulla da dire sul discorso dell'invio personalizzato

  10. #10
    Utente di HTML.it L'avatar di thitan
    Registrato dal
    Feb 2001
    Messaggi
    716
    Originariamente inviato da gianiaz
    non è che non puoi, è vero che è più carino vedersi recapitare una mail personalizzata..



    Puoi garantirlo per il server in cui l'hai provato tu, perchè su altri server non puoi di sicuro.

    In pratica tu crei una connessione SMTP per ogni destinatario, e se il server SMTP risiede su un altra macchina o se è particolarmente lento avrai il problema che magari ti manda in timeout lo script, e anche se puoi settare il tempo massimo di esecuzione, non è detto che possa accadere un crash proprio nel bel mezzo del tuo ciclo, a quel punto come fai a sapere se la mail è stata spedita ad un particolare indirizzo?

    Certo si possono mixare i 2 metodi, ripeto nulla da dire sul discorso dell'invio personalizzato
    sisi ovvio dipende dal server.. ma non credo fosse un server molto potente quello su cui stava..

    poi se noti la funzione restituisce 1 se và a buon fine, 0 (riga commentata) se fallisce, usavo quello per capire quali indirizzi email non inviava (come dicevi te, la 'coda')

    l'unico vero problema che avevo con quella funzione è che una buona parte (30% circa) veniva presa come spam, anche se, non mi sono mai soffermato a vedere se fosse un reale problema di invio, o della struttura dell'allegato o del testo mail (che era html)

    www.inter-rail.it
    travellers, not tourist
    Is cuma cá mhinice a théann tú ar strae; is é is tábhachtaí gurb áil leat do bhealach a aimsiú arís.

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.