OutlookMailToArea

Navigation:  Office > Outlook >

OutlookMailToArea

Previous pageReturn to chapter overviewNext page

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.

 

 

Funzionamento di Base

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.

 

 

Flusso di precesso

 

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

 

 

Configurazioni

 

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

 

Tag previsti nel template

 

"cliente"=identificatifo del cliente
"matricola"=matricola assistita
"data"=data evento
"tipo-evento"=descrizione dell'evento

 

Implementazioni da fare Lato Outlook

 

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

 

 

Implementazioni da fare Lato Gestionale

 

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