Newsgroup: it.comp.appl.access
Titolo: LUNGHETTO Prelevare indirizzi email da tabella

Ciao, ho la necessità di inviare una email ad utenti che potrebbero
avere più indirizzi email ciascuno.
Le email sono memorizzate in una tabella così composta:
idEmail - PK, contatore
idUtente - EK, numerico
Email - testo
in relazione uno-a-molti con tblUtenti per via di idUtente.
Si può avere 
ad.es
.
idEmail - idUtente - Email
1            1        
pr...@email.it
2            1        
pro...@email.it
3            2        
pro...@emai.it
4            1        
pro...@email.it
5            3        
pro...@email.it
e via dicendo. Quindi se 
ad.es
. scorrendo i record mi imbatto
nell'utente idUtente = 1 che ha tre indirizzi email, come posso
scegliere a quale indirizzo email spedire il messaggio?
Ed inoltre c'è un modo per scegliere il client di posta più adatto?
Grazie.
P.S. Ecco la routine che utilizzavo per inviare le email quando
memorizzavo un unico indirizzo di posta nel campo Email della tabella
tblUtenti:
============ frmSchedaPrimoContatto =============
Private Sub cmdMandaEmail_Click()
DoCmd.RunCommand acCmdSaveRecord
If MsgBox("Routine invio email versione Alpha" & Chr(10) & Chr(13) &
"Leggere l'avviso nella maschera 'Invia Email'", vbInformation +
vbOKCancel, "Invio Email") = vbOK Then
    Application.Echo False
    DoCmd.OpenForm "frmInviaEmail", , , , , , Me.idUtente
    Application.Echo True
Else
    Exit Sub
End If
End Sub
============= frmInviaEmail ==============
Option Compare Database
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias
"ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal
lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As
String, ByVal nShowCmd As Long) As Long
Private Sub cmdInviaEmail_Click()
Dim oggetto As String
Dim testo As String
Dim ret As Long
Dim dest As Variant
Const SW_HIDE = 0
txtMail.SetFocus
testo = txtMail.Text
txtOggetto.SetFocus
oggetto = txtOggetto.Text
dest = destinatario()
If Not IsNull(dest) And dest <> "" Then
    ret = ShellExecute(Me.hWnd, "Open", "mailto:" & dest & "?subject="
& oggetto & "&body=" & testo, vbNullString, vbNullString, SW_HIDE)
End If
End Sub
Private Function destinatario()
Dim mail As Variant
Dim selezione As Variant
If Me!tipo_invio.Value = 2 Then
    Me.RecordSource = "SELECT * FROM tblUtenti WHERE not isnull(Email)
And Email <> ''"
    selezione = 1
  Else
    Me.RecordSource = "SELECT * FROM tblUtenti WHERE idUtente = " &
Me.OpenArgs
    mail = DLookup("Email", "tblUtenti", "idUtente = " & Me.OpenArgs)
    selezione = 2
    If IsNull(mail) Or mail = "" Then
        MsgBox "Invio email non riuscito." & Chr(10) & Chr(13) &
"L'indirizzo email dell'utente selezionato non è specificato.",
vbExclamation, "Invio email"
        Exit Function
    End If
End If
If selezione = 1 Then
    With Me.RecordsetClone
        If .RecordCount > 0 Then
            .MoveFirst
            Do
            If Len(!Email) > 0 Then
                destinatario = destinatario & ";" & !Email
              Else
                Exit Function
            End If
            .MoveNext
            Loop Until .EOF
        End If
    End With
        If IsNull(destinatario) Or (destinatario = "") Then
            MsgBox "Invio email non riuscito." & Chr(10) & Chr(13) &
"Nessun indirizzo email presente nell'elenco dei contatti!",
vbInformation, "Invio Email"
            Exit Function
        Else
            destinatario = Right(destinatario, Len(destinatario) - 1)
        End If
Else
    destinatario = mail
End If
End Function
Private Sub cmdEsci_Click()
On Error GoTo Err_cmdEsci_Click
    Application.Echo False
    DoCmd.Close
    Application.Echo True
Exit_cmdEsci_Click:
    Exit Sub
Err_cmdEsci_Click:
    MsgBox Err.Description
    Resume Exit_cmdEsci_Click
End Sub
Private Sub Form_Load()
Application.Echo False
Forms!frmSchedaPrimoContatto.SetFocus
Forms!frmSchedaPrimoContatto.Requery
Forms!frmInviaEmail.SetFocus
Application.Echo True
End Sub

[cut]
ciao Giulio,
non ho letto completamente tutta il tuo post e tutta la procedura che hai
scritto :
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim mymsg As New CDO.Message
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("T_contatti", dbOpenTable)
While Not rst.EOF
With mymsg
    .To = rst("mail") ' mail nella tabella che viene ciclata
    .Subject = "Prova con CDO"
    .From = "indirizzoMailDiPartenza"
    .HTMLBody = "Ciao"
    'AddAttachment "c:\miofile.xxx"
    .Send
End With
rst.MoveNext
Wend
E' più semplice e funzionale mettici in caso un .BCC = "TuaMail" per essere
sicuro che arrivi a destinazione.
Ciao e buona giornata.
Sandro

Ciao Sandro grazie per la risposta.
Non riesco a capire quale routine che ho già scritto debba sostituire
la tua.
La funzione che hai scritto credo mandi la email a tutti gli indirizzi
del contatto, anzi dei contatti nei database.
Ma io vorrei poter scegliere, tra le altre cose, di mandare un
messaggio AD UN SOLO INDIRIZZO del RECORD CORRENTE.
Ovvero, se il Sig. Pippo ha tre indirizzi email io vorrei poter
scegliere uno dei tre SOLO DEL SIGNOR PIPPO.
Grazie :)

Ho pensato la seguente stringa SQL, che dovrebbe popolare una casella
combinata dalla quale scegliere l'indirizzo email.
In pratica apro una form dalla quale selezionare l'indirizzo email.
Alla form che chiameremo frmEMAIL passo idUtente come OpenArgs. La form
avrà una casella di riepilogo che come origine riga avrà la seguente
stringa SQL:
SELECT tblEmail.Email FROM tblEmail INNER JOIN tblUtenti ON
tblEmail.idUtente = tblUtenti.idUtente WHERE "idUtente = " Me!idUtente
pensate si possa fare una cosa simile?
Grazie.

Ho creato una form frmPROVA_INVIA_EMAIL con una casella combinata che
ha come origine riga la seguente stringa SQL
SELECT tblEmail.Email FROM tblEmail INNER JOIN tblUtenti ON
tblEmail.idUtente = tblUtenti.idUtente WHERE "idUtente = " Me.OpenArgs
Apro questa form da subSchedaPrimoContatto in questo modo:
Private Sub cmdMandaEmail_Click()
DoCmd.RunCommand acCmdSaveRecord
If MsgBox("Routine invio email versione Alpha" & Chr(10) & Chr(13) &
"Leggere l'avviso nella maschera 'Invia Email'", vbInformation +
vbOKCancel, "Invio Email") = vbOK Then
    Application.Echo False
    'DoCmd.OpenForm "frmInviaEmail", , , , , , Me.idUtente
    DoCmd.OpenForm "frmPROVA_INVIO_EMAIL", , , , , , Me.idUtente
    Application.Echo True
Else
    Exit Sub
End If
End Sub
però quando vado a cliccare sulla casella combinata mi da errore di
sintassi e mi dice operatore mancante "idUtente = " Me.OpenArgs
Cosa manca?
Grazie!!!

 Grazie!!!
-- 
_ _
Ciao
MAssimiliano Amendola            
www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info:  
www.donkarl.com/it

Ciao MA. Però adesso quando vado ad aprire la casella combinata mi
appare la richiesta di inserimento del parametro Me.OpenArgs. Ma che in
qualche modo devo specificarlo nella frm_PROVA_INVIA_EMAIL? Devo
specificare idUtente in qualche evento di frm_PROVA_INVIA_EMAIL?
Grazie!

 Ciao MA. Perņ adesso quando vado ad aprire la casella combinata mi

Giulio se continui a tagliare i post precedenti risulta difficile seguirti.
ora per vedere a cosa ti riferisci, io che nascondo i messaggi letti (il mio
server porta 30000 post)
deve segnarlo come da leggere, cambiare visualizzazione scrollare fino al
tuo post e finalmente riprendere il post precedent.
dopo ripristinare il tutto.
Lascia la parte di post che interessa alla discussione


Google ha avuto un attacco isterico e non mi ha spedito il reply. Lo
riscrivo.
Dunque...uff...che avevo detto....ah si...
Insomma, ricapitolando: da subSchedaPrimoContatto apro
frmPROVA_INVIA_EMAIL con il seguente codice:
Private Sub cmdMandaEmail_Click()
DoCmd.RunCommand acCmdSaveRecord
If MsgBox("Routine invio email versione Alpha" & Chr(10) & Chr(13) &
"Leggere l'avviso nella maschera 'Invia Email'", vbInformation +
vbOKCancel, "Invio Email") = vbOK Then
    Application.Echo False
    DoCmd.OpenForm "frmPROVA_INVIO_EMAIL", , , , , , Me.idUtente
    Application.Echo True
Else
    Exit Sub
End If
End Sub
frmPROVA_INVIA_EMAIL è, per ora, una maschera senza origine record con
una sola casella combinata, la cui origine record è la seg. stringa
sql:
SELECT tblEmail.Email FROM tblEmail INNER JOIN tblUtenti ON
tblEmail.idUtente = tblUtenti.idUtente WHERE "idUtente = " &
Me.OpenArgs
Come avevo detto adesso, quando vado a cliccare per aprire il menù a
tendina, mi appare la richiesta di inserimento di OpenArgs. Quando
inserisco quello che penso sia l'idUtente che vuole non appare nulla
nell'elenco. Vuoto, completamente vuoto.
Quindi immagino che debba essere scritto altro codice o
forse...frmPROVA_INVIA_EMAIL debba essere associata a qualche
tabella....
Boh!
Grazie MA!

Scusa....non ho capito cosa faccio....Cmq è colpa di Google!!!!!!!
Va bene se ogni volta rispiego quello che ho detto?

Grazie :)
Prego, mi scuso ancora per la mia quasi errata indicazione, ma non urlare,
ci sento ancora bene per fortuna :-).
Ciao, alla prossima.
Sandro

Sandro....che ti sei offeso?? Mica urlavo.... :P
Beh cmq non ho risolto....se vuoi darmi una mano :)
Che guaio che sono! :(


Hai letto nella guida cos'è openargs?
E' una notizia che l'istruzione chiamante passa alla maschera che si apre.
E' quel idutente che passi dopo docmd.openform....
sulla maschera chiamata, tu hai un openargs nullo se non l'hai specificato
diversamente.


Ma io lo specifico passandolo dalla maschera chiamante.
Una volta ho provato a mettere sull'evento Load() di una maschera
l'istruzione
idUtente = OpenArgs
ma non funzionava. Perciò...ecco....come faccio a non rendere nullo
OpenArgs sulla maschera chiamata?


Se non lo chiami con l'istruzione docmd......... , idUtente
ma lo apri semplicemente lui l'opeargs sarà nullo.
Allo stesso modo tu puoi apire con un'istruzione passandolo
e con un'altra dalla stessa maschera senza passarlo


Scusa MA ma l'istruzione
DoCmd.OpenForm "frmPROVA_INVIO_EMAIL", , , , , , Me.idUtente
glielo passa. Quindi non capisco...

Scusa MA ma l'istruzione
DoCmd.OpenForm "frmPROVA_INVIO_EMAIL", , , , , , Me.idUtente
glielo passa. Quindi non capisco...


FormA
DoCmd.OpenForm "frmPROVA_INVIO_EMAIL"
FormB
DoCmd.OpenForm "frmPROVA_INVIO_EMAIL", , , , , , Me.idUtente
frmPROVA_INVIO_EMAIL_open
if "" & openargs = "" then
	msgbox "Cavolo vengo da forma"
else
	msgbox "Uffi MA chiamato FormB"
end if
--
a.cara

 a.cara

..... ehehehe Ale....so appena stato sotto attacco di un viruz.....non
capisco.
Riadattando al mio esempio...ehmm.....io apro frmPROVA_INVIO_EMAIL da
subSchedaPrimoContatto....quindi ehm.....chi è forma chi formb?....
Ovvero....al mio caso reale....che devo mettere sull'evento Open() di
frmPROVA_INVIO_EMAIL? Questo codice:
if "" & openargs = "" then
     msgbox "Me tocca fatica' "
else
     msgbox "Meno male cio' un solo utente"
end if
e poi?
Ci ho un pò di confusione...non te lo nascondo.
Ora vado a fare una scanzione antiviruz poi torno :)
Grazie cmq a tutti e tre :D

Fatta scansione approfondita con NOD32. 339.635 files 0 virus. Meno
male.

 
dobbiamo chiedere di variare il nome di questo NG in gs.rm.blog?
--
a.cara