Nuova procedura di Parsing delle Mail in arrivo tramite AddIn Outlook..
Un AddIn è una libreria che viene agganciata all'applicazione Outlook, (come fa un antivirus, o Adobe Distiller, ecc.) e che sfrutta il modello ad oggetti dell'applicazione.
L'architettura di Outlook è basata su cartelle, all'interno delle quali ci sono oggetti (Item) che interagiscono tra loro o con l'applicazione in funzione del tipo di oggetto rappresentato, es.: un appuntamento dell'agenda risulterà diverso da un messaggio di posta, un messaggio di posta interna è differente da un messaggio di posta ricevuta/inviata.
L'applicazione sviluppata prevede l'installazione su un pc client con installato Outlook.
A seconda di quanto configurato l'applicazione avrà funzionamento Automatico o Semiautomatico:
L'applicazione s'incaricherà di scansionare mail arrivate nella cartella di "Posta in Arrivo" e trattarle in funzione dei "parametri di ingaggio" stabiliti: indirizzo di invio, oggetto della mail, testo contenuto nella mail.
In ragione di questo se la mail soddisferà le regole d'ingaggio stabilite il programma provvederà a lanciare sul sistema gestionale Area l'inserimento di una chiamata di Assist con allegato in galleria la mail stessa.
La differenza tra le due modalità sarà che in quella automatica l'AddIn scansionerà ogni x secondi, in autonomia, le mail arrivate, mentre in quella semiautomatica sarà l'operatore che selezionerà una mail e ne richiederà il trattamento tramite opportuno bottone su Barra degli strumenti personalizzata.
Sarebbe preferibile utilizzare un pc dedicato all'attività.
Il passaggio da una modalità all'altra di funzionamento per ora è previsto solo tramite la chiusura di Outlook, la riconfigurazione dell'AddIn e la riattivazione di Outlook, ma si potrebbe valutare di inserire un apposito bottone nella toolbar presonalizzata.
Nell'attuale modello ad oggetti (basato sul namespace "Microsoft.Office.Interop.Outlook") sono disponibili due eventi che vengono sparati in caso di arrivo di una mail:
1.NewMail: Occurs when one or more new e-mail messages are received in the Inbox.
The NewMail event fires when new messages arrive in the Inbox and before client rule processing occurs. If you want to process items that arrive in the Inbox, consider using the ItemAdd event on the collection of items in the Inbox. The ItemAdd event passes a reference to each item that is added to a folder.
The NewMail event does not fire when the user is in offline mode.
2.ItemAdd: Occurs when one or more items are added to the specified collection. This event does not run when a large number of items are added to the folder at once.
Il problema è che questo evento è "not reliable" perchè se molti elementi vengono aggiunti in blocco, l'evento non viene sparato, dice Dmitry Streblechenko:
"Do not perform any lengthy processing in the event handler - add the entry ids to a list and fire up a timer that will do the actual processing when the ItemAdd event handler is not running. When a large number of items is added/modified/removed, on the MAPI level, TABLE_CHANGED or TABLE_RELOAD event is raised. Outlook Object Model simply ignores that event. You can eaither use Extended MAPI (C++ or Delphi) or <plug> use Redemption - it exposes the RDOItems.CollectionModified event"
Questo significa che l'architettura deve essere basata su uno schema di questo genere: 3 modi alternativi
Modo 1:
a.timer per il loop di base
b.evento newmail/newmailex -> alza booleano di scansione della inBox
c.evento timeout del timer, se il flag è alzato allora scansione della inbox mediante la RDOFolder.
Modo 2:
a.timer per il loop di base
b.evento RDOItems.CollectionModified-> creo una lista di entryID degli Items della collection: occorre stare attenti a questa gestione perchè implica che quando sposto un messaggio come processato la collection si modifica e quindi avrei un evento
c.evento timeout del timer, processo gli elementi della lista.
Modo 3:
a.timer per il loop di base
b.scansione dei messaggi nella cartella inbox di un certo account: scansione di quelli che arrivano da un certo sender e relativo parsing
1.frequenza timer
2.account sul quale scansionare la cartella di posta in arrivo da considerare (se presente più di un account)
3.cartella dei file template di mail (mail_tpt_xxxxxxxxxxxx.txt): il template conterrà 4 paragrafi:
"type"=elenco dei tipi di tag
"sender=" indirizzo di mail da scansionare: 1,+1 (separati da ";"), nessuno = tutti i sender
"subject=" contenuto dell'oggetto della mail
"body=" contenuto del corpo del messaggio
i template conterranno:
testo da matchare <xs:element name="xxx" type="type-xxx" minOccurs="" maxOccurs=""/>
<xs:element name="Riga" type="type-riga" minOccurs="" maxOccurs=""/>
es. se la mail è del tipo
---------------------------------------------------------------------------------------------------
Hello Customer Service,
SPC Connect has logged the following events for your SPC Panel: SPC Connect [9657-9RTK-R49T-53K2]
2015-09-26 23:34:15: TAMPER AUS. 1 Guasto
2015-09-26 23:34:15: TAMPER AUS. 2 Guasto
SPC Connect
Automatic Email Service
This is an automatically generated message. Please do not reply to this message.
---------------------------------------------------------------------------------------------------
il template sarà del tipo:
SPC Connect has logged the following events for your SPC Panel: <xs:element name="SPC-ID" type="spc" minOccurs="1" maxOccurs="1"/>
<xs:element name="RigaEvento" type="evento" minOccurs="1" maxOccurs="N"/>
...
il type sarà:
<xs:complexType name="evento">
<xs:sequence>
<xs:elementname="DataEvento" type="date" minLength="" minLength="" minOccurs="1" maxOccurs="1" anchorStart="" anchorEnd=EOW/>
<xs:elementname="OraEvento" type="time" minLength="" minLength="" minOccurs="1" maxOccurs="1" anchorStart="" anchorEnd=EOW/>
<xs:elementname="Cliente" type="string" minLength="" minLength="" minOccurs="1" maxOccurs="1" anchorStart="Cliente:" anchorEnd="]" purgeChar="[]"/>
<xs:elementname="Matricola" type="numeric" minLength="" minLength="" minOccurs="1" maxOccurs="1" anchorStart="Cliente:[" anchorEnd=EOW/>
<xs:elementname="Impianto" type="string" minLength="" minLength="" minOccurs="1" maxOccurs="1" anchorStart="" anchorEnd=EOW/>
<xs:elementname="FillerLine" type="string" minLength="" minLength="" minOccurs="1" maxOccurs="1" anchorStart="" anchorEnd=EOL/>
<xs:sequence>
</xs:complexType>
<xs:simpleType elementname="spc" type="string" minLength="" minLength="" minOccurs="1" maxOccurs="1" anchorStart="[" anchorEnd="]"/>>
es.
{"tipo-cliente",U,numeric,"codice impianto",offset(1:5),""};
dove
elementname=nome tipo
type=tipo (se semplice sono ammessi "string", "date", "time", "numeric", altrimeni nome di altro tipo
minLenght=lunghezza minima= se "" allora non controllata
maxLenght=lunghezza massima= se "" non importa
minOccurs=numero di occorrenze = se "0" = può essere omesso
maxOccurs=lunghezza massima= se "N" = può essere ripetuto all'infinito
anchorStart=inizio ancoraggio=il carattere, la frase o la parola che identifica l'inizio del valore
anchorEnd=fine ancoraggio=il carattere, la frase o la parola che identifica la fine del valore + i seguenti valori predefiniti EOL=fine linea
EOT=fine testo
EOW=fineparola
EON=fine caratteri numerici [0-9]
EOA=fine caratteri alfabetici [a-zA-Z]
purgeChars=sono eventuali caratteri da eliminare nel valore del campo
4.cartella in cui spostare quelli processati ok
5.cartella in cui spostare quelli processati non ok
6.cartella in cui spostare quelli da non processare (necessaria se Modo 3)
7.riga di comando da lanciare per la creazione della chiamata
"cliente"=identificatifo del cliente
"matricola"=matricola assistita
"data"=data evento
"tipo-evento"=descrizione dell'evento
•Scansione della configurazione e caricamento dei template (in memory)
•gestire una variabile di stato di processo o due variabili di stato bolleane
•attivazione del loop
•gestire come ora un'unica lista di processo, in cui all'evento NewMailEx o RDOItems.CollectionModified vengono eseguiti due step:
oattendo se è attivo lo stato "purge_handling" se non è attiva proseguo
oalzo variabile la stato ad "event_handling" che inibisce lo spurgo da parte del timer
oaggiungo alla lista le mail arrivate
oeventualmente riduco il tempo di timer ad 1 secondo così da processare rapidamente all'uscita dell'evento
•nell'evento timer eseguire:
ocontrollo se non sono in "event_handling", in quel caso alzo variabile "purge_handling" ed eseguo loop di spurgo delle processate controllando sempre di non essere in "event_handling" in quel caso esco subito dal loop di spurgo
oflusso di scansione in uno dei modi descritto sopra
▪se la mail arriva da indirizzo indicato in un template allora elaborazione della mail secondo template secondo la seguente gerarchia:
▪scansione dell'oggetto per quanto riguarda i tag (se non sono presenti tag allora automaticamente soddifatto)
▪scansione del body per quanto riguarda i tag (se non sono presenti tag allora automaticamente soddifatto)
▪se tutti i tag obbligatori sono soddisfatti allora viene:
•salvata la mail per scopo archiviazione
•creato il file pilota diretto al gestionale con i valori dei campi da caricare
•lancia il gestionale per l'inserimento della chiamata se presente la riga di comando nel caso invece il gestionale abbia un demone in ascolto allora passa alla fase successiva
•resta in attesa dell'esito del gestionale ed in funzione di quello sposta la mail nella cartella opportuna
Tempo previsto:
•Gestione configurazione e caricamento: 4 ore
•Flusso di processo: 4 ore
•Motore di scansione tag: 8-12 ore
•Se invece pensiamo di cablare i modelli all'interno del programma allora siamo nell'ordine della 4 ore.
•Interfacciamento gestionale: 1 ore
•Test: 8 ore
•Produzione esempi e documentazione: 8 ore
•Conversione verso .NET: 8-12 ore
Nuova funzione di inserimento chiamata da gestionale partendo da file di testo generato e creazione chiamata da gestionale.
1.leggere file di informazioni da outlook
2.leggere eventuale configurazione (possibile se vogliamo avere parametri diversi da asn110)
3.funzione di inserimento chiamata (asnchtes + astintes) derivata da asn110 o asn053:
campi obbligatori sono: codice cliente, data, descrizione chiamata tutto il resto da caricare da configurazione come su asn110 (attenzione al campo "Avviso a cliente" nel caso sia sulla tipologia "S"=Invio di SMS perchè se non ci sono contatti configurati il campo risulta bloccante)
a.se da asn053 vedi parte x3-creo-chiamate -> x3-999
b.se da asn110 vedi parte da a-fine-dati-ok
4.aggiungere creazione di allegato (la mail che arriva) su "galleria" come descritto nella parte di a-riga-dettaglio-fine per a-operazione = "I"
5.creazione del file di esito
Tempo previsto:
•creazione log: 1 ora
•nuove configurazioni (opzionali) 2 ore (?)
•lettura file informazioni: 2 ore
•inserimento chiamata: 3 ore
•inserimento allegato: 1 ora
•creazione file di esito: 1 ora
•test: 4 ore
•documentazione 2-3 ore