Newsgroup: it.comp.appl.access
Titolo: scegliere l'account per l'invio email da outlook - .SendUsingAccount

Buongiorno a tutti, dopo aver incluso nei riferimenti VBA la libraria Microsoft Outlook 16.0 Object Library, utilizzo questo codice per inviare email da access utilizzando outlook
Il mio problema è che ho 2 account di posta certificata in outlook e vorrei poterne usare uno o l'altro scegliendolo direttamente da VBA per questo scopo ho trovato in internet
.SentOnBehalfOfName che credo imposti solo il nome del mittente, poi ho trovato
 
.SendUsingAccount = oOutlookApp.Session.Accounts.Item(1)
dove fra parentesti si mette il numero dell'account da utilizzare per l'invio della mail
 
il problema è, come faccio a sapere che numero hanno i 2 account?
la numerazione parte da zero come gli array? esiste un modo da vba per far elencare con un msgbox tutti i numeri degli account e rispettiva mail associata?
 
 
grazie a tutti.

Hai provato a stampare il contenuto si Accounts.Item(1)...?
 
@Alex

 Hai provato a stampare il contenuto si Accounts.Item(1)...?
 
Non ti sei sforzato molto! :-)
 
For i = 1 To Session.Accounts.Count
    MsgBox i & " - " & Session.Accounts.Item(i)
Next
 
Ciao
Bruno

 Next
 
Ovvero:
 
For i = 1 To Session.Accounts.Count
    S = S & i & " - " & Session.Accounts.Item(i) & vbCrLf
Next
MsgBox S
 
Bruno

In che senso...?
 
@Alex

 In che senso...?
 
Nel senso che potevi scriverle tu quelle tre righe che ho scritto io.
 
O non ti degni d'impegnarti per così poco?
 
Bruno


perfetto ho provato il codice da voi postato e su un outlook con 1 solo account ho ottenuto 
1 - nomeaccount
 
quindi parte dall'1 e si suppone il secondo aggiunto sia 2
 
grazie a entrambi
 
 

P.s. passando alle cose che invece sono utili da suggerire e non come fare Debug... che lo lasciamo ai maestri, evita di usare l'associazione preventiva inserendo i riferimenti nel progetto, perché se andrai a distribuirlo avrai più rogne che vantaggi.
La tecnica da usare è Latebinding o associazione tardiva.
 
@Alex

Ti avrei tolto 2 piaceri fondamwntali ed importanti se avessi scritto io il codice...
1) quello di farlo tu
2) quello di fare "pollemica"
 
Ora sei più felice invece.
@Alex

@Alex explained on 02-02-19 :

Faccio i salti di gioia!
 
Piuttosto...
Ieri, dopo anni che non ci mettevo mano, volevo modificare del
codice VBA di Outlook (ora da Office 2019), ma è cambiato il
mondo.
Prima se facevo una scansione dei vari Folder ottenevo Inbox,
SentMail, etc. Ora l'elenco dei Folder mi dà l'elenco degli
Accounts. Non sono riuscito a far l'elenco della SentMail.
Una cosa però è cambiata in meglio: il debug ora è simile
a tutto quello di Office.
Prima per Outlook era praticamente inesistente.
Tu ne sai qualcosa?
 
Bruno

Ho ancora Office 2016 quindi non ho ancora avuto modo di aggiornarmi...
Spero di aggiornare per vedere le news di Access... sperando abbiano sistemato i bachi dei nuovi grafici anche se le query Pivot erano le migliori... 
Spero anche in ActiveX seri compatibili con i 64bit.
 
@Alex


ci sono novità importanti nella versione 2019?

mario rossi wrote on 03-02-19 :

Io di Office uso Outlook, Access, Excel e Word soprattutto in
programmazione... delle differenze non ne ho trovate nemmeno
una mezza.
Le Reference interne sono ancora tutte riferite a Office 2016.
 
Bruno


con questo codice ho ottenuto un elenco degli account un messaggio tip
1 - 
mia...@pec.it
 
2 - 
mia...@pec.it
 
 
eppure il codice sotto in cui seleziono .SendUsingAccount non funziona usa sempre quello di default cioè la pec 1, qualcuno sa dirmi il perchè? sbaglio qualcosa?
 
 
    Dim OutlookApp As Outlook.Application
    Dim MItem As Object
    Dim Recipient As String, Subj As String
    Dim Msg As String, Fname As String
 
    On Error Resume Next
    Subj = "Allegato PDF"
 
    Set OutlookApp = New Outlook.Application
    Set MItem = OutlookApp.CreateItem(olMailItem)
    With MItem
            For i = 1 To Session.Accounts.Count
                s = s & i & " - " & Session.Accounts.Item(i) & vbCrLf
            Next
            MsgBox s
    End With
 
    Set OutlookApp = Nothing
 
 
**** il codice qui sotto non seleziona la pec che gli dico ****
 
            'se è è ID 1 usa account outlook 1
            If Forms![miaform]![idazienda] = 2 Then
                .SendUsingAccount = oOutlookApp.Session.Accounts.Item(1)
            'se è ID 2 usa account outlook 2
            ElseIf Forms![miaform]![idazienda] = 1 Then
                .SendUsingAccount = oOutlookApp.Session.Accounts.Item(2)
            End If


C'è un po' di confusione... adattati questo:
================================================
Public Sub SelectOutlookSender()
Dim OutlookApp As New Outlook.Application
Dim mItem As Outlook.MailItem
Dim i As Long, S As String
 
For i = 1 To Session.Accounts.Count
    S = S & i & " - " & Session.Accounts.Item(i) & vbCrLf
Next
MsgBox S
 
Set mItem = OutlookApp.CreateItem(olMailItem)
'mItem.SendUsingAccount = 
Session.Accounts.Item(Forms![miaform]![IDazienda])
mItem.SendUsingAccount = Session.Accounts.Item(2)
MsgBox mItem.SendUsingAccount
 
End Sub
=====================================
 
Bruno


lo provo e poi ti so dire grazie.


Grazie Bruno funziona perfettamente, credo che il mio errore fosse nel tipo della variabile MItem 
 
la mia era Dim MItem As Object
 
mentre la tua corretta è
Dim mItem As Outlook.MailItem


La sua ha i Riferimenti... ma che sia quella corretta... potresti smentirlo alla prima installazione...
 
Non si mettono i Rifeirmenti... quindi si sviluppa senza.
 
@Alex

 Non si mettono i Rifeirmenti... quindi si sviluppa senza.
 
Sarebbe a dire? spiegati con un esempio.
 
Bruno


Forse si riferisssie al late-binding

È vero che sei quello degli esempi... io sono poco portato di slito lascio ad altri... 
I riferimenti vincolano lo sviluppatore. 
 
Vale a dire che se inserisci un riferimento a Lib che poi si rivela non essere la stessa versione del pc di destinazione la Libreria non viene riconosciuta ed il codice fallisce... 
Basta una Major version diversa... Non ricordo se anche la Minor può generare irriconoscibilità... 
Si fatto quando distribuisci un compilato o lo compili sulla macchina di destinazione o rischi. 
Per questo nessun riferimento va inserito...ma serve sviluppare sfruttando l'associazione tardiva dichiarando gli oggetti come Object e sfruttando l'assegnazione con il CreateObjet o GetObject invece di usare l'interfaccia COM esplicita. 
 
Ecco un esempio: 
 
Function OpenEmail() 
 
Dim olApp As Object ' Outlook.Application 
Dim olFolderInbox As Object 
Dim objExplorer As Object 
 
On Error Resume Next 
 
Set olApp = GetObject(, "Outlook.Application") 
 
If olApp Is Nothing Then 
    MsgBox "Outlook is not Open" 
    Set olApp = CreateObject("Outlook.Application") 
End If 
 
Set objExplorer = CreateObject("Outlook.MAPIFolder") 
Set objExplorer = olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) 
.... 
Ecc... 
 
Da tener presente che si perde l'intellisense e l'help ma soprattutto le Costanti di Libreria che vanno ridichiarate come costanti interne al progetto... 
Io uso la formattazione condizionata per questi casi ed in fase di sviluppo uso le librerie mentre in fase di compilazione e distribuzione metto a False una costante che chiamo EarlyBinding ed il compilatore mi prende l'associazione tardiva dopo che ho rimosso il riferimento è così non.tocco il codice. 
 
Spero che sia tutto chiarissimo. 
@Alex 

Ovviamente intendevo Compilazione Condizionata
 
Public Const EarlyBinding=True/False
 
#If EarlyBinding the
  DIM oMSO as Outlook.Application
#Else
  DIM oMSO as Object
  const nomecostante1=1
  Const nomecostabte2=445
  Ecc...
#End if
 
@Alex

 altri... I riferimenti vincolano lo sviluppatore.
[...]
 
Vexata quaestio!
================
Ne abbiamo discusso altre volte, quindi non val la pena
riprendere già esposte considerazioni.
 
Quanto agli esempi... in circostanze come l'attuale sono
molto utili, se ben concepiti, a far comprendere le cose
anche ai non addetti ai lavori, e ciò non è cosa da poco.
 
Come si risolve il problema dell'OP per
altra via proprio non s'è capito, ovvero
io non l'ho capito... senectus ipsa morbus!
 
E di latino per oggi ho finito la dotazione.
 
Ciao
Bruno


Se vuoi parliamo di VBA, il latino mi pare relativamente utile...
 
Cosa non ti è chiaro e cosa possiamo approfondire...?
Fatico a capire in cosa l'esempio postato non è chiaro... se mi aiuti, posso avere qualche possibilità più concreta.
 
Ciao
@Alex

 avere qualche possibilità più concreta.
 
A domanda di mario rossi (perché poi non scriva Mario Rossi lo
sa solo lui) io ho risposto con:
==============================
Public Sub SelectOutlookSender()
Dim OutlookApp As New Outlook.Application
Dim mItem As Outlook.MailItem
Dim i As Long, S As String
 
For i = 1 To Session.Accounts.Count
    S = S & i & " - " & Session.Accounts.Item(i) & vbCrLf
Next
MsgBox S
 
Set mItem = OutlookApp.CreateItem(olMailItem)
'mItem.SendUsingAccount = 
Session.Accounts.Item(Forms![miaform]![IDazienda])
mItem.SendUsingAccount = Session.Accounts.Item(2)
MsgBox mItem.SendUsingAccount
 
End Sub
=====================================
 
Tu hai obiettato: "Non si mettono i Rifeirmenti... quindi
si sviluppa senza."
 
Dai, fammi assaggiare il frutto della tua vigna!
 
Bruno


Lo so bene che sei un "saggio"..., ma il mio rispetto non è per questo... è perchè sei sempre sul pezzo con l'approccio giusto ed è un piacere scambiare "tecnica" con chi ha il medesimo piacere di farlo.
 
Ho preso la tua routine ed ho apportato i concetti del LateBinding, ho messo il commento all'ultima parte, ma basta toglierlo per provarlo tutto, io non ho fatto la maschera, l'ho provato così velocemente.
 
 
Public Function SelectOutlookSender()
    Dim olApp           As Object
    Dim mItem           As Object
    Dim i               As Long
    Dim S               As String
    Const olMailItem    As Integer = 0
 
    On Error Resume Next
 
    Set olApp = GetObject(, "Outlook.Application")
 
    If olApp Is Nothing Then
        Set olApp = CreateObject("Outlook.Application")
    End If
 
    For i = 1 To olApp.Session.Accounts.Count
        S = S & i & " - " & olApp.Session.Accounts.Item(i) & vbCrLf
    Next
    MsgBox S
 
'    Set mItem = olApp.CreateItem(olMailItem)
'    'mItem.SendUsingAccount =
'    olApp.Session.Accounts.Item (Forms![miaform]![IDazienda])
'    mItem.SendUsingAccount = olApp.Session.Accounts.Item(2)
'    MsgBox mItem.SendUsingAccount
    Exit Function
 
End Function
 
 
Ora per provarlo, togli completamente i RIferimenti alle LIB di Microsoft Outlook 16(o quello che hai) e lancialo, otterrai il Messaggio con l'elenco degli Accounts...
Questo codice lo puoi far girare anche su PC con differenti versioni di Outlook, l'importante è che ci sia... ;-)
 
Se vogliamo commentare i passaggi e capire meglio lo facciamo.
 
Ciao
 
@Alex


Questa e' un esempio di una tecnica (la compilazione condizionale) forse 
poco conosciuta ma estremamente utile
Sviluppare con i riferimenti (intellisense+costanti), e rilasciare il 
progetto senza riferimenti (compatibilita' con versioni diverse di Office)
 

 Se vogliamo commentare i passaggi e capire meglio lo facciamo.
Credo di aver capito perfettamente.
 
Sono stato un po' troppo crudel? direi di sì,
ma non volermene.
Cazzo OGGI è il mio compleanno
e non m'hai nemmeno fatti gli auguri!
 
Bruno

 progetto senza riferimenti (compatibilita' con versioni diverse di Office)
 
Quindi se vi mandassi (a te e al tuo compagno di ventura) un
piccolo db (650Kb, Access 2016/2019) contenente, come extra
installazione, queste quattro References:
-- Microsoft Office 16.0 Access database engine Object Library
-- Microsoft XML, v6.0
-- Microft Scripting Runtime
-- Microsoft Office 16.0 Object Library
 
voi sareste in grado di variarne la costituzione,
cosicché potesse funzionare da Access XP ad Access 2048?
Pagando naturalmente!
 
Bruno


Intanto paga, che poi vediamo!
 
Non ho ben capito la critica
Ritieni l'esempio sopra descritto come inutile?
E' chiaro che se vai di Access 2019 e poi late-bindi su una postazione 
che ha Office 2000 e' abbastanza probabile che qualcosa non vada
Ma perche' le librerie richiamate non contengono le funzioni richieste
Non perche' il programma non trova le librerie usate
 
 
 

 e non m'hai nemmeno fatti gli auguri
 
Ciao Bruno
Tantissimi auguri di Buon Compleanno :-)
 
Daniele
 


Ti suggerisco di ripristinare il codice che hai tolto...
 
IN relazione alla COSTANTE
Const oMailItem As Integer = 0
 
NEl tuo codice scrivevi:
Set mItem = olApp.CreateItem(olMailItem) <--- Questa
 
Senza le LIB non viene riconosciuta, quindi o metti esplicitamente 0 o, per comprensione del codice, metti la COSTANTE, cambia nulla ma in ottica di COMPILAZIONE CONDIZIONALE...
 
Hai un po di cose con cui giocare, chissà quanti giocatotli nuovi hai ricevuto oggi...  e non parliamo della torta sotto le CANDELINE...  se la trovi...
 
Buona giornata.
 
(CIAO RAGAZZO... lui sa chi è visto che appare e scompare)
 
@Alex

RobertoA expressed precisely :

Se le librerie non cambiano il late-binding non serve a niente,
se le librerie cambiano ti devi aggiornare e il late-binding
a che è servito?
 
A dir che ti vada bene, penso che la tua applicazione in
late-binding abbia buone probabilità di sopravvivenza
con riferimento ai 3/4 anni che la precedono e la seguono,
poi devi aggiornare.
Tieni anche conto che "buone probabilità" non significa certezza.
 
Conclusione, ognuno si sente felice di giocarsela come crede,
così va il mondo...
 
Bruno

CIDI was thinking very hard :

Grazie Daniele,
apprezzo molto la tua gentilezza!
 
Bruno

Bruno considera che ci sono sviluppatori che distribuiscono il loro prodotto ad una platea più ampia della singola casalinga... le realtà alle quali ci si può interfacciare hanno una varietà di sistemi, e se gli si presenta un prodotto non deve impattare sul resto del sistema o se lo fa deve farlo il meno possibile.
 
Sviluppare applicazioni che espongono meno problematiche di Versione è risparmio di lavoro e non ha controindicazioni.
 
Va da sé che se sviluppi per casa tua fai e brighi come ti pare... ma non è sempre cosi e non tutti hanno piacere rimettere mano alle applicazioni se non serve è soprattutto se si può evitare.
 
Quando hai fatto come ti pare sei sempre a posto.
 
@Alex

 Quando hai fatto come ti pare sei sempre a posto.
Già, così senza dover tenere il conto del tempo e della spesa né
per te né per altri... vassene il tempo l'uom non se n'avvede.
Ma la cosa non ha prezzo.
 
Ciao brigante, alla prossima.
Bruno

Io sono, anzi vorrei essere, un "artista" nel concetto del VBA e la tecnica per me è a prescindere... dal momento che non sono a cottimo ;-)
 
Un caro saluto.
@Alex