Newsgroup: it.comp.lang.visual-basic
Titolo: [?] MAPI e MsOutlook

Quanto segue (spero di aver estratto correttamente) è quanto uso per inviare
mail con allegati via VB+MAPI. Funziona perfettamente con OutlookExpress, ma
se il gestore di posta sottostante è MsOutlook (io non lo conosco, ma
funziona regolarmente spedendo mail dalla sua interfaccia), no, nel senso
che non mi segnala errori, ma non mi mette la mail in nessuna cartella, nè,
ovviamente, me la spedisce. Nel caso specifico trattasi di una mail con un
solo allegato, esistente.
Riuscite a vedere qualcosa che possa giustificare il comportamento anomalo?
Potrebbe essere quel "If controllo_mapi_sessione.NewSession Then GoTo esce"
iniziale?
Grazie.
Sub EMAIL_COMPONI_X(controllo_mapi_sessione As Object,
controllo_mapi_messaggi As Object, Optional email_destinatario = "",
Optional oggetto = "", Optional messaggio = "", Optional
percorso_allegato_passato = "", Optional nome_allegato_passato = "")
'   percorso_allegato_passato   Se sono previsti piu' files da allegare,
'                               ogni file allegato deve essere separato
'                               dal precedente dal carattere "¿"
'   nome_allegato_passato       Se sono previsti piu' files da allegare,
'                               ogni file allegato puo' avere un nome
diverso
'                               dal nome del file originario/fisico indicato
in
'                               percorso_file_allegato. Il nome specifico
puo'
'                               essere specificato in questo parametro.
'                               Se sono previsti piu' allegati ed e'
previsto
'                               anche un solo nome specifico, allora tutti i
nomi
'                               dovranno essere specificati, ciascuno
separato
'                               dal precedente dal carattere "¿"
'                               Il nome puo' anche essere non indicato, ma
il segno
'                               di separazione ("¿") resta obbligatorio
    On Error GoTo errore
'       CONNESSIONE
'------------------
'       Se la connessione/sessione e' gia' avvenuta restituisce segnale
    If controllo_mapi_sessione.NewSession Then GoTo esce
'       Imposta la proprietà DownLoadMail su False per evitare lo
scaricamento immediato.
    controllo_mapi_sessione.DownLoadMail = 0
'       Utilizza l'interfaccia utente di accesso del sistema di
messaggistica sottostante.
    controllo_mapi_sessione.LogonUI = 1
'       Imposta la proprietà NewSession
    controllo_mapi_sessione.NewSession = 1
    controllo_mapi_sessione.SignOn     'Tenta la connessione    '011002
    controllo_mapi_messaggi.SessionID = controllo_mapi_sessione.SessionID
'       COMPONE LA MAIL
'----------------------
    On Error GoTo errore_mail
    controllo_mapi_messaggi.Compose
    controllo_mapi_messaggi.RecipAddress = email_destinatario
    controllo_mapi_messaggi.MsgSubject = oggetto
    controllo_mapi_messaggi.MsgNoteText = messaggio
    If percorso_allegato_passato <> "" Then
        percorso_allegato = percorso_allegato_passato
        nome_allegato = nome_allegato_passato
        posizione_allegato = -1
        Do
            If percorso_allegato = "" Then Exit Do
            comodo = InStr(percorso_allegato, "¿")
            If comodo = 0 Then comodo = Len(percorso_allegato) + 1
            file_allegato = left(percorso_allegato, comodo - 1)
            percorso_allegato = Mid(percorso_allegato, comodo + 1)
            comodo = InStr(nome_allegato, "¿")
            If comodo = 0 Then comodo = Len(nome_allegato) + 1
            nome_file_allegato = left(nome_allegato, comodo - 1)
            nome_allegato = Mid(nome_allegato, comodo + 1)
'               Indicato un allegato
            If Dir(file_allegato) <> "" Then
                posizione_allegato = posizione_allegato + 1
                controllo_mapi_messaggi.AttachmentIndex = posizione_allegato
                controllo_mapi_messaggi.AttachmentPathName = file_allegato
                If nome_file_allegato <> "" Then
                    controllo_mapi_messaggi.AttachmentName =
nome_file_allegato
                End If
            End If
        Loop
    End If
    controllo_mapi_messaggi.Send True
ripristina:
    On Error GoTo errore
'       DISCONNESSIONE
'---------------------
    On Error Resume Next    'Per sessione gia' disconnessa
    controllo_mapi_sessione.SignOff
    controllo_mapi_sessione.NewSession = 0
    On Error GoTo errore
esce:
    Exit Sub
errore_mail:
    Resume ripristina
errore:
    Stop
End Sub

 Then GoTo esce" iniziale?
Innanzitutto non ti segnala errori perchè sei infarcito di On Error, ma in
realtà un errore lo genera.
Poi, per provare ho dovuto dimensionare diverse variabili. Non capisco come
faccia a funzionare, a meno che tu abbia omesso 'Option Explicit'.
Il .Send genera un errore non definito.
Devi aggiungere:
    controllo_mapi_messaggi.RecipDisplayName = email_destinatario
dopo il compose.
Ciao
Alberto
PS: la tua sub mi ricorda qualcosa...

 PS: la tua sub mi ricorda qualcosa...
Ora mi incuriosisci, spiattella! ;-)

 Ora mi incuriosisci, spiattella! ;-)
http://makeashorterlink.com/?Z589224E7
Ciao
Alberto
-- 
Santo cielo, Magnum, si può sapere cos'è questo baccano?
Higgins, posso spiegarle...
Credo non sia necessario.
Zeus, Apollo, a voi...

 
http://makeashorterlink.com/?Z589224E7
Ah, sì! In effetti nella mia "estrazione" ho tolto tutta la parte per il
recupero delle identità, assegnazione di nuova identità e mail mittente, e
ripristino finale. Ehm... provato e funzionante con OE, mai provato con
MsOutlook.

 mai provato con MsOutlook.
Rileggendo il topic ... mi sento un po' a disagio perchè avevo promesso un
post. Chiedo venia e cerco di rimediare ora.
Ecco la mia Sub completa (ripeto mai provata con MsOutlook per identità e
mittente, se qualcuno la vuol provare..., ma ok per OE)
Alcune funzioni che richiamo e che non pubblico ... fanno quel che dicono,
si tratta di bypassarle o crearne un surrogato. Le varie REG_... sono
funzioni per leggere/scrivere chiavi nel registro (si veda ad esempio il
MailOD di CSSoft, ma se serve pubblico, sono un po').
T_ESCOM_PREFERENZE!OPZIONI rappresenta una serie di opzioni ambientali e
OPZS una Function che le testa.
Sub EMAIL_COMPONI(controllo_mapi_sessione As Object, controllo_mapi_messaggi
As Object, Optional email_destinatario = "", Optional oggetto = "", Optional
messaggio = "", Optional parametri = 0, Optional percorso_allegato_passato =
"", Optional nome_allegato_passato = "", Optional identita_mittente = "",
Optional email_mittente = "")
'   parametri   2^0 Spedisci senza intervento dell'operatore
'                   E' necessario che tutti i dati siano passati:
'                       email_destinatario  (obbligatorio <>"")
'                       oggetto             (anche "")
'                       messaggio           (anche "")
'               2^1 Non esegue connessione
'               2^2 Non esegue disconnessione
'               2^3 Non ripristina l'identita' precedente
'               2^4 Non ripristina l'account   precedente
'               2^5 Eventuali allegati con estensione .BMP
'                       generano un file con stesso nome,
'                       ma con estensione (e struttura) .JPG
'                       e verra' allegato quest'ultimo.
'   percorso_allegato_passato   Se sono previsti piu' files da allegare,
'                               ogni file allegato deve essere separato
'                               dal precedente dal carattere "¿"
'   nome_allegato_passato       Se sono previsti piu' files da allegare,
'                               ogni file allegato puo' avere un nome
diverso
'                               dal nome del file originario/fisico indicato
in
'                               percorso_file_allegato. Il nome specifico
puo'
'                               essere specificato in questo parametro.
'                               Se sono previsti piu' allegati ed e'
previsto
'                               anche un solo nome specifico, allora tutti i
nomi
'                               dovranno essere specificati, ciascuno
separato
'                               dal precedente dal carattere "¿"
'                               Il nome puo' anche essere non indicato, ma
il segno
'                               di separazione ("¿") resta obbligatorio
'
'   identita_mittente           Se non passata ("") o uguale all'identita'
corrente
'                               non si cambia identita', viceversa si cambia
e alla
'                               fine si rispristina la corrente (vedi 2^3)
    On Error GoTo errore
    Dim id_elenco() As String
    ripristinare_identita = 0
    ripristinare_account = 0
    If (parametri And 2 ^ 1) = 0 Then
'           CONNESSIONE
'------------------------------------------
'           Se la connessione/sessione e' gia' avvenuta restituisce segnale
        If controllo_mapi_sessione.NewSession Then GoTo esce
        gestore_posta = REG_LEGGE_VALORE(HKEY_LOCAL_MACHINE,
"Software\Clients\Mail", "", REG_SZ)
        Select Case UCase(gestore_posta)
            Case "OUTLOOK EXPRESS"
            Case "MICROSOFT OUTLOOK"
                If OPZS(T_ESCOM_PREFERENZE!opzioni, 98) = 0 Then GoTo
prepara_sessione
            Case Else
                GoTo prepara_sessione
        End Select
'           Salva info identita' corrente
        nome_identita_corrente = REG_LEGGE_VALORE(HKEY_CURRENT_USER,
"Identities", "Last Username", REG_SZ)
        id_identita_corrente = REG_LEGGE_VALORE(HKEY_CURRENT_USER,
"Identities", "Last User ID", REG_SZ)
        id_identita_mittente = id_identita_corrente
        If identita_mittente <> "" Then
'               Verifica se l'identità desiderata per il mittente (account
predefinito della stessa)
'               e' la stessa corrente
            If nome_identita_corrente <> identita_mittente Then
'                   Cerca identita' richiesta (se non la trova genera
errore!) e suo ID
                id_elenco() = REG_ELENCO_CHIAVI(HKEY_CURRENT_USER,
"Identities")
                Do
                    For comodo = LBound(id_elenco) To UBound(id_elenco)
                        If REG_LEGGE_VALORE(HKEY_CURRENT_USER, "Identities\"
& id_elenco(comodo), "Username", REG_SZ) = identita_mittente Then
                            id_identita_mittente = id_elenco(comodo)
                            Exit Do
                        End If
                    Next comodo
                    Call F_ERRORE(0, "Nome identità non trovato=" &
identita_mittente, ncar)
                    Exit Sub
                Loop
'                   Registra chiavi per nuova identita'
                ripristinare_identita = 1
                Call REG_ASSEGNA_VALORE(HKEY_CURRENT_USER, "Identities",
"Last Username", REG_SZ, identita_mittente)
                Call REG_ASSEGNA_VALORE(HKEY_CURRENT_USER, "Identities",
"Last User ID", REG_SZ, id_identita_mittente)
            End If
        End If
        If email_mittente <> "" Then
'               Salva l'id dell'account predefinito per l'identita' corrente
(uguale o diversa dalla precedente)
'               E' quello che dovra' in ogni caso ripristinare alla fine
            Dim chiave_accounts_identita_mittente As String
            'Dim id_identita_mittente As String
            chiave_accounts_identita_mittente =
EMAIL_RICAVA_CHIAVE_ACCOUNTS_IDENTITA(id_identita_mittente)
            id_default_mail_account_mittente =
REG_LEGGE_VALORE(HKEY_CURRENT_USER, chiave_accounts_identita_mittente,
"Default Mail Account", REG_SZ)
'               Cerca ora l'account con SMTP Email Address uguale
all'indicato
'               Ora carica l'elenco degli accounts
'               (solo quelli di posta in uscita, cioe' quelli che hanno il
valore "SMTP Email Address" <> "")
            id_mail_account_mittente = ""
            id_elenco() = REG_ELENCO_CHIAVI(HKEY_CURRENT_USER,
chiave_accounts_identita_mittente & "\Accounts")
            For i = LBound(id_elenco) To UBound(id_elenco)
                smtp_email_address = REG_LEGGE_VALORE(HKEY_CURRENT_USER,
chiave_accounts_identita_mittente & "\Accounts\" & id_elenco(i), "SMTP Email
Address", REG_SZ)
                If smtp_email_address = email_mittente Then
                    id_mail_account_mittente = id_elenco(i)
                    Exit For
                End If
            Next i
            If id_mail_account_mittente = "" Then
                Call F_ERRORE(0, "Account " & email_mittente & " non trovato
nell'identità=" & identita_mittente, ncar)
                Exit Sub
            End If
'               In ogni caso posiziona l'account mittente desiderato come
predefinito
'               (anche se l'identita' mittente non e' cambiata, per
consentire, in ogni caso,
'               di decidere il mittente, non necessariamente il predefinito,
anche con una sola identita')
            ripristinare_account = 1
            Call REG_ASSEGNA_VALORE(HKEY_CURRENT_USER,
chiave_accounts_identita_mittente, "Default Mail Account", REG_SZ,
id_mail_account_mittente)
        End If
prepara_sessione:
'           Imposta la proprietà DownLoadMail su False per evitare lo
scaricamento immediato.
        controllo_mapi_sessione.DownLoadMail = 0
'           Utilizza l'interfaccia utente di accesso del sistema di
messaggistica sottostante.
        controllo_mapi_sessione.LogonUI = 1
'           controllo_mapi_sessione.SignOn     'Tenta la connessione    'Era
qui sino al 011002
'           Imposta la proprietà NewSession
        controllo_mapi_sessione.NewSession = 1
        controllo_mapi_sessione.SignOn     'Tenta la connessione    '011002
        controllo_mapi_messaggi.SessionID =
controllo_mapi_sessione.SessionID
    End If
    If (parametri And 2 ^ 0) Then
        If email_destinatario = "" Then
'               Destinatario non definito - Forza l'intervento
dell'operatore
            parametri = parametri - (parametri And 2 ^ 0)
        End If
    End If
'       COMPONE LA MAIL
'----------------------
    On Error GoTo errore_mail
    controllo_mapi_messaggi.Compose
    controllo_mapi_messaggi.RecipAddress = email_destinatario
    '310304-INIZIO
    If OPZS(T_ESCOM_PREFERENZE!opzioni, 176) = 0 Then
        controllo_mapi_messaggi.RecipIndex = 0
        controllo_mapi_messaggi.RecipDisplayName = email_destinatario
    End If
    '310304-FINE
    controllo_mapi_messaggi.MsgSubject = oggetto
    controllo_mapi_messaggi.MsgNoteText = messaggio
    If percorso_allegato_passato <> "" Then
        percorso_allegato = percorso_allegato_passato
        nome_allegato = nome_allegato_passato
        posizione_allegato = -1
        Do
            If percorso_allegato = "" Then Exit Do
            comodo = InStr(percorso_allegato, "¿")
            If comodo = 0 Then comodo = Len(percorso_allegato) + 1
            file_allegato = Left(percorso_allegato, comodo - 1)
            percorso_allegato = Mid(percorso_allegato, comodo + 1)
            comodo = InStr(nome_allegato, "¿")
            If comodo = 0 Then comodo = Len(nome_allegato) + 1
            nome_file_allegato = Left(nome_allegato, comodo - 1)
            nome_allegato = Mid(nome_allegato, comodo + 1)
'               Indicato un allegato
            If ESISTE_FILE(file_allegato) Then
                If (parametri And 2 ^ 5) Then
                    If Right(UCase(file_allegato), 4) = ".BMP" Then
'                           E' un .BMP - Genera il .JPG corrispondente e
allega questo
                        comodo = RICAVA_JPG_DA_BMP(file_allegato,
file_allegato_jpg, IIf(OPZS(T_ESCOM_PREFERENZE!opzioni, 169), 2 ^ 0, 0))
                        If comodo Then Call F_ERRORE(0, "RICAVA_JPG_DA_BMP
cod." & comodo)
                        file_allegato = file_allegato_jpg
                        nome_file_allegato = Left(nome_file_allegato,
Len(nome_file_allegato) - 4) & ".JPG"
                    End If
                End If
                posizione_allegato = posizione_allegato + 1
                controllo_mapi_messaggi.AttachmentIndex = posizione_allegato
                controllo_mapi_messaggi.AttachmentPathName = file_allegato
                If nome_file_allegato <> "" Then
                    controllo_mapi_messaggi.AttachmentName =
nome_file_allegato
                'Else
                '    Call RICAVA_DDF(file_allegato, Drive, cartella, nf)
                '    controllo_mapi_messaggi.AttachmentName = nf
                End If
            End If
        Loop
    End If
    controllo_mapi_messaggi.Send IIf(parametri And 2 ^ 0, False, True)
ripristina:
    On Error GoTo errore
    If (parametri And 2 ^ 3) = 0 Then
'           Se deve, rispristina l'identita' precedente
        If ripristinare_identita Then
'               Ripristina le chiavi per la precedente identita'
            Call REG_ASSEGNA_VALORE(HKEY_CURRENT_USER, "Identities", "Last
Username", REG_SZ, nome_identita_corrente)
            Call REG_ASSEGNA_VALORE(HKEY_CURRENT_USER, "Identities", "Last
User ID", REG_SZ, id_identita_corrente)
        End If
    End If
    If (parametri And 2 ^ 4) = 0 Then
'           Se deve, rispristina l'account precedente
        If ripristinare_account Then
            Call REG_ASSEGNA_VALORE(HKEY_CURRENT_USER,
chiave_accounts_identita_mittente, "Default Mail Account", REG_SZ,
id_default_mail_account_mittente) 'mittente! E' corretto!
        End If
    End If
    If (parametri And 2 ^ 2) = 0 Then
'       DISCONNESSIONE
'--------------------------------------------
        On Error Resume Next    'Per sessione gia' disconnessa
        controllo_mapi_sessione.SignOff
        controllo_mapi_sessione.NewSession = 0
        On Error GoTo errore
    End If
esce:
    Exit Sub
errore_mail:
    Resume ripristina
errore:
    Call F_ERRORE(Err)
End Sub
Function EMAIL_RICAVA_CHIAVE_ACCOUNTS_IDENTITA(id_identita) As String
'       Restituisce la chiave relativa agli accounts dell'identita' di cui
viene passato l'ID
'       Restituisce "" se non la trova
    Dim chiave_accounts_identita As String
    EMAIL_RICAVA_CHIAVE_ACCOUNTS_IDENTITA = ""    'Indica non trovata
'       Mette prima la chiave dell'identita' come se NON fosse la prima
creata (quindi CON Identities\id)
    chiave_accounts_identita = "Identities\" & id_identita &
"\Software\Microsoft\Internet Account Manager"
'       Verifica se la chiave esuiste nel registro
    If REG_VERIFICA_ESISTENZA_CHIAVE(HKEY_CURRENT_USER,
chiave_accounts_identita) = 0 Then
'           La chiave non esiste
'           Cerca la chiave dell'identita' come se fosse la prima creata
(quindi SENZA Identities\id)
        chiave_accounts_identita = "Software\Microsoft\Internet Account
Manager"
        If REG_VERIFICA_ESISTENZA_CHIAVE(HKEY_CURRENT_USER,
chiave_accounts_identita) = 0 Then
'               Non ha trovato nemmeno questa - Qualcosa non va!
            Call MsgBox("Non trovo la chiave ...\Software\Microsoft\Internet
Account Manager per l'identità indicata!", vbOKOnly + vbCritical)
            chiave_accounts_identita = ""
        End If
    End If
    EMAIL_RICAVA_CHIAVE_ACCOUNTS_IDENTITA = chiave_accounts_identita
End Function

 Senz'altro, ma forse nel pomeriggio/domattina.
firulì, firulà...
Alberto

 Alberto
Lupo :-P :-P (collezione mai vista di linguacce)

 Ehhhh, "sifula"... (cremonensis)
Ok, ora va.
C'erano, per MsO, tre errori (assolutamente ininfluenti per MsOE):
I primi due, da te indicati, ovvero:
        controllo_mapi_messaggi.RecipIndex = 0
        controllo_mapi_messaggi.RecipDisplayName = email_destinatario
e, in presenza di allegati, subito dopo l'assegnazione di AttachmentIndex:
        controllo_mapi_messaggi.AttachmentPosition = posizione_allegato
Grazie di tutto.


[Lupo = 
circa_LupoOrm...@libero.it
 in
c4hk80$2ib49p$
1...@ID-174464.news.uni-berlin.de
] ha scritto:
Approposito, ... ho scopiazzato anche da qui:
http://makeashorterlink.com/?V510259E7
Domani, se riesco a creare una diversa identità (profilo?) provo anche, con
MsO, con il cambio di identità e mittente "al volo"...

 
http://makeashorterlink.com/?V510259E7
Ehm..., anche col mio codice, con MsOutlook, non va un tubo!
Si provi a fare una mail con testo vuoto "" e con almeno due allegati o
(suggerimento) anche con un testo pari a "ABC" e con un allegato.
La soluzione alla prossima puntata. Intanto il trailer dice "BEVONO!!!"