Com el seu títol indica, aquesta funció serveix per generar un correu per cada registre de la nostra base de dades personificat amb alguna de les dades de la nostra base de dades, un assumpte, missatge i adjunt comú.

Partint de la base tenim:
– Base de dades –> Taula: PreclientesIdentifica
– Consulta : ConsultaIdentifica
– Formulari amb un boto el qual te nom intern (per el programa, no el que es mostra)  EnviarCorreu2
I Outlook amb el compte en el que vulguem enviar el primer de la llista (no sé el perquè però es posen a la Safata de sortida del PRIMER correu configurat, dona igual que no sigui el predeterminat)

En marxa!
Click dreta sobre el botó –> «Generar Evento…» –> «Generador de código» i ens obrirà això

Private Sub EnviarCorreu2_Click()

End Sub

Dins d’això enganxarem el següent codi

On Error GoTo Err_EnviarCorreu2_Click

Dim BD As Database
Dim NovaQRY As QueryDef
Dim RegistresTemporals As DAO.Recordset
Dim CadenaSQL As String
Dim Correu As String
Dim Nom As String
Dim Fitxa As String

Dim identificador As Long
Set BD = CurrentDb

CadenaSQL = "SELECT * FROM PreclientesIdentifica"
'Selecciona tot (*) de la TAULA PreclientesIdentifica
Set RegistresTemporals = CurrentDb.OpenRecordset(CadenaSQL, dbOpenDynaset)
'obre un registre temporal (Recordset)
If RegistresTemporals.EOF = False Then
'La funció EOF (end of) retorna un valor Boleà que indica si està al final del
'temporal de registres. Existeix tambe la BOF (beginning of) que indica si està
'just al principi del registre

RegistresTemporals.MoveLast
RegistresTemporals.MoveFirst

Do Until RegistresTemporals.EOF
BD.QueryDefs.Delete ("ConsultaIdentifica")
'Borra el temporal de la consulta

identificador = RegistresTemporals!NUM_FICHA
Set NovaQRY = BD.CreateQueryDef("ConsultaIdentifica", _
         "SELECT * FROM PreclientesIdentifica WHERE PreclientesIdentifica.NUM_FICHA = " & identificador)
'Crea temporal consulta de la taula PreclientesIdentifica i
'relaciona el NUM_FICHA amb el nº de registre de la taula

Correu = RegistresTemporals!E_MAILS
'Li diu que el "Correu" que es un String es igual al RecordSet columna Email

Nom = RegistresTemporals!ENTIDAD
'Li diu que el "Nombre" que es un String es igual al RecordSet columna Nombre

Fitxa = RegistresTemporals!NUM_FICHA
'Li diu que el "Ficha" que es un String es igual al RecordSet columna Ficha

SendMessages Correu, "", "Carnestoltes Planning 2012 - " & Fitxa & " " & Nom, _
"Amics," & Chr(13) & Chr(13) & "Us adjuntem un seguit d'espectacles, activitats i serveis que podrien ser adients per les vostres festes i programacions. Naturalment, sols es una petita part dels continguts de la nostra base de dades." & Chr(13) & "Si ens doneu dates i el vostre criteri de programació us enviarem un seguit de propostes amb els millors preus que puguem aconseguir." & Chr(13) & "No dubteu en trucar-nos per telèfon de 9 a 15 h. i de 16 a 20 h." & Chr(13) & Chr(13) & "Cordialment," & Chr(13) & "Mar Torres" & Chr(13) & Chr(13) & "Planning General d'Espectacles" & Chr(13) & "Tordera, 5    08012 - Barcelona" & Chr(13) & "Tel. 93-284 80 80  Fax 93-284 59 35" & Chr(13) & "E-mail: gestio@planning.cat", _
"C:BOOK PLANNING2012 ESPECTACLES I PREUS.pdf"
'La funció SendMessages la tenim al "Modulo 1" 

RegistresTemporals.MoveNext
'Si tot ha anat be ens movem al seguent registre
Loop
'Fes-ho fins que acabi la llista
End If
BD.Close
RegistresTemporals.Close
'Tanquem els temporals

Exit_EnviarCorreu2_Click:
    Exit Sub

Err_EnviarCorreu2_Click:
    MsgBox Err.Description
    Resume Exit_EnviarCorreu2_Click

Com podeu veure, poso l’explicació de cada cosa, segons el que tinc entès jo clar.., i amb les funcions sense abreviar, per estalviar pes (bytes) normalment en lloc de Recordset posem rst, això ja va a gust del programador per entendre’t desprès.

La funció SendMessages està explicada en aquest post.

El resultat és aquest: