Questo breve tutorial ci aiuterà nella creazione e nella gestione di
una semplice mailing-list. Gli utenti possono iscriversi per ricevere i messaggi
che sono oggetto della lista (inviare agli iscritti avvisi di nuovi aggiornamenti per un dato software, date di eventi, selezione di articoli su un dato argomento sono solo alcuni dei possibili utilizzi di questo strumento).
Attraverso poche funzioni-base, l'accesso alle quali è protetto da
una password, l'amministratore della lista potrà inviare i messaggi, conoscere la lista degli iscritti, eliminare un'utente. Includere questo strumento di gestione e di contatto con gli utenti arricchirà il
nostro sito web migliorandone l'interattività.
Poche semplici avvertenze prima di entrare nel vivo del nostro progetto. Innanzitutto il database: come sempre, per poter essere aggiornabile deve avere settato il permesso di scrittura. La grafica è assente, per permetterci di adattare facilmente lo script al sito in cui lo utilizzeremo. Anche i files che lo compongono sono ridotti all’ essenziale e quindi potranno (e dovranno) essere arricchiti e personalizzati.
Ancora: la sintassi delle istruzioni “include…" potrà variare (di poco, lo vedremo più avanti) a seconda del server che ospita il tuo sito. Infine l’invio dei messaggi: come è noto, questo richiede l’uso di un oggetto “ad-hoc". Per il nostro script ho deciso di adottare CDOSYS perché è sicuramente quello più diffuso e utilizzato tra i nostri utenti. Se non sei sicuro che il tuo provider supporti CDOSYS, informati: quasi sicuramente la risposta sarà affermativa. In caso contrario, niente paura: i tutorial di freeasp.it e html.it ti saranno ancora una volta di aiuto per le piccole modifiche che dovrai apportare solo al file broadcast.asp. A tal fine ricordo che sono sempre a disposizione per ogni chiarimento ed aiuto. L'applicazione completa è disponibile per il download.
Prima parte: il database
Creiamo un file Access e chiamiamolo Lista.mdb. All'interno di questo file, creiamo la tabella mailing_list con i due campi ID e email. ID è un contatore che utilizzeremo come chiave primaria per identificare i records; email è il campo testo in cui memorizzeremo gli indirizzi email degli iscritti. Ecco una vista
del nostro database catturata in uno screenshot di Access.
Seconda parte: inserimento indirizzi
Il secondo passo è creare uno script per l'inserimento degli indirizzi. Cominciamo a chiedere all’utente di inserire il suo indirizzo email: lo faremo con un semplice form, il file index.asp.
Molto semplice, index.asp è munito di una funzione Javascript per controllare la validità dell’indirizzo. Eccolo:
<%
‘Il form per aggiungere un nuovo utente alla mailing-list
%>
<html>
<head>
<title>Aggiungi utente</title>
<script language="javascript" type = "text/javascript">
function controllo(){
var test;
test="true";
if (test=="true") {
if(document.form1.email.value=="") {
alert("Compila il campo!");
document.form1.email.focus();
test="false";
}
}
if (test=="true") {
if (document.form1.email.value.indexOf("@")==-1)
{
alert("Indirizzo email non valido!");
document.form1.email.focus();
test="false";
}
}
if (test=="true") {
if (document.form1.email.value.indexOf(".")==-1)
{
alert("Indirizzo email non valido!");
document.form1.email.focus();
test="false";
}
}
if (test=="true") {
if (document.form1.email.value.length < 7)
{
alert("Indirizzo email non valido!");
document.form1.email.focus();
test="false";
}
}
if (test=="true")
{
document.form1.submit();
}
}
</script>
</head>
<body>
<form name="form1" method="POST" action="AddUser.asp">
<p>Inserisci il tuo indirizzo email: <input type="text" name="email"></p><br/>
<p><input type="button" value="Conferma" name="B1"
onClick="javascript: controllo();"/></p>
</form>
</body>
</html>
Ora il file di connessione al database. Lo chiameremo store.asp:
<%
'stringa di connessione
cstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
& Server.MapPath("/database/lista.mdb")
‘oggetto connessione
Set objConn=Server.CreateObject("ADODB.Connection")
objConn.Open cstring
%>
Occhio: nel file di connessione è necessario modificare la stringa di connessione sostituendo, all’url riportato nell’esempio, l’indirizzo fisico del nostro database.
A questo punto possiamo creare lo script per l'inserimento dei nuovi indirizzi, che chiameremo AddUser.asp. Ricordo che il file adovbs.inc (che come vedremo è incluso a sua volta in AddUser.asp) è un file che dichiara varie funzioni e variabili ActiveX Data Objects (ADO). Troverai anche adovbs.inc nella cartella compressa da scaricare.
<!--#INCLUDE file="moduli/store.asp"-->
<!-- #INCLUDE file="moduli/adovbs.inc"-->
<%
'aggiunta nuovo utente
DIM NewEmail
NewEmail = Request.Form("EMail")
Dim objRec
Set objRec = Server.CreateObject("ADODB.Recordset")
sql="select * from mailing_list where email = '"&NewEmail&"'"
objRec.Open sql, objConn, 3, 3
if not objRec.eof then
response.write("<div align='center'>Utente già iscritto!</div>")
objRec.Close
Set objRec = Nothing
objConn.Close
Set objConn = Nothing
else
'crea nuovo record
objRec.AddNew
objRec("EMail") = NewEMail
objRec.Update
objRec.Close
Set objRec = Nothing
objConn.Close
Set objConn = Nothing
response.write("<div align='center'>Nuovo utente inserito</div><br/>")
response.write("<div align='center'>Benvenuto!</div>")
end if
%>
AddUser.asp è molto semplice, direi essenziale: recupera l’indirizzo email inserito dall’utente e con una query di select controlla che non sia già presente nel database. In caso affermativo, ne avvisa l’utente, altrimenti aggiunge il nuovo indirizzo al database.In entrambi i casi, al termine chiude e distrugge recordset e connessione al database.
Terza parte - Amministrazione
Diamo uno sguardo d'insieme al nostro script. Abbiamo creato un database
di indirizzi email (lista.mdb), un file per la connessione (store.inc), un form per l’inserimento degli indirizzi (index.asp) e infine uno script per aggiungerli al database (AddUser.asp). Semplice, no?
Ora dobbiamo occuparci di amministrare la lista. Naturalmente questo si potrebbe fare manualmente, disponendo di un accesso fisico al server, ma la forza e la bellezza delle ASP risiedono proprio nel permetterci di realizzare queste azioni da remoto, via web.
Tre funzioni principali devono essere eseguite dall'amministratore della lista:
- vedere la lista degli utenti
- cancellare un utente
- inviare messaggi agli utenti
Prima di occuparcene però vorrei aprire una brevissima parentesi riguardante la sicurezza.
Per quanto la nostra lista contenga dati di importanza e riservatezza non strategiche, sarà come sempre opportuno:
- memorizzarne i files amministrativi (quelli relativi alla gestione della
lista) in una cartella diversa, possibilmente esterna alla root del sito
- proteggere questi files limitandone l'accesso al solo utente autorizzato
a usarli, l'amministratore della lista
Per realizzare questo livello “minimo" di protezione abbiamo integrato lo script con una cartella (login) contenente una elementare routine di autenticazione.
Per accedere la prima volta ai files di amministrazione, inserisci come credenziali:
User = admin
Password = admin
Per gli accessi successivi potrai modificare a tua discrezione i dati contenuti nella tabella user del database, per esempio editandola in Access.
Amministriamo la nostra nuova mailing-list
Per prima cosa dobbiamo creare un breve script che provveda alle seguenti
funzioni:
- stampare l'elenco degli utenti iscritti alla mailing-list
- permettere all'amministratore di cancellare un utente
Chiameremo questo file list.asp e, come detto, lo memorizzeremo nella cartella “admin". Eccolo:
<!-- #INCLUDE file = "login/riservato.asp" -->
<% response.buffer = True%>
<!-- #INCLUDE virtual="/source/moduli/store.asp" -->
<!-- #INCLUDE virtual="/source/moduli/adovbs.inc" -->
<%
‘elenco degli utenti registrati
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Elenco utenti </title>
</head>
<body>
<p align="center"><b>Elenco degli utenti</b></p>
<div align="center">
<table border="2" cellpadding="2" cellspacing="0">
<tr>
<td><p align="center">Indirizzi</td>
<td><p align="center">Cancella utente</td>
</tr>
<%
Dim objRec 'oggetto recordset
'creazione e apertura recordset
Set objRec = Server.CreateObject ("ADODB.Recordset")
objRec.open "mailing_list", objConn, adOpenKeyset, _
adLockReadOnly, adCmdTable
'cicla i records
While Not objRec.EOF
'tabella degli indirizzi
Response.Write("<tr><td><p align=""center""><a
href=""mailto:")
Response.Write(objRec("EMail"))
Response.Write(""">")
Response.Write(objRec("EMail"))
'creazione link ai record da cancellare
Response.Write("</a></td><td><p align=""center""><a
href=""delete.asp?id=")
Response.Write(objRec("ID"))
Response.Write("""><b>X</b></a></td></tr>")
objRec.MoveNext
Wend
'chiusura e distruzione recordset e connessione
objRec.Close
Set objRec = Nothing
objConn.Close
Set objConn = Nothing
%>
</table>
</div>
<%
response.write("<br/><br/><div align='center'>
<a href='default.asp'>Torna alla pagina di amministrazione</a></div>")
%>
</body>
</html>
Il file è molto semplice e non rimane molto da aggiungere. Abbiamo creato la tabella contenente l’elenco degli indirizzi, e per ciascuno di essi abbiamo creato un link alla procedura per cancellarlo.
Anche ogni indirizzo è un link: per mezzo di un <a href="mailto: …….."> l’amministratore potrà anche inviare un messaggio a un singolo utente, con un semplice click.
Creiamo ora lo script per cancellare un utente, che è collegato al file list.asp utenti dal link appena creato. Chiameremo questo file delete.asp. È brevissimo:
<!-- #INCLUDE file = "login/riservato.asp" -->
<!-- #INCLUDE virtual="/moduli/store.asp" -->
<!-- #INCLUDE virtual="/moduli/adovbs.inc" -->
<%
'cancellazione utente
ID = Request.QueryString("id")
sql = "delete * from mailing_list where id = "&id&""
objConn.execute sql
objConn.Close
Set objConn = Nothing
response.write("<div align='center'><b>Record eliminato</b></div>")
response.write("<div align='center'>
<a href='default.asp'>Torna alla pagina di amministrazione</a></div>")
%>
Siamo davvero in dirittura d’arrivo. Non ci resta che creare il file
di invio dei messaggi, il più importante per il nostro script. Chiamiamolo /admin/broadcast.asp. Basato, come detto prima, su CDOSYS, è il seguente:
<!--METADATA TYPE="typelib"
UUID="CD000000-8B95-11D1-82DB-00C04FB1625D"
NAME="CDO for Windows 2000 Type Library" -->
<!--METADATA TYPE="typelib"
UUID="00000205-0000-0010-8000-00AA006D2EA4"
NAME="ADODB Type Library" -->
<!--n.b.: non è necessario includere il file adovbs.inc
dopo avere invocato la ADODB library-->
<!-- #INCLUDE file = "login/riservato.asp" -->
<!-- #INCLUDE virtual="/source/moduli/store.asp" -->
<%
'Invio messaggi con CDOSYS strFrom = Request.Form("From")
strSubject = Request.Form("subject")
strBody = Request.Form("body") Set objRec = Server.CreateObject ("ADODB.Recordset")
objRec.Open "mailing_List", objConn, adOpenKeyset, _
adLockReadOnly, adCmdTable
Response.Write("<center><h3>Invio messaggi in corso</h3></center>")
While Not objRec.EOF
invioA = objRec("email")
invioDa =’ "inserire qui la nostra mail" (il mittente: l’admin
della lista)
'* creo gli oggetti cdosys sul server e li gestisco
DIM iMsg, Flds, iConf
Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")
Set Flds = iConf.Fields
Flds(cdoSendUsingMethod) = cdoSendUsingPort
Flds(cdoSMTPServer) = qui inserire i dati forniti dal vostro provider
Flds(cdoSMTPServerPort) = 25
Flds(cdoSMTPAuthenticate) = cdoBasic
Flds(cdoSendUserName) = qui inserire i dati forniti dal vostro provider
Flds(cdoSendPassword) = qui inserire i dati forniti dal vostro provider
Flds.Update
With iMsg
Set .Configuration = iConf
.To = invioA
.From = strfrom
.Sender = invioDa
.Subject = strsubject
.textBody = "Testo del messaggio: " & vbCrLf & strbody &
""
.Send
End WithSet iMsg = nothing
Set iConf = nothing
'conferma invio
Response.Write "Messaggio inviato a " & objRec("EMail")
& "!<br>"
'prossimo record
objRec.MoveNext
WEND
objRec.close
set objRec = nothing
objConn.close
set objConn = nothing
Response.Write("<center><h3>Messaggi inviati!</h3><center>")
%>
Notiamo che le prime due istruzioni METADATA invocano due “librerie" di sistema: quella relativa all’oggetto CDO (per l’invio delle email) e quella delle funzioni e variabili ADO che qui sostituisce l’inclusione del file adovbs.inc. Perché anche questa pagina funzioni, suggerisco di verificare se il sistema operativo del server che ospita il nostro sito è Win2003 (e in questo caso alcune delle istruzioni include dovranno usare la sintassi:
<!-- #INCLUDE virtual = …….
anziché
<!-- #INCLUDE file = …..
(come nel nostro esempio) e l’invio di email con CDOSYS sarà certamente supportato) oppure se è una versione precedente di Windows, che potrebbe richiedere una (facile) modifica del file broadcast.asp e di alcune delle istruzioni include.
Inviamo i messaggi
Per scrivere il testo del messaggio da postare agli iscritti alla nostra mailing-list abbiamo creato un semplice form, che abbiamo chiamato message.asp. Eccolo:
<!-- #INCLUDE file = "login/riservato.asp" -->
<%
‘creazione messaggio
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Creazione messaggio</title>
</head>
<body>
<div align="center"><center>
<table border="0" cellpadding="0" cellspacing="0"
width="100%" height="100%">
<tr>
<td width="100%"><form method="POST" action="broadcast.asp">
<div align="center"><center><p>Mittente<br>
<input type="text" name="From" size="22"></p>
</center></div><div align="center"><center><p>Oggetto<br>
<input type="text" name="subject" size="45"></p>
</center></div><div align="center"><center><p>Messaggio<br>
<textarea rows="9" name="body" cols="46"></textarea></p>
</center></div><div align="center"><center><p>
<input type="submit" value="Invia"
name="B1"></p>
</center></div>
</form>
</td>
</tr>
</table>
</center></div>
</body>
</html>
Attenzione: essendo l’accesso al form riservato al solo amministratore
della lista (voi!) ho ritenuto superfluo inserire i controlli Javascript di convalida dell’input. Sono certo che inserirete nei campi del vostro modulo un input corretto e ben formato. Tuttavia anche un semplice errore di digitazione (sempre possibile: pensiamo per esempio a una pressione involontaria del bottone “Invia" prima di avere compilato il campo “messaggio") potrebbe creare piccoli problemi. Il mio consiglio è quindi, prendendo spunto dalla funzione javascript “controllo()" del file index.asp, di divertirvi a dotare anche il form per l’invio dei messaggi di un analogo accessorio.
Completa lo script il file /admin/default.asp, dove abbiamo creato un breve menu cliccabile (due voci) ad uso dell’amministratore. Non lo trascrivo perché è banale.
Conclusione
Lo script e il database, scaricabili in una cartella compressa [download],
sono da considerare una base minima da ampliare ed arricchire, già sufficienti però per attrezzare il nostro sito di un accessorio utile.