Newsgroup: it.comp.appl.access
Titolo: [Sviluppo]Invio E-mail con MSMAPI32...bellissimo

Questo ennesimo lavoro sull'invio di e-mail da applicativi Access vuole 
aggiungere un'altra possibilità alle altre già offerte sul sitocomune.
Questa volta ho voluto usare MSMAPI32.ocx un controllo free che si può anche 
scaricare dalla rete, per esempio da qui:
http://www.afreeocx.com/ocx/info/msmapi32_ocx.html
Grazie a questo controllo è possibile inviare e-mail a destinatari multipli 
(anche in cc o Bcc) e allegati singoli o multipli.
Il file di esempio che è possibile scaricare da qui:
http://www.frantoiogestione.com/MailSendWithMSMAPI32.zip
contiene due maschere, una per l'invio semplice di e-mail con o senza 
allegato e una per l'invio complesso con possibilità di molti allegati e 
molti destinatari.
Per la ricerca dei file da allegare ho usato due tecniche, presenti entrambe 
nel db: il classico ocx comdlg32.ocx e le API.
Ho preferito non usare gli array per i destinatari multipli ma mi sono 
appoggiato a tabelle temporanee.
Ricordo che per i destinatari multipli bisogna usare il punto e virgola (;) 
come separazione, senza spazi).
Con lo stesso controllo si può implementare un vero e proprio client di 
posta elettronica e tutto in Access...ma questo sarà materia per un prossimo 
lavoro o affidato alla buona volontà di qualcuno.
Note tecniche.
Cose da fare qualora l'ocx non sia già presente nella cartella di sistema.
Scarica l'ocx msmapi32.ocx.
http://www.afreeocx.com/ocx/info/msmapi32_ocx.html
e inseriscilo in c:\windows\system32.
Se ci sono problemi con la registrazione, che normalmente si fa da Start 
Esegui regsvr32 MSMAPI32.ocx,
oppure da un errore all'apertura del db, apri notepad e scrivi questo:
[HKEY_CLASSES_ROOT\Licenses\899B3E80-6AC6-11cf-8ADB-00AA00C00905]
@ = "wjsjjjlqmjpjrjjjvpqqkqmqukypoqjquoun"
esattamente come è scritto (puoi fare il copia e incolla delle due righe).
Salva il file con il nome MSMAPI.SRG e mettilo nella cartella di 
c:\windows\system32.
Con un doppio clic lo esequi e anche l'errore sulla licenza dovrebbe andare 
a posto.
Si tratta di un bug riconosciuto da Microsoft e documentato.
Il tutto va fatto a programma (EmailOEXP.mdb) chiuso.
Anche l'ocx comdlg32.ocx dovrebbe essere presente nella cartella system32.
Qualora così non fosse in allegato trovi tale controllo che va copiato e 
registrato dalla cartella di sistema. (regsvr32 commdlg32.ocx)
Attendo commenti e suggerimenti.
Ciao, Carlo
P.S.
Prego Roberto, a suo giudizio, di inserire il lavoro nel SitoComune...

 Prego Roberto, a suo giudizio, di inserire il lavoro nel SitoComune...
Ciao Carlo.
L'ocx in questione è un Wrapper che MS rende libero, ma si appoggia
alle librerie
MAPI che possono essere gestite tramite codice normalmente dichiarando
MAPI
dopo aver inserito nei Riferimenti, oppure con LateBinding....!
L'uso di un OCX forse potrebbe essere superfluo per la necessità di
installazione, mentre MAPI(Lib) sono già installate...!
Forse mi sono perso un pezzo...?
Dai un'occhiata a questo demo se hai tempo:
http://www.alessandrobaraldi.it/DettaglioFaq.asp?IdFAQ=248
@Alex

 ha scritto nel messaggio 
news:1171019410.3...@v45g2000cwv.googlegroups.com...
cut
L'ocx in questione è un Wrapper che MS rende libero, ma si appoggia
alle librerie
MAPI che possono essere gestite tramite codice normalmente dichiarando
MAPI
dopo aver inserito nei Riferimenti, oppure con LateBinding....!
L'uso di un OCX forse potrebbe essere superfluo per la necessità di
installazione, mentre MAPI(Lib) sono già installate...!
Forse mi sono perso un pezzo...?
Dai un'occhiata a questo demo se hai tempo:
http://www.alessandrobaraldi.it/DettaglioFaq.asp?IdFAQ=248
@Alex
----------------------------
Ciao Alex, non ti sei perso niente e il tuo programma è certamente valido.
Questo ocx rende la vita molto più semplice e senza scrivere molto codice, 
almeno nella sua forma minimale.
Nei giorni scorsi ho avuto un contatto privato con un frequentatore del NG 
che aveva urgenza di scrivere qualcosa per inviare e-mail con allegati. Da 
lì è nata la cosa.
Effettivamente con l'ocx MSMAPI32 bastano quattro righe e un riferimento.
Non c'è nemmeno la necessità di inserire l'ocx nella maschera...
Diciamo che è molto semplice da usare.
Ciao; Carlo

 Prego Roberto, a suo giudizio, di inserire il lavoro nel SitoComune...
Carlo, ma anche il pop3?
-- 
-- 
Massimiliano Amendola
www.accessgroup.it
Cisa - Conferenza Italiana Sviluppatori Access

 Carlo, ma anche il pop3?
Ti piacerebbe..... ha detto Client non server....!!
;-)
@Alex


:-(


 Ciao; Carlo
Non è mio, ho solo recuperato una classe fatta da altri e messa nel
Demo...!
Quello che non capisco è che il codice che serve per usare la classe
"Dovrebbe" essere lo stesso per l'OCX in quanto la logica è quella...!
Le 4 righe che accennavi non prevedono certo la validazione della
Mail, o del formato testo... quindi anche con la Classe nel mio demo
se rimuovi tutti i controlli e l'automazione di gestione del mezzo
grafico lo riduci a 4 righe.... se passi le stringhe
già formattate dal ";" come dicevi sia dei destinatari che degli
allegati sono proprio 4 righe...!
Per questo non riuscivo(e non riesco) a capire dove stava(stà) il
vantaggio...!
Boh...
@Alex


Certamente!
La procedura prevede o l'uso di nome utente e password scritte nel codice o 
facendo comparire la maschera per l'immissione.
Con questo ocx puoi creare un client completamente sovrapponibile a OE. 
Lettura, invio, forwanding, allegati ecc..
Senza nessun altro codice che questo puoi inviare un'email:
MAPISession1.SignOn
MAPIMessages1.SessionID = MAPISession1.SessionID
MAPIMessages1.Compose
MAPIMessages1.RecipAddress = 
TuoCo...@dominio.com
MAPIMessages1.MsgSubject = "Questo mi piace proprio"
MAPIMessages1.MsgNoteText = "Poco codice per i niubbi e non solo."
MAPIMessages1.Send False
MAPISession1.SignOff
Ciao, Carlo 

 ha scritto nel messaggio 
news:1171023594.1...@s48g2000cws.googlegroups.com...
[CUT]
Non è mio, ho solo recuperato una classe fatta da altri e messa nel
Demo...!
Quello che non capisco è che il codice che serve per usare la classe
"Dovrebbe" essere lo stesso per l'OCX in quanto la logica è quella...!
Le 4 righe che accennavi non prevedono certo la validazione della
Mail, o del formato testo... quindi anche con la Classe nel mio demo
se rimuovi tutti i controlli e l'automazione di gestione del mezzo
grafico lo riduci a 4 righe.... se passi le stringhe
già formattate dal ";" come dicevi sia dei destinatari che degli
allegati sono proprio 4 righe...!
Per questo non riuscivo(e non riesco) a capire dove stava(stà) il
vantaggio...!
Boh...
@Alex
Senza la classe clsMAPISendMail non potresti usarlo....
Comunque mi sono divertito e scoperto una strada diversa.
Ciao, Carlo

 Ciao, Carlo
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

 Ciao, Carlo
Ehm intendeva POP3, quindi un Server per ricevere, questo è SMTP
o Client.
;-)



L'ocx è stato inserito solo a fini didattici. Non è indispensabile è 
sufficiente il riferimento.
Per fare una prova basta togliere i due ocx (MM e MS) dalla maschera 
MInviaEmail. Il tutto funziona alla grande ugualmente.
Nella maschera MInviaEmailSemplice è stato invece usato il riferimento 
diretto ai due ocx, ma se ne poteva fare a meno.
In pratica si possono usare le due strade: inserire gli ocx oppure farvi 
solo riferimento.
L'utilizzatore della demo potrà optare per l'una o l'altra soluzione. 
Concordo sul fatto che è preferibile una soluzione senza ocx...
La classe diventa perfettamente inutile...anzi, nella soluzione da me 
proposta, avrebbe generato un errore.
Ciao, Carlo 

 @Alex (Alessandro Baraldi)
Esattamente. Con MSMAPI32 puoi scaricare tutta la posta che vuoi e da tutti 
gli indirizzi del gestore predefinito di posta elettronica.
E' chiaro che si connette al server Pop3 predefinito (p.e. 
in.virgilio.it
) 
cosě come si connette al server SMTP (p.e. 
out.virgilio.it
) per l'invio.
Esattamente come fa OE.
I server della posta si trovano o si possono trovare a molte centinaia di 
km!
Qui si parla di ricevere e inviare posta.
Non credo MA si riferisse a creare un server pop3...ma con MA non si č 
sicuri di nulla!
Ciao, Carlo 

 ha scritto nel messaggio
news:eqhj90$7h3$1...@tdi.cu.mi.it...



Ciao e grazie per i complimenti...fanno sempre bene!
Visto che sei nuovo del NG ti informo subito che eventuali risposte vanno 
scritte alla fine del messaggio...come faccio ora io e non in testa. Si 
possono tagliare (cut) quelle parti che non sono interessanti per la 
risposta.
Per quanto riguarda il tuo quesito, l'unica strada che ho trovato 
praticabile è quella di usare .send True al posto di .send False.
Questo apre il messaggio come tu lo hai composto ma ti permette di scegliere 
con quale account inviare il tutto.
Secondo le specifiche indicate da MSDN le cose avrebbero dovuto funzionare 
diversamente nel senso che dovrebbe bastare indicare lo user per ottenere il 
risultato desiderato...purtroppo dalle mie prove così non è stato.
Così avrebbe dovuto funzionare:
With mapi_session
.NewSession = True
.DownLoadMail = False
.LogonUI = True
.UserName = "NomeAccount"
.SignOn
End With
Di fatto non funziona, forse a causa della mia ignoranza.
Se c'è qualcuno che ha voglia di trovare una soluzione si faccia avanti.
Ciao, Carlo 

 ha scritto nel messaggio 
news:tXmzh.4764$h_1.1...@twister1.libero.it...
cut
Dimenticavo che prima di spedire l'email si puň benissimo impostare 
l'account di default su quello desiderato, aggirando cosě l'ostacolo.
Ciao, Carlo 

 Ciao, Carlo
    Dim i As Long
    MAPISession1.UserName = "MyName"
    MAPISession1.Password = "MyPassword"
    MAPISession1.DownLoadMail = True
    MAPISession1.SignOn
    MAPIMessages1.SessionID = MAPISession1.SessionID
    MAPIMessages1.Fetch
    MsgBox "You have " & MAPIMessages1.MsgCount & _
           " messages in your inbox!"
    If MAPIMessages1.MsgCount > 0 Then
        For i = 0 To MAPIMessages1.MsgCount - 1
            MAPIMessages1.MsgIndex = i
            List1.AddItem "From:" & MAPIMessages1.MsgOrigDisplayName &
_
                         " Subject:" & MAPIMessages1.MsgSubject
        Next
    End If
    MAPISession1.SignOff
Provate una cosa simile mettendo su Load di Form il codice e mettendo
una ListBox
con 2 colonne....!
Non ho provato perchè stò ancora leggendo il tutto ma questo dovrebbe
funzionare
per scaricare gli Header delle Mail in Cassetta.
@Alex

 ha scritto nel messaggio 
news:1171199796.4...@m58g2000cwm.googlegroups.com...


    MAPISession1.DownLoadMail = True
    MAPISession1.SignOn




@Alex
------------------------------
Sì Alex va benissimo ma non è quello che chiedeva.
Qui mostri un sistema per scaricare i messaggi per un determinato 
account...dovrebbe essere così anche per inviare il messaggio con un 
determinato account...ma purtroppo non funziona.
Per esempio:
With mapi_session
.NewSession = True
.DownLoadMail = False
.LogonUI = True
.UserName = "NomeAccount"
.SignOn
End With
L'account di invio è sempre il predefinito.
Ciao, Carlo

 Ciao, Carlo
Scusa non avevo capito..., o meglio avevo capito in relazione alla
ricezione...!
In ogni caso se non ho capitomale, quelli che definite come Dati di
Login, sono i dati di LOGIN al SERVER SMTP e normalmente non
influiscono con l'utente che invia la mail, ma servono solo per
autenticarsi al Server nel caso sia obbligatorio...!
http://vb-helper.com/howto_vba_email_mapi.html
@Alex

 Ciao, Carlo
Scusa non avevo capito..., o meglio avevo capito in relazione alla
ricezione...!
In ogni caso se non ho capitomale, quelli che definite come Dati di
Login, sono i dati di LOGIN al SERVER SMTP e normalmente non
influiscono con l'utente che invia la mail, ma servono solo per
autenticarsi al Server nel caso sia obbligatorio...!
http://vb-helper.com/howto_vba_email_mapi.html
Ciao a tutti,
avevo trovato anch'io questo link, ma una cosa che non mi spiego č perchč
sono remmate proprio le righe relative alla indicazione dell'Utente:
    With mapi_session
        .LogonUI = False
        ' Fill in username and password
        ' if necessary on this mail server.
        '.username = "username"
        '.password = "password"
        .SignOn
    End With
La riga        '.username = "username"
se funzionasse sarebbe perfetta per indicare un Utente Mittente diverso a
seconda della scelta dell'Operatore.
Ci deve essere perň un modo per capire come mai non funziona.
Cmq grazie per l'interessamento.
Saluti.
RP

 ha scritto nel messaggio 
news:1171222227....@v33g2000cwv.googlegroups.com...
[CUT]
Scusa non avevo capito..., o meglio avevo capito in relazione alla
ricezione...!
In ogni caso se non ho capito male, quelli che definite come Dati di
Login, sono i dati di LOGIN al SERVER SMTP e normalmente non
influiscono con l'utente che invia la mail, ma servono solo per
autenticarsi al Server nel caso sia obbligatorio...!
http://vb-helper.com/howto_vba_email_mapi.html
@Alex
--------------------------
No, user e password vengono usati in entrambi i casi: invio e/o ricezione.
La proprietà LogonUi si associa a user e password per determinare o meno 
l'apertura di una finestra di dialogo ed è dipendente da NewSession.
Comunque credo di aver scoperto l'arcano andando a leggere la guida 
MAPI98.CHM che si trova in c:\Windows\Help.
In pratica il tutto funziona se si usa Office Outlook o Exchange. Qui 
infatti è possibile stabilire dei profili da usare per inviare o leggere i 
messaggi. Però la guida non è chiara quando dice che se si usa OO o Ex. lo 
user diventa il profilo e non è necessaria la password...lasciando intendere 
la possibilità di usare user e password anche in OE. Probabilmente si 
riferisce ad altri programmi di posta...
Questi profili possono essere letti o aggiunti da pannello di 
controllo...posta elettronica.
In poche parole sembrerebbe che con OE, l'unico modo per decidere chi deve 
essere il mittente è quello di impostare a send true l'invio del messaggio.
Ciao, Carlo


Ho capito. Beh, mi sembra di capire che non ci sia altro modo.
Pazienza.
Cmq. grazie di tutto.
Buona giornata.
RP