- Home
- Categorie
- Coding e Sistemistica
- PHP
- Sistema per newsletter
-
Sistema per newsletter
Buongiorno a tutti
avrei bisogno di un consiglio riguardo a un sistema di newsletter.
Ho solo qualche requisito importante :- Sia possibile gestire più liste contemporaneamente
- Il codice sia scritto per lo meno decentemente...dato che sicuremente sarà necessaria qualche modifica
- Possibilmente oltre l'indirizzo email contenga anche altre informazioni come il nome (non è strettamente necessario)
Quello che sembra essere il migliore è PHP list ma sinceramente non ne sono per niente soddisfatto dato che il codice è inguardabile e l'usabilità è a livelli bassisimi.
-
Ciao luka_berna,
purtroppo non conosco nulla che possa fare al tuo caso...
Visto che parli di codice inguardabile (caspico a cosa ti riferisci...:() perché non provi ad elaborarne uno tu?Tutto sommato non dovrebbe essere difficile: un form per inserire il testo dell'email, un db dove stoccare i nominativi con relative email ed eventuali flag per separare in gruppi e conteggiare le email inviate...
Ho sparato troppo alto...?
-
Ciao ceccus,
No non hai sparato assolutamente alto. Il mio unico problema è che era una necessità abbastanza urgente e purtroppo ora ho poco tempo per scrivere da nuovo un sistema, anche perchè se le cose le faccio in genere mi piace farle bene.
-
Ciao a voi, visto che parlate di newsletter vi invio il mio, magari se avete un suggerimento da darmi ve ne sarei molto gratissimissimus....
Lo script è questo:?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++)
{
$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>";
}
?>credo non abbia bisogno di molti commenti, è abbastanza semplice, le variabili $oggetto e $messaggio controllano che i campi non siano vuoti, se sono compilati mi permette l'invio di newsletter altrimenti rimanda al form newsletter, naturalmente lo script punta ad un database di nome registrazione e mi preleva tutti gli indirizzi email presenti nel db registrazione, sarebbe quello che viene compilato al momento della registrazione sul mio sito..., una cosa buffa, stavo avendo problemi ad inviare email a tutti gli utenti del sito, mi inviava correttamente le email fino al ventinovesimo utente e dal trentesimo in poi mi generava un inspiegabile fatal error,alla fine ho notato che il problema era presente a causa del tempo di esecuzione massima x ogni script in secondi impostato per default a 30 sec in php.ini, alla voce "max_execution_time=30", settando la medesima voce a 0 ho risolto il fastidioso fatal error.
Alla fine dell'invio della newsletter mi conteggia il numero di email inviate... ed è tutto qui. Quello che ora mi incuriosisce è il flag per separare in gruppi le email... posso sapere come si fà? Ho una mezza idea ma non vorrei sbagliarmi...avete qualche scriptino da suggerirmi? Ciaua ciaua a tutti e buon primo maggio
-
Ciao 4everyoung,
purtroppo non ho script da suggerirti per la separazione in gruppi, ma pensavo che potresti creare una tabella di gruppi molto semplice, con id e nome, tipo:1 | settimanali
2 | giornalieriquindi aggiungi ad ogni utente un classico pid (padre id) per associarlo al relativo gruppo. Infine, quando vai a fare la query sugli indirizzi aggiungi la clausola WHERE pid=xxx. Per rendere il tutto più user friendly potresti aggiungere un menù a tendina per selezionare semplicemente il gruppo.
Il problema che resterebbe aperto, ma qui andiamo nel puro marketing, è quello di assegnare i diversi utenti registrati ai diversi gruppi. In prima battuta direi di assegnarli a manina o di separarli in base al form di accesso.
Attendiamo fiduciosi ulteriori contributi...
-
@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 idUna 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)
-
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
-
@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 idUna 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
-
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.
-
@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
-
Zend, penso che zend pensi a tutto
-
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
-
@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
-
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.
-
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
-
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
-
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.netQuando 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).