Modificare FormMail 1.92
- Regolare il fuso orario.
- Mettere sotto controllo nuovi campi
- Mail al mittente di conferma e ringraziamento
- Settaggio accurato dell'array @recipients
Ho già detto molte volte che FormMail è uno degli migliori script nel suo campo. Ciò però non toglie che anch'esso come tutte le umane cose è migliorabile e personalizzabile. Questa pagina del tutorial è dedicata a chi si vuole cimentare nella modifica del codice sorgente di questo script. Non si tratta certamente di un'attività difficile, però richiede un minimo di dimestichezza o la consapevolezza di dovere passare delle notti insonni alla ricerca della parentesi o virgola perduta.
Questo script per concessione del buon Matt è liberamente modificabile ed utilizzabile in tale veste.
I numeri di riga citati si riferiscono alla versione da me tradotta e scaricabile in questo stesso sito. Le modifiche suggerite sono ovviamente applicabili anche alla versione originale, ma potrebbe non esserci corrispondenza nella numerazione delle righe.
Le modifiche sono fattibili tramite "Blocco note di Windows" , ma il mio consiglio spassionato è di usare editor specifici.
Regolare il fuso orario
FormMail genera una data/ora che compare sia nella pagina di ringraziamento che nella mail che ti arriva. Ovviamente siccome la data/ora è prodotta dal server, molto probabilmente non corrisponde a quella del paese di interesse del sito. Per capirci, se il server è in California e il sito è italiano, il server sarà indietro di 8 ore.
Fortunatamente è possibile ovviare a quasto piccolo problema tramite il seguente intervento:
Inserire alla riga 56, sotto l'array @valid_ENV la seguente variabile.
$fuso = '8';Si imposta la variabile in cui si inserirà il numero delle ore di differenza del fuso orario del server (ad esempio '8'). Se il paese dov'è il server ha il fuso orario in avanti rispetto all'Italia allora la cifra dovrà essere negativa (ad esempio '-8').
Inserire alla riga 103, sotto la stringa "sub get_date {" la seguente istruzione:
$num_sec = $fuso * 3600;Si traduno le ore in secondi.
Modificare la stringa alla riga 112:
($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time))[0,1,2,3,4,5,6];
nel modo seguente:
($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time + $num_sec))[0,1,2,3,4,5,6];
Si modifica l'ora generata dal server. Il meccanismo si basa sul fatto che la funzione "time" restituisce il numero di secondi trascorsi dal 01/01/1970, questo numero viene "tradotto" in giorni, mesi, anni dalla funzione "localtime". Risulta chiaro quindi che modificando opportunamente il dato passato da "time" a "localtime" si ottiene il settaggio del fuso orario spostando in avanti o indietro il tempo effettivo.
Mettere sotto controllo nuovi campi
FormMail acquisisce ed elabora anche dei campi form ulteriori a quelli previsti di default, compresi campi "radio", "select", "check". Però sui questi campi non può operare alcuni controlli, per cui per esempio non possono essere ordinati alfabeticamente. Insomma si perdono molte utility.
E' però possibile inserire gli eventuali campi diversi da quelli di default che ci necessitano in una lista e, quindi, porli sotto il controllo dello script.
Iniziamo le operazioni osservando l'hash %Config posto alla riga 124.
%Config = ('recipient','', 'subject','',
'email','', 'realname','',
'redirect','', 'bgcolor','',
'background','', 'link_color','',
'vlink_color','', 'text_color','',
'alink_color','', 'title','',
'sort','', 'print_config','',
'required','', 'env_report','',
'return_link_title','', 'return_link_url','',
'print_blank_fields','',
'missing_fields_redirect','');
Un hash in PERL è una lista di valori associati in coppie key-value (chiave-valore). La capacità di usare gli hash è assolutamente strategica per il PERL, infatti si tratta di strutture logiche estremamente solide e che consentono moltissime manipolazioni. Nel nostro caso tutte le chiavi sono associate a valori nulli:
| chiavi | valori | ||
| %Config = ( | 'recipient' | '' | |
| 'subject' | '' | ||
| ...... | '' | ); |
e questa struttura --- 'chiave','', --- deve essere mantenuta anche nelle nostre aggiunte.
Se ad esempio inseriamo nella pagina html i seguenti campi "radio" e "text":
Ti piace questo sito? molto:<input type="radio" name="scelta" value="molto"> poco:<input type="radio" name="scelta" value="poco"> per nulla:<input type="radio" name="scelta" value="nulla"> Nazione: <input type="text" name="nazione" size="40" maxlength="80" value="Italia">
e vogliamo porli sotto il controllo di FormMail, modificheremo l'hash come segue:
%Config = ('recipient','', 'subject','',
'email','', 'realname','',
'redirect','', 'bgcolor','',
'background','', 'link_color','',
'vlink_color','', 'text_color','',
'alink_color','', 'title','',
'sort','', 'print_config','',
'required','', 'env_report','',
'return_link_title','', 'return_link_url','',
'print_blank_fields','',
'missing_fields_redirect','',
'scelta','', 'nazione','');
Si faccia attenzione al fatto che devono essere usati "apici" singoli, tra un elemento e l'altro vi deve essere una "," e la lista va chiusa con ");"
Fatto ciò potremo dichiarare i campi "scelta" e "nazione" obbligatori, farli ordinare alfabeticamente, eccetera.
Mail al mittente di conferma e ringraziamento
Una delle carenze più avvertite di FormMail ` l'assenza della possibilità di fare avere al mittente una mail di conferma e ringraziamento, ma fortunatamente anche a questo c'è rimedio.
Per prima cosa dichiara "required" il campo email, poi inserisci nel form della pagina html i seguenti campi:
<input type="checkbox" name="mail_conf"> <input type="hidden" name="ogg_mail_conf" value="Grazie per avermi scritto"> <input type="hidden" name="testo_mail_conf" value="Ti ringrazio per avermi scritto, e ti confermo l'invio della mail.">
Il primo serve a consentire la scelta se ricevere o meno la conferma al mittente. Il secondo a settare il testo dell'oggetto della mail di conferma. Il terzo a settare il testo dell'intestazione della mail di conferma.
Poi crea una nuova subroutine sotto la subroutine &send_mail;, inserendo questo codice:
# E-Mail di conferma
if ($Config{'mail_conf'}) {
&send_mail_conf;
}
A questo punto integra l'hash %Config nella seguente maniera:
%Config = ('recipient','', 'subject','',
'email','', 'realname','',
'redirect','', 'bgcolor','',
'background','', 'link_color','',
'vlink_color','', 'text_color','',
'alink_color','', 'title','',
'sort','', 'print_config','',
'required','', 'env_report','',
'return_link_title','', 'return_link_url','',
'print_blank_fields','',
'missing_fields_redirect','',
'mail_conf','', 'ogg_mail_conf','',
'testo_mail_conf','');
Infine inserisci la subroutine send_mail_conf dopo le istruzioni:
close (MAIL);
}
Qui inserisci il seguente codice:
sub send_mail_conf {
# Localize variables used in this subroutine.
local($print_config,$key,$sort_order,$sorted_field,
$env_report);
# Open The Mail Program
open(MAIL,"|$mailprog");
print MAIL "To: $Config{'email'}\n";
print MAIL "From: $Config{'recipient'}\n";
# Check for Message Subject
if ($Config{'ogg_mail_conf'}) {
print MAIL "Subject: $Config{'ogg_mail_conf'}\n\n";
}
else {
print MAIL "Subject: Conferma e ringraziamenti.\n\n";
}
# check per il testo del messaggio.
if ($Config{'testo_mail_conf'}) {
print MAIL "$Config{'testo_mail_conf'}\n\n";
}
else {
print MAIL "Ti ringrazio per il messaggio e ti confermo
l'invio\n\n";
}
print MAIL "Contenuto del messaggio che hai inviato
a $Config{'recipient'} il $date\n";
print MAIL "-" x 75 . "\n\n";
if (@Print_Config) {
foreach $print_config (@Print_Config) {
if ($Config{$print_config}) {
print MAIL "$print_config:
$Config{$print_config}\n\n";
}
}
}
# If a sort order is specified, sort the form fields
# based on that.
if ($Config{'sort'} =~ /^order:.*,.*/) {
# Remove extraneous line breaks and spaces,
# remove the order:
# directive and split the sort fields into an array.
local $sort_order = $Config{'sort'};
$sort_order =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$sort_order =~ s/(\s+)?\n+(\s+)?//g;
$sort_order =~ s/order://;
@sorted_fields = split(/,/, $sort_order);
# For each sorted field, if it has a value or the
# print blank
# fields option is turned on print the form field
# and value.
foreach $sorted_field (@sorted_fields) {
if ($Config{'print_blank_fields'} ||
$Form{$sorted_field} ne '') {
print MAIL "$sorted_field:
$Form{$sorted_field}\n\n";
}
}
}
# Otherwise, print fields in order they were sent or
# alphabetically.
else {
# Sort alphabetically if specified:
if ($Config{'sort'} eq 'alphabetic') {
@Field_Order = sort @Field_Order;
}
# For each form field, if it has a value or the
# print blank
# fields option is turned on print the form
# field and value.
foreach $field (@Field_Order) {
if ($Config{'print_blank_fields'} ||
$Form{$field} ne '') {
print MAIL "$field: $Form{$field}\n\n";
}
}
}
close (MAIL);
}
Fatto ciò quando il visitatore seleziona la checkbox ed inserisce un indirizzo email valido riceverà una copia della mail di conferma e ringraziamento.
Settaggio accurato dell'array @recipients
Come detto nella pagina principale di questo tutorial, la versione 1.92 presenta la novità del settaggio dell'array @recipients. Tramite questa novità si puà impedire radicalmente qualunque uso fraudolento di questo script da parte di spammers. Il controllo si basa su un confronto tra gli indirizzi email contenuti nel tag "recipient" (vedi settaggio opzioni), e quelli indicati nell'array @recipients.
Sono stati visti i due metodi principali di settaggio dell'array @recipients, cioè equiparandolo all'array @referers, oppure settando un indirizzo specifico. Nel primo caso otteniamo che sarranno fruibili solo gli indirizzi mail appartenenti al dominio del sito che ospita lo script, nel secondo che le mail potranno essere inviate solo all'indirizzo specifico.
Si tratta dei due sistemi più semplici, ma che potrebbero non soddisfare le esigenze di tutti. Infatti FormMail è nato per servire una pluralità di siti, centinaia di siti, che avranno domini diversi da quello che ospita lo script, o utenti che intendono ricevere le mail ad indirizzi diversi da quello di default. Fortunatamente FormMail consente un settaggio molto elastico e preciso dell'array @recipients.
Come i lettori più attenti avranno notato, negli esempi riportati nella pagina principale di questo tutorial, quando ho fatto l'esempio dell'uso di un indirizzo specifico:
@recipients = ( &fill_recipients(@referers), '^webmaster@ciccio\.com', '^ciccio@tiscalinet\.it' );
ho riportato gli indirizzi preceduti dal segno " ^ ", e con una "\" prima del ".", questo perchè FormMail utilizza le RE (espressioni regolari) per verificare la corrispondenza, ed il segno " ^ " posto all'inizio sta a significare che la stringa deve iniziare esattamente come indicato, senza possibilità di aggiungere caratteri. Invece la "\" che precede il "." serve ad indicare che il "." deve essere inteso proprio come tale, e non come un qualunque carattere, come altrimenti verrebbe interpretato dalla espressione regolare.
A questo punto il passo successivo è semplice. Tramite le espressioni regolari possiamo adeguare il contenuto dell'array alle nostre esigenze. Ad esempio:
Se dobbiamo consentire l'invio anche a tutti gli indirizzi email di un dominio diverso da quello su cui è istallato lo script:
@recipients = (@referers,'@ciccio.com');
Da notare che @referers è stato scritto senza '', infatti va inteso come variabile e non come indirizzo.
Se dobbiamo aggiungere tutti gli indirizzi di vari sottodomini appartenenti ad un dominio principale:
@recipients = ( &fill_recipients(@referers), '@ciccio\.com', '@\w+\.maria\.com' );
E così via, gli esempi potrebbero essere infiniti, come sono infinite le possibilità delle RE del PERL.
| Indice del sito |
