• User

    ci provo a suggerirti qualcosina,spero possa interessarti:

    <?php
    // Recupero il valore dei campi del form
    //qui dovresti aggiungere i controlli sul contenuto dei campi (io lo faccio sempre ma è opzionale)
    $destinatario = $_POST['destinatario'];
    $mittente = $_POST['mittente'];
    $oggetto = $_POST['oggetto'];
    $messaggio = $_POST['messaggio'];
    // Do un valore alle variabili relative all'allegato
    $allegato = $_FILES['allegato']['tmp_name']; //nome_temporaneo
    $allegato_type = $_FILES['allegato']['type']; //tipo di file
    $allegato_name = $_FILES['allegato']['name']; //nome del file
    // 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'); //la "r" sta per read, la "b" apre i files per i sistemi che fanno differenza tra files binary e testo(Windows ad esempio)
    $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>";
    echo "Torna al <a href="form.php">form</a>";
    }else{// 1-2-3 li aggiungo per controllare che sia cmq tutto ok,
    //caricando questo script sul server si possono anche commentare o eliminare
    print$allegato."<br>"; // -1
    print$allegato_type."<br>"; // -2
    print$allegato_name."<br>"; // -3
    echo "<p>Attenzione! Impossibile inviare la mail.</p>";
    echo "Torna al <a href="form.php">form</a>";
    }
    ?>

    grazie CECCUS, ci risentiamo sempre per lo stesso argomento,ora devo proprio chiudere,che frenetica sta vita! Ciaua ciaua


  • User

    @luka_berna said:

    @ceccus
    Alla fine come si era detto all'inizio ho deciso di svilupparlo di mano mia, e così sto facendo (per gli amanti dei dettagli sto usando lo Zend Framework).
    @4everyoung
    ti ringrazio per lo script, ma quello di cui avevo bisogno io è qualcosa di molto più grande con al possibilità da interfaccia web di gestire gli utenti e i gruppi, la posssibilità di scrivere mail html allegandoci foto e spedire anche su smtp autenticati.
    Io la gestione dei gruppi l'ho fatta semplicemente con una tabella users una tabella groups e dato che una relazone many-to-many la classica tabella che collega gli user id con i groups id

    Una volta che arriverò a una release decente credo di rilasciare il codice sorfente sotto GPL, quindi se in un futuro qualcuno (con discreta conoscenza dello ZF) sarà interessato allo sviluppo sarà ben accetto (in realtà mi servirebbe anche una mano per la parte grafica che per ora ho trascurato)

    Ciao luky, 🙂 hai trovato poi una soluzione allo script che volevi fare? Io ho provato a cercare qualcosa, ho trovato su free-script.it questo:

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

    $mail = new PHPMailer();
    $mail->IsSMTP(); // attiva l'invio tramiteSMTP
    $mail->Host = "mail.serverposta.it"; // indirizzo smtp
    $mail->From = "[email protected]";
    $mail->FromName = "Nome Mittente";
    $mail->AddAddress("[email protected]");
    $mail->IsHTML(true);
    $mail->Subject = $oggetto;
    $mail->Body = $bodyhtml;
    $mail->AltBody = $bodytxt;
    $mail->AddAttachment("public/filename_1.zip");
    if(!$mail->Send()){
    echo "Si è verificato un errore nell'invio della mail";
    }else{
    echo "Mail inviata con successo";
    }
    ?>

    Da free-script.it, Script php: Inviare mail da locale o tramite smtp con PHPMailer

    potrebbe esserti un tantino utile, almeno per farti un'idea... vedi un pò... fammi sapere se riesci a far qualcosa, interessa anche a me,io con le classi son vado tanto forte!!! 😉 Ciao


  • User

    Si, a dire il vero ho già quasi finito tutto il sistema compreso l'interfaccia web per la gestione degli utenti, i gruppi e l'invio delle mail in html tramite smtp autenticato.
    Se ti può interessare per l'invio delle mail ho utilizzato la classe Zend_Mail dello Zend framework.


  • Bannato User Attivo

    @luka_berna said:

    Si, a dire il vero ho già quasi finito tutto il sistema compreso l'interfaccia web per la gestione degli utenti, i gruppi e l'invio delle mail in html tramite smtp autenticato.
    Se ti può interessare per l'invio delle mail ho utilizzato la classe Zend_Mail dello Zend framework.

    occhio che per grandi quantità di email potresti avere problemi di timeout/performance, l'invio potrebbe fermarsi a metà lista e quindi devi gestire il fatto che certi l'hanno già ricevuta e altri no, non devi reinviarla a tutti chiaramente... ci sono delle problematiche per le quali è consigliabile affidarsi a script già pronti e testati, se non li si vuole adottare in toto quantomeno in questi casi si scopiazza :wink3:


  • User Attivo

    Zend, penso che zend pensi a tutto


  • User

    Bhe scusa per quanto riguarda il timeout basta settare set_time_limit(0) per il resto non vedo altri problemi. Anche sistemi già rodati non fanno niente di speciale, e in genere sfruttano phpmailer


  • Bannato User Attivo

    @luka_berna said:

    Bhe scusa per quanto riguarda il timeout basta settare set_time_limit(0) per il resto non vedo altri problemi. Anche sistemi già rodati non fanno niente di speciale, e in genere sfruttano phpmailer

    scusa, sono stato troppo approssimativo, il timeout è uno dei problemi, il server smtp per ragioni di sicurezza potrebbe negarti di inviare più di 1000 email in un certo lasso di tempo, il tuo script potrebbe andare inaspettatamente in errore dopo N invii, ect. ect
    insomma il concetto è che se lo script si ferma, deve saper ripartire da dove si è fermato...

    ciao,r


  • User

    si infatti, anche io come ambiente di sviluppo uso Zend, cmq per quanto riguarda l'invio di tot email poi una pausa x non intasare il server e poi riprendere da dove ha lasciato credo si debba fare + o - così, correggetemi voi:

    <?PHP
    $host='localhost';
    $user='root';
    $password='pass';
    $database='registrazione';

    $oggetto=$_REQUEST['oggetto'];

    $messaggio=$_REQUEST['messaggio'];

    $errore=false;

    if (($oggetto == "")||($messaggio == ""))
    {
    #se solo uno dei campi è vuoto
    $errore=true;

    echo "<br><br><br>";
    echo "<CENTER><H3>Spiacente, devi compilare tutti i campi!<BR>";
    echo "Ritorna al <a href="newsletter.php">form</a></H3></CENTER>";
    }
    else
    {

    $db=mysql_connect($host,$user,$password) or die ("Impossibile connettersi al server $host");
    mysql_select_db($database,$db) or die ("Impossibile connettersi al database $database");

    $query="SELECT * FROM registrazione";

    $res=mysql_query($query,$db);

    $AffectedRows=mysql_affected_rows($db);

    $intestazioni="From: indirizzo@email...<br>
    Reply To: indirizzo@email...";

    for($index=0;$index<$AffectedRows;$index++)
    {
    if(($index%50)==0)
    **sleep(10); **

    ...come dire, ogni 50 email fai una pausa di 10 secondi e poi continua da dove hai lasciato per altre 50, poi ancora stop x 10 sec. e poi riprendi nuovamente...

    $row=mysql_fetch_row($res);

    $destinatario=$row[2];

    mail($destinatario,$oggetto,$messaggio,$intestazioni);
    }
    print "<h2>Sono state inviate $index email</h2><br>";
    print "<h2>Invio Newsletter terminato</h2><br>";
    print "<a href="newsletter.php">Torna al form newsletter</a>";
    }
    ?>

    Da premettere che non conoscevo la funzione sleep(), l'ho imparata da poco proprio grazie a Zend. Xfavore fatemi saper se c'è qualche errore... Grazie.


  • User

    Quando parlo che sviluppo con Zend intendo Zend Framework e non Zend Studio (che cmq uso).
    Comunque credo che saro78 si riferisse al tempo massimo di esecuzione che in genere è fissato a 30 secondi, e le sleep vengono conteggiate in questo tempo quindi se mandi il sleep il tuo script per 10 secondi ti sei bruciato 10 dei 30 secondi a disposizione.
    Nel tuo script tra l'alto usi la funzione mail, che hai in parametri settati nel php.ini e praticamente il 95% delle volte non hai la possibilità di modificare quei prarametri, in più hai non poche grane ad inviare allegati.
    Ps ti consiglerei di fare un po di escaping su $oggetto=$_REQUEST['oggetto'];
    $messaggio=$_REQUEST['messaggio']; altimenti un qualsiasi malintenzionato può iniettarti header html e usarti per fare spam


  • User

    ciao luka_berna, è giustissimo ciò che dici, allora riguardo all'escaping su
    $oggetto=$_REQUEST['oggetto'] e
    $messaggio=$_REQUEST['messaggio']
    mi basta modificarli in questo modo? $oggetto=htmlentities($_POST['oggetto']) e
    $messaggio=htmlentities($_POST['messaggio']),
    penso si debba fare così, se sbaglio correggimi xfavore, in quanto programmatore non espertissimo credevo che bastasse la funzione sleep() per il tempo di esecuzione, in qualche modo dovrebbe svolgere in automatico ciò che è settato nel php.ini, senza dunque dover apportare modifiche a tale file... oppure non sono ben informato su questo? Questa cosa non l'ho ben capita, eppure chiedendo al mio prof. di programmazione mi ha detto che sleep() svolge esattamente le funzioni di set_time_limit del php.ini....
    Xfavore dammi delle delucidazioni in merito a questa cosa perchè credo di avere le idee confuse. E riguardo alla funzione mail e gli allegati? Che modifiche dovrei fare per migliore lo script?Grazie


  • User

    allora mi correggo perchè credo di aver detto una cappellata immensa.
    Allora cerco di chiarirti/mi le idee. Rimuovi tutto quanto ho affermato in precedenza.
    Il discorso è questo php ha una configurazione che si chiama max_execution_time che specifica in secondi qual'è il tempo massimo di esecuzione di uno script, tipicamente questo valore è 30 secondi e il suo scopo principale è quello di evitare che script scritti (ad esempio cicli infiniti, etc...) vadano a bloccare il server tendo troppo occupata la cpu.
    Il nocciolo della questione è che questo tempo massimo di esecuzione è relativo allo script in uso e ne conteggio diciamo che tiene conto solo del tempo impiegato dallo script stesso e non da esecuzione estene allo script come system call, query su db etc.
    E' importante questo perchè la funzione sleep() è in definitiva un system call che chiedere di mandare il sleep il thread di esecuzione dello script dalla quale viene chiamata.
    Ho effettuato dei test ora controllando con un codice abbastanza semplice
    [php]
    <?php
    echo "hello";
    sleep (40);
    echo "word";
    ?>
    [/php]e in effetti non viene generato l'errore di aver superato il tempo massimo di esecuzione.
    L'idea di set_time_limit() invece è che nel momento in cui tu la chiami resetta il contatore del tempo di esecuzione e ti da ancora a disposizione i secondi che hai specificato come parametro. Citando il manuale di php.net

     Quando viene eseguita la funzione **set_time_limit()**, questa re-imposta il      il contatore del tempo di esecuzione a zero. In altre parole, se il timeout è impostato al default      di 30 secondi, e dopo 25 secondi di esecuzione si richiama la funzione      con set_time_limit(20), lo script potrà girare per      45 secondi.
    

    DIciamo che non trovo molto corretto quanto detto dal tuo professore dato che non fanno la stessa cosa, voglio dire la set_time_limit() non mette in pausa lo script ne altro, ma non conoscendo perfettamente il core di php non posso escludere che la stessa funzione sleep chiami la set_time_limit() per non avere problemi.
    Spero di essere stato chiaro, e se ho sbagliato qualcosa di essere corretto, dato che siamo qua tutti per impare.
    Un consiglio finale usa SEMPRE il manuale su php.net è una risosarsa indispensabile (se proprio sei pigro c'è anche in italiano).