La gestione della posta elettronica da Visual FoxPro

(medio)

Articolo di Ernest Morariu - Torino, 21/05/2001 ©

Questo articolo descrive come utilizzare la classe POSTA che ho costruito per facilitare la gestione di posta elettronica da Visual FoxPro. La classe Posta è un container che contiene gli oggetti di altre due classi: MAPIMessages e MAPISession. Tutte le classi sono contenute nella libreria scaricabile da questo sito:MAPI.VCX.

Descrizione della classe:

La spedizione o il prelievo della posta elettronica presuppone, prima di tutto, l'apertura di una sessione con il client MAPI presente sul sistema.

Il metodo OpenSession() ha questo compito. Tuttavia i metodi ScaricaEmail() e MandaEmail() sono costruiti in modo che, se non trovano una sessione aperta, prima di eseguire il loro compito (inviare o scaricare), aprono in modo implicito una sessione. Quindi non c'è bisogno di preoccuparsi di questo problema.

Invece ci dovremo preoccupare di chiudere la sessione, poiché, la chiusura della sessione si fa solamente in modo esplicito, usando il metodo CloseSession(). E' consigliabile chiudere la sessione solo quando sono terminate le operazioni con la posta, altrimenti si mantengono occupate inutilmente le risorse di sistema.

Nota:


Se si usa un client MAPI che consente di definire i profili e le password, allora ci sono due possibilità:

oppure

La proprieta' cDownloadOnLogon e' una stringa che :

Nota: Una volta che la sessione è aperta è inutile cambiare il valore di questa proprietà. Si deve chiudere e riaprire la sessione per poter scaricare dal server POP3.

La proprietà cSoloNonLette: se ha il valore "SI"(implicito) farà in modo che il metodo ScaricaEmail() scarichi solo le e-mail non ancora lette (quelle che, ad esempio "Outlook Express" mostra in grassetto)

La proprietà lElimina e' di tipo logico. Il valore .T. significa che le e-mail che si scaricano vengono anche eliminate dalla cartella "Posta in arrivo".

Le proprietà cFiltroDa sono di tipo carattere e possono contenere delle stringhe che rappresentano filtri per la posta da scaricare. Se sono vuote si scarica tutta la posta.

Il metodo ScaricaEmail() usa il metodo VerificaFiltro() per filtrare. E' possibile modificare questo metodo se desiderate filtri più complessi.

Per specificare le espressioni filtro, si può fare uso degli operatori di tipo AND, OR e !(NOT) . Le parentesi sono considerate testo.

Esempi di filtri: (mi ispiro alle recenti e-mail che sono arrivate nella mailinglist foxteam)

cFiltroDa="fredaannibale@iol.it"
cFiltroDa="franco and !caloni" && solo quelle che vengono da franco(felosi), quelle da "Franco Caloni" no :-)) .
cFiltroOggetto="La fatidica prima domanda and !re:" && le email, che contengono nell'oggetto la stringa "la fatidica prima domanda", ma non contengono la stringa "re:", quindi verrà scaricata solo la domanda che Allessandro ha fatto e non le risposte.

cFiltroContenuto="Pippo or Raffaella" && solo le e-mail che contengono sia "pippo" oppure "Raffaella"

cFiltroContenuto="Roberto and Loris and !bruno" && solo le e-mail il cui contenuto contiene la stringa "roberto" e la stringa "loris", ma non contiene la stringa "bruno".

Se tutte le proprietà cFiltroDa,cFiltroOggetto,cFiltroContenuto contengono espressioni, allora l'email viene scaricata se soddisfa contemporaneamente tutte le condizioni.

Le espressioni specificate per i filtri SONO "CASE NON SENSITIVE", cioè, non importa se sono scritte in maiuscolo oppure in minuscolo.

Il metodo ScaricaPosta() ha un parametro opzionale:
ScaricaPosta
Parameters cNomeTabella

Potrebbe essere chiamato con il nome di una tabella. Se la tabella non esiste, la crea, e poi la riempie con le e-mail scaricate. Se la tabella esiste, aggiunge le e-mail che si scaricano (non cancella le precedenti e-mail presente nella tabella). Se questo metodo viene chiamato senza parametri, allora la posta viene scaricata in una tabella con il nome implicito PostaScaricata.DBF nella cartella corrente.

Nella tabella e' presente il campo "VISTO" che vi consente di gestire le e-mail vecchie e nuove. Ogni volta che viene chiamato, il metodo ScaricaPosta() esso riempie questo campo con il valore "vecchio" per tutti i records. Questo metodo non cambia l'alias corrente della vostra applicazione.

I nomi dei file allegati vengono salvati nel campo "Allegati" che è di tipo memo. Il numero di file allegati viene salvato nel campo "NrAllegati" Potete ricorrere al metodo GetElement(cInsieme,nIndex) per ottenere facilmente il nome di un allegato specifico:

Esempio:

FOR i=1 TOPostaScaricata.NrAllegati
 COPY FILE (oPosta.GetElement(PostaArrivata.Allegati,i)) TO C:\
EENDFOR

oppure

FOR i=1 to PostaScaricata.NrIndiriz
 ?oPosta.GetElement(PostaArrivata.Indirizzi,i)
ENDFOR

Il metodo ScaricaPosta(), scarica le e-mail dalla cartella "Posta in arrivo" nella tabella. Ovviamente se il valore della proprietà cDownloadOnlogon ha il valore "SI", prima di tutto si effettuerà una connessione al server POP3, si scaricherà la posta nella cartella "Posta in arrivo" e poi da lì verrà trasferita nel file dbf.

Lo scaricamento della posta dal server POP3 viene effettuato in modo sincrono e potrebbe richiedere un po' di tempo a seconda di quante e-mail si devono scaricare e a che velocità si è stabilita la connessione.

Il metodo MandaEmail() ha 4 parametri : cpIndirizzi,cSubject, cContenuto,cpAllegati Solo il primo e' obbligatorio. Il loro significato credo sia evidente:
cpIndirizzi:
se vengono specificati più indirizzi e-mail, devono essere separati con il carattere "," oppure ";" .
cSubject: se non e' specificato, ha come valore implicito "."
cpAllegati
: rappresenta i file allegati per la e-mail.
I nomi dei file si devono specificare con il percorso assoluto (anche se si trovano nella cartella corrente). I file multipli si devono separare con il carattere "," oppure ";" .

Il metodo MandaEmail() mette la e-mail nella cartella "Posta in uscita" e nient'altro. Per inviarla automaticamente al server SMTP si può impostare il client MAPI(Outlook Express) in modo che la posta venga inviata periodicamente ad intervalli di tempo specificati, oppure, si in modo che venga inviata immediatamente al server SMTP .

Esempio di utilizzo della classe POSTA:

CLEAR ALL
oForm=CreateObject("form") && e' il solo container che accetta l'oggetto POSTA
*la form può essere visibile o non visibile, all'occorenza
SET CLASSLIB TO MAPI.VCX
oForm.AddObject("oPosta","POSTA")
*non faccio uso qui delle proprietà di default
oForm.oPosta.cDownloadOnLogon="NO"
oForm.oPosta.cSoloNonLette="NO"
oForm.oPosta.lElimina=.f.
oForm.oPosta.cFiltroDA="foxteam" && solo da foxtem
oForm.oPosta.cFiltroOggetto="Aiutissimo!!"
oForm.oPosta.cFiltroContenuto="Loris or freda or roberto"
cFileDbf="C:\PostaArrivata.dbf"
*eventualmente si apre esplicitamente la sessione per un certo profilo e password *oForm.oPosta.OpenSession("Roberto","hjhdsjsdsj")
oForm.oPosta.ScaricaPosta(cFileDBF) && si porta le e-mail dalla casella "Posta in arrivo"
SELECT (JustStem(cFileDbf))
BROWSE
USE IN (JustStem(cFileDbf))
*adesso mandiamo un'e-mail
cIndirizzi="foxteam@foxitaly.com;ernest@eqsantia.com"
cOggetto="Verifiche MAPI"
cContenuto="Qui si fanno delle verifiche della classe POSTA!"+chr(10)+chr(13)+; Sys(0)+" "+dtoc(date()) cAllegati=Home()+"Foxfont.850"+","+home()+"FoxFont.866" && spero che ci siano
oForm.oPosta.MandaEmail(cIndirizzi,cOggetto,cContenuto,cAllegati)
oForm.oPosta.CloseSession()
RELEASE oForm

Suggerimenti, buchi, pugni, palme e tutte le altre cose :-)) -->>ernest@eqsantia.com

© FoxPro e Visual FoxPro sono un marchi registrati da Microsoft Corporation

 



Data: 21/05/2001
webmaster@foxitaly.com

dal 22 Giugno 1999