Newsgroup: it.comp.appl.access
Titolo: Gestire account mail con access

Salve a tutti, ho trovato su post precedent i metodi per l'invio di messaggi 
di posta tramite VBA.
Ho pero' l'esigenza di scaricare tramite VBA i messaggi di posta per 
archiviarli nella mia tabella...
Sapreste darmi qualche suggerimento in tal senso?
 
Grazie a tutti in anticipo.
Marco67
 
 
 

 Sapreste darmi qualche suggerimento in tal senso?
 
Si, come no. Ho scritto questa routine per lavoro e funziona che
e'  una bellezza, pero' la devi adattare : 
Public Sub Legge_Mails()
 
     On Error GoTo ERRORE
 
     Dim OTLK          As Outlook.Application
     Dim Mail          As Outlook.MailItem
     Dim Session       As Outlook.Namespace
     Dim Folder        As Outlook.MAPIFolder
     Dim Max_Mails     As Long
     Dim Allegati      As New ADODB.Recordset
     Dim POSTA         As New ADODB.Recordset
     Dim Mittente      As String
     Dim Oggetto       As String
     Dim Anomalie      As String
     Dim M             As Long
     Dim A             As Long
     Dim Allegato      As String
     Dim N_Allegati    As Long
     Dim S             As Form
' ------------- routine -----------------------------------------------------------------------------------
 
Set OTLK = GetObject(, "outlook.application")
Set Session = OTLK.Session
Set Folder = Session.GetDefaultFolder(olFolderInbox)
Set S = G_Sys_Stato.Sentinella
 
If Folder.Items.Count = 0 Then Set Folder = Nothing: Set Session = Nothing: Exit Sub
 
Max_Mails = 10
 
POSTA.LockType = adLockOptimistic:    POSTA.CursorType = adOpenStatic:       POSTA.CursorLocation = adUseClient
Allegati.LockType = adLockOptimistic: Allegati.CursorLocation = adUseClient: Allegati.CursorType = adOpenStatic
 
POSTA.Open "select * from posta_in where 1=0;", G_Sys_Stato.CN_LS
Allegati.Open "select * from allegati_in where 1=0;", G_Sys_Stato.CN_LS
 
If Max_Mails > Folder.Items.Count Then Max_Mails = Folder.Items.Count
 
For M = Max_Mails To 1 Step -1
 
  Set Mail = Folder.Items(M)
 
  ' controllo già letta
  If Not Mail.UnRead Then GoTo Skip_Mail
 
  Mail.UnRead = False
  'controllo esistenza indirizzo
  Mittente = Trim(Mail.SenderEmailAddress)
  G_Indirizzi.MoveFirst
  G_Indirizzi.Find "indirizzo_='" & Mittente & "'"
  If G_Indirizzi.EOF Then GoTo Skip_Mail
 
  ' controllo indirizzo esterno : in questo caso nel corpo deve essere presente la password
  ' e deve essere inserita ALL' INIZIO del corpo della mail
 
  If Not IsNull(G_Indirizzi.Fields("esterno_").Value) Then
     If G_Indirizzi.Fields("esterno_").Value Then
        If Not (InStr(Mail.Body, G_Password) = 1) Then Anomalie = "indirizzo esterno ma password mancante.;"
     End If
  End If
 
  'controllo esistenza funzione
  Oggetto = Trim(Replace(Mail.Subject, " ", ""))
  G_Funzioni.MoveFirst
  G_Funzioni.Find "funzione_='" & Oggetto & "'"
 
  If (G_Funzioni.EOF) Then Anomalie = Anomalie & "funzione non esistente.;"
 
  ' controllo funzione benformata
  Anomalie = Anomalie & Richiesta_Ben_Formata(Mail.Subject, Mail.Body)
 
  'controllo abilitazione indirizzo -> funzione
  G_Indirizzi_Funzioni.MoveFirst
  G_Indirizzi_Funzioni.Find "indirizzo_='" & Mittente & "'"
  If G_Indirizzi_Funzioni.EOF Then
     Anomalie = Anomalie & "indirizzo non esistente nelle abilitazioni.;"
  Else
     If IsNull(G_Indirizzi_Funzioni.Fields("abilitato_").Value) Then
        Anomalie = Anomalie & "indirizzo esistente nelle abilitazioni ma non abilitato alla funzione.;"
     Else
        If Not (G_Indirizzi_Funzioni.Fields("abilitato_").Value) Then
           Anomalie = Anomalie & "indirizzo esistente nelle abilitazioni ma non abilitato alla funzione.;"
        End If
     End If
  End If
 
  K = "{" & Kiave() & "}"
 
  POSTA.AddNew
 
     POSTA.Fields("kiave_").Value = K
     POSTA.Fields("numero_allegati_").Value = Mail.Attachments.Count
     POSTA.Fields("cc_nascosti_").Value = Mail.Bcc
     POSTA.Fields("corpo_").Value = Mail.Body
     POSTA.Fields("cc_").Value = Mail.CC
     POSTA.Fields("id_").Value = Mail.EntryID
     POSTA.Fields("oggetto_").Value = Oggetto
     POSTA.Fields("mittente_").Value = Mittente
     POSTA.Fields("dt_ricezione_").Value = Mail.ReceivedTime
     POSTA.Fields("elaborata_").Value = False
     POSTA.Fields("Anomalie_").Value = Anomalie
  POSTA.Update
  DoEvents
 
  ' registra e salva tutti gli allegati (solo se non sono state riscontrate anomalie)
 
  N_Allegati = Mail.Attachments.Count
 
  If (N_Allegati > 0) And (Anomalie = "") Then
     KK = K
     For A = 1 To N_Allegati
         Allegato = G_ALLEGATI_IN & KK & Mail.Attachments.Item(i).FileName
         Allegati.AddNew
            Allegati("Kiave_").Value = KK: Allegati("Kiave_Posta_").Value = K: Allegati("Nome_").Value = Allegato
         Allegati.Update
         Mail.Attachments.Item(i).SaveAsFile Allegato
         DoEvents
         KK = "{" & Kiave() & "}"
     Next A
  End If
Skip_Mail:
  Anomalie = ""
Next M
 
Allegati.Close: Set Allegati = Nothing: POSTA.Close: Set POSTA = Nothing: DoEvents
Exit Sub
ERRORE:
Select Case Err.Number
   Case 429 ' outlook chiuso
        S.Sentinella.stato_outlook_.Value = "Chiuso": S.Refresh: DoEvents: Exit Sub
   Case Else
        GoTo Skip_Mail
End Select
 
End Sub

 Sapreste darmi qualche suggerimento in tal senso?
 
Ho una procedura VBA (Office 2013) che, definito quanto segue:
 
OutlookAccount = "
xxxxx...@gmail.com
"
Data_Ini = #12/1/2014# ' mm/dd/yyyy
Data_Fin = Date        ' mm/dd/yyyy
SaveIn = "D:\Outlook_Attachments\"
MailTable = "t_Outlook_MailReceived"
AttachmentTable = "t_Outlook_Attachments"
 
con riferimento al periodo Data_Ini - Data_Fin:
1 - salva i campi di Outlook relativi alla posta nella
    tabella MailTable assegnando un IdMail AutoNumber
2 - salva nella tabella collegata AttachmentTable
    il nome del file "attaccato"
3 - salva nella directory SaveIn detto file col
    suo nome preceduto dall'IdMail che deriva
    da MainTable
 
Se t'interessa batti un colpo.
Bruno

 ha scritto nel messaggio 
news:86241375-0eae-4998...@googlegroups.com...

***
Ti ringrazio molto, mi sono dimenticato di scrivere stavo cercando qualcosa 
che mi permettesse di lavorare indipendentemente da un client di posta 
(Outlook o altro...)
e' comunque sicuramente un bel progetto, vedo di implementarlo nel mio 
sistema: in ogni caso fara' il lavoro che mi serve.
 
Grazie ancora
 
 
 

 ha scritto nel messaggio 
news:m96dkh$6ro$1...@speranza.aioe.org...

Si Bruno, grazie 1000, certo che mi interessa, anche se mi sono dimenticato 
di scrivere che stavo cercando qualcosa che mi permettesse di lavorare 
indipendentemente da un client di posta (Outlook o altro...)
Se pero' Outlook e' l'unica soluzione percorribile o meglio 'consigliata', 
ti chiedo di fornirmi ulteriori dettagli,  mi farebbe piacere.
 
Grazie ancora
 
 

Marco67 formulated on Thursday :

I dettagli te li ho già forniti...
Se intendi il codice, si tratta di un foglio A4 (50-60 righe);
però dovrei anche definirti campi e relazioni delle due tabelle
che accolgono Received Mail + Attachments.
Sto anche facendo alcune modifiche per comprendere tutti gli
account aperti in Outlook e includervi Sent Mail + Attachments.
 
In un paio di giorni dovrei aver finito (ci lavoro di notte
perché il giorno... dormo).
Se vuoi posso inviarti il file (Access 2013) a lavoro ultimato.
 
Bruno

 ha scritto nel messaggio 
news:m98e0o$h8n$1...@speranza.aioe.org...

Beh, Bruno... non so che dire: grazie infinite!
 
 

 Beh, Bruno... non so che dire: grazie infinite!
 
https://www.dropbox.com/s/ym5vm60wmonjf3r/OutlookBackups.accdb?dl=0
 
 
Dovrai sostituire alcuni dati dei tuoi account nel codice
del pulsante "Backup Sent Mail...".
Se necessario, ma non credo, anche nel codice di "Backup
Received Mail..."
 
Waiting for bugs report.
 
Bruno

 ha scritto nel messaggio 
news:m9e5l5$crn$1...@speranza.aioe.org...

Grazie 1000 Bruno, l'ho scaricato e tra oggi e domani lo provo, cosi' ti 
aggiorno.
A presto e ancora Grazie
Marco67 
 
 

 client di posta (Outlook o altro...)
 
Scusa solo ora mi sono accorto di questa tua.
 
Si puo' fare, ma non ti da tutte le commodities di Outlook ma forse
a te non servono.
 
Vedi qua, e' spiegato bene : 
http://www.rondebruin.nl/win/s1/cdo.htm
 
 
Lascia perdere che il sistema lavora dentro excel, e' indifferente 
perche' quello e' vba che usa librerie CDO quindi quelle linee di 
codice che vedi le puoi trasportare tranquillamente in un progetto
Access.
 
Cmq ho visto che Bruno ormai deve aver soddisfatto la tua richiesta
in modo eccellente e completo (come fa sempre lui).
 
In ogni caso guarda il link, potrebbe comunque servirti non si sa 
mai.
 
Ciao

 ha scritto nel messaggio 
news:m9e5l5$crn$1...@speranza.aioe.org...

Ecomi Bruno, allora ho provato a lavorarci.
Ho impostato un nuovo (ed uno solo) account di posta su Outlook (io uso 
O.2007 ed ho chiaramente referenziato la libr. Office Outllok 12 anziche' la 
15 com'era nel tuo progetto).
 
Proprio come mi hai segnalati nel codice, sia per l'acquisizione della posta 
in entrata che in uscita, ricevo il messaggio di errore: 'Impossibile 
trovare un oggetto' su questa istruzione:
Set arrMail(2, k) = Session.Folders(CStr(i)).Folders("Inbox")
 
Considera che la variabile 'i' dell'insieme OlAccounts corrisponde 
perfettamente all'account di posta memorizzato
 
In un primo momento ho pensato che il problema fosse la reale posizione 
delle rispettive cartelle all'interno dell'account.
 
Entrando direttamente in outlook ho trovato che la posizione e': Cartelle 
Personali\Posta in arrivo
Quindi ho provato in vari modi a ridefinire il percorso, ma senza risultato, 
come a dd esempio:
Set arrMail(2, k) = Session.Folders(CStr(i)).Folders("Cartelle 
Personali\Posta in arrivo")
 
.
A questo punto, non vorrei il problema riguardasse l'istruzione A2013, non 
riconoscita su A2007 ???
 
Che ne pensi??
 
 
 

Marco67 explained on 21-01-15 :

Prova così:
 Set arrMail(2, k) = Session.Folders(CStr(i)).Folders("Cartelle
 Personali").Folders("Posta in arrivo")
 
.Folders("...") si riferisce a una Dir specifica,
non a un path più o meno completo.
 
Bruno

 ha scritto nel messaggio 
news:c8763ae2-79e0-4955...@googlegroups.com...

Grazie 1000 davvero, in effetti avevo trovato qualcosa del genere, solo che 
si parla sempre e comunque di 'invio posta' e non di 'ricezione'.
Avevo infatti bisogno di acquisire le mail impostando i parametri 
dell'account assieme al server pop, potendo quindi popolare una mia tabella 
access del contenuto di ogni mail in arrivo.
 
In effetti, sto provando con la procedura che mi ha fornito gentilmente 
Bruno, anche se in questo modo sono obbligato ad installare e configurare un 
Account e referenziare la giusta libreria di collegamento in Access su ogni 
postazione utilizzata.
 
Se conosci l'esistenza di esempi sullai ricevezione di posta senza l'adozioe 
di alcun client installato, mi faresti un gran favore se mi dai il 
riferimento o un link...
Grazie ancora in ogni caso.
Marco67 
 
 

 'ricezione'.
 
Ho capito
 
Per la ricezione devi studiare per bene questo link : 
https://emailarchitect.net/eagetmail/kb/vb.aspx
 
 
devi primariamente installare sul tuo PC il componente EAGetMail 
indicato nel link
 
fammi sapere
 
 
 
 

 ha scritto nel messaggio 
news:d6012c92-e295-43f0...@googlegroups.com...

Perfetto direi, ho installato il componente e dopo l'impostazione del mio 
account, scarica tranquillamente le mail.
Direi che e' proprio quello che cercavo.
 
Una cosa, nei vari link del sito, ho trovato anche una guida per 
registrazione un file manifest, che a quanto ho capito mi permetterebbe di 
non dover fare installare sul pc dell'utente, ma basterebbe salvare questo 
file con lo stesso nome del progetto ed il tutto dovrebbe funzionare!?
Ecco il link
https://www.emailarchitect.net/eagetmail/sdk/?ct=object_reg_a
 
 
Forse perche' il progetto di cui parla, non e' un eseguibile .exe ma un .mde 
??
Che ne pensi?
In ogni caso, direi perfetto, e ancora un grazie infinite!
Marco67 
 
 

 Che ne pensi?
 
E' la prima volta che vedo  una cosa  simile per cui perdonami ma la 
prudenza impone di non allargarmi troppo. 
 
Quello che posso dire e' che una *installazione* in senso classico e' 
concettualmente separabile in due fasi distinte : 
 
- copia sul pc dei vari files (ovviamente)
- registrazione. Ossia scrivere  nel  file *registro* (che e' un file 
  di testo particolare ad uso esclusivo del sistema operativo) alcune 
  informazioni sui files  copiati. 
 
  Con la registrazione in realta' tu rendi "noto" al sistema operativo
  che c'e' questa nuova applicazione, dove si  trova  ecc ecc.  Questo
  perche' quando tu "apri" l'applicazione  in  realta'  tu  CHIEDI  al 
  sistema operativo di caricarla in memoria  indi il sistema operativo 
  deve avere tutte le info necessarie per fare  questa  attivita'  (in 
  realta' abbastanza delicata).
 
Ora, quel link non mi pare (dico :  non mi PARE) che spieghi bene come
funzionerebbe invece questo meccanismo della semplice copia PERO' vedo
che fornisce un bel po' di info all' SO, in ogni caso. 
 
Non saprei. Mi dispiace. 
 

 ha scritto nel messaggio 
news:a343bd81-a472-44d7...@googlegroups.com...

**
Si, in effetti la sensazione di 'esagerata semplificazione' di questo metodo 
per aggirare l'installazione del componente... mi ha suggerito di chiederti 
'sta cosa.
In ogi caso vado avanti, ti aggiornero' su cio' che 'scopro'.
Grazie ancora
 
 

 Grazie ancora
 
Grazie a te !