Access - ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

 
Vista:
sin imagen de perfil

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Javier (71 intervenciones) el 22/02/2017 18:44:17
Hola programadores, me gustaría poder enviar mediante outlook correo electrónico a todos los destinatarios de mi base de datos ,consigo generar correctamente el correo incluso con adjuntos para un destinatario , aquí os pongo mi código para un destinatario que SI FUNCIONA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Sub Comando16_Click()
Call sendmail
End Sub
Sub sendmail()
Dim oOutlook As Outlook.Application
Dim oEmailItem As MailItem
On Error Resume Next
Err.Clear
Set oOutlook = GetObject(, "Outlook.Application")
If Err.Number <> 0 Then
Set oOutlook = New Outlook.Application
End If
 
Set oEmailItem = oOutlook.CreateItem(olMailItem)
With oEmailItem
.To = Me.CORREO_ELECTRÓNICO
.CC = ""
.Subject = "CORREO DE LA EMPRESA"
For n = 0 To Me.Lista14.ListCount - 1
.Attachments.Add (Me.Lista14.ItemData(n))
Next n
 
.Display
End With
Set oEmailItem = Nothing
Set oOutlook = Nothing
End  sub

A continuación os pongo el código que NO ME FUNCIONA, para enviarle el correo a todos los registros de la base de datos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Private Sub Comando18_Click()
Dim oOutlook As Outlook.Application
Dim oEmailItem As MailItem
Dim rs As Recordset
Dim customerEmail As String
 
On Error Resume Next
Err.Clear
Set oOutlook = GetObject(, "Outlook.Application")
If Err.Number <> 0 Then
Set oOutlook = New Outlook.Application
End If
 
Set oEmailItem = oOutlook.CreateItem(olMailItem)
With oEmailItem
    Set rs = CurrentDb.OpenRecordset("Select * from ALUMNOS")
    If rs.RecordCount > 0 Then
        rs.MoveFirst
        Do Until rs.EOF
            If IsNull(rs!CORREO_ELECTRÓNICO) Then
                rs.MoveNext
            Else
                customerEmail = customerEmail & rs!CORREO_ELECTRÓNICO & ";"
                .To = customerEmail
                rs.MoveNext
                customerEmail.Type = olTo
            End If
        Loop
    Else
        MsgBox " NADIE TIENE EMAIL"
    End If
    Set rs = Nothing
 
.CC = ""
.Subject = "PRUEBA DE Academia"
For n = 0 To Me.Lista14.ListCount - 1
.Attachments.Add (Me.Lista14.ItemData(n))
Next n
 
.Display
End With
Set oEmailItem = Nothing
Set oOutlook = Nothing
End Sub


CREO QUE EL FALLO ESTÁ en el recorset , por eso os lo he puesto en negrita, ¿donde está el fallo? alguien lo sabe?

EDITO: comentar que el campo CORREO ELÉCTRÓNICO en mi base es un campo de texto, y que este código da como resultado en mi base de datos, la apertura de outlook pero sin destinatarios
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Anonimo (1 intervención) el 22/02/2017 19:34:18
Original:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set rs = CurrentDb.OpenRecordset("Select * from ALUMNOS")
 If rs.RecordCount > 0 Then
 rs.MoveFirst
 Do Until rs.EOF
 If IsNull(rs!CORREO_ELECTRÓNICO) Then
 rs.MoveNext
 Else
 customerEmail = customerEmail & rs!CORREO_ELECTRÓNICO & ";"
 .To = customerEmail
 rs.MoveNext
 customerEmail.Type = olTo
 End If
 Loop


... lo ideal:

1
2
3
4
5
6
7
8
9
10
11
12
13
Set rs = CurrentDb.OpenRecordset("Select [CORREO_ELECTRÓNICO] from ALUMNOS Where Len ([CORREO_ELECTRÓNICO]) >0")
 If rs.RecordCount <> 0 Then
 rs.MoveLast
 rs.MoveFirst
Do Until rs.EOF
If customerEmail <> "" Then customerEmail = customerEmail &  ";"
customerEmail = customerEmail & rs!CORREO_ELECTRÓNICO
rs.MoveNext
Loop
 
.To =  customerEmail
.....
.....

_Nota
Según sea la lista, puede ser considerada como SPAM por los servidores de correo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Eduard
Val: 25
Ha aumentado su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Eduard (23 intervenciones) el 23/02/2017 17:36:23
Me ocurre que cuando intento poner E-MAlL

1
2
3
4
5
6
7
8
9
10
11
Set rs = CurrentDb.OpenRecordset("Select [E-MAIL] from tCLIENT_INFO_static Where Len ([E-MAIL]) >0")
 If rs.RecordCount <> 0 Then
 rs.MoveLast
 rs.MoveFirst
Do Until rs.EOF
If customerEmail <> "" Then customerEmail = customerEmail &  ";"
customerEmail = customerEmail & rs!E-MAIL <-----------------------------------------------(automáticamente se me queda en e - MAIL)
rs.MoveNext
Loop
 
.To =  customerEmail

Se que no es correcto el uso de este tipo de caracteres, pero empecé asi el entramado :S Habria alguna solución practica? o simplemente cambiar todas esas "taras" seria mas sano?

Gracias por adelantado!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Anonimo1 (6 intervenciones) el 24/02/2017 16:20:15
Si aquí se le trata asi:
Set rs = CurrentDb.OpenRecordset("Select [E-MAIL] from tCLIENT_INFO_static Where Len ([E-MAIL]) >0")

Aquí, debería ser tratado de igual manera:
customerEmail = customerEmail & rs!E-MAIL

Es decir, asi:
customerEmail = customerEmail & rs![E-MAIL]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Javier (71 intervenciones) el 23/02/2017 17:43:12
Gracias por la respuesta anónimo, pero sigue sin funcionar , se me queda bloqueada la base de datos cuando uso tu código, ¿se te ocurre otra solución?¿o a alguien se le ocurre alguna?Ahora mismo tengo el código así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Set oEmailItem = oOutlook.CreateItem(olMailItem)
With oEmailItem
    Set rs = CurrentDb.OpenRecordset("Select [CORREO_ELECTRÓNICO] from ALUMNOS Where Len ([CORREO_ELECTRÓNICO]) >0")
    If rs.RecordCount > 0 Then
        rs.MoveFirst
        Do Until rs.EOF
            If IsNull(rs!CORREO_ELECTRÓNICO) Then
                rs.MoveNext
            Else
                customerEmail = customerEmail & rs!CORREO_ELECTRÓNICO & ";"
                .To = customerEmail
                rs.MoveNext
            End If
        Loop
    Else
        MsgBox " NADIE TIENE EMAIL"
    End If
    Set rs = Nothing
 
.CC = ""
.Subject = "PRUEBA DE ALAS"
For n = 0 To Me.Lista14.ListCount - 1
.Attachments.Add (Me.Lista14.ItemData(n))
Next n
 
.Display
End With
Set oEmailItem = Nothing
Set oOutlook = Nothing
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Anonimo1 (6 intervenciones) el 24/02/2017 16:27:36
Únicamente aprecio la utilización del origen de datos para el recordset ....... se ignora absolutamente el resto lo que me impide reconocerlo como código de mi autoría (a lo sumo como un 'colage' y sobre ello por mi parte no tengo opinión alguna que ofrecer)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Javier (71 intervenciones) el 24/02/2017 17:24:30
Disculpa anónimo , te pongo el código entero que se ejecuta cuando pulso el botón, que debería recopilar todos los mail y ponerlos como receptores en outlook, a ver si así te ayuda algo mas a darme una solución:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Private Sub Comando18_Click()
Dim oOutlook As Outlook.Application
Dim oEmailItem As MailItem
Dim rs As Recordset
Dim customerEmail As String
 
On Error Resume Next
Err.Clear
Set oOutlook = GetObject(, "Outlook.Application")
If Err.Number <> 0 Then
Set oOutlook = New Outlook.Application
End If
 
Set oEmailItem = oOutlook.CreateItem(olMailItem)
With oEmailItem
    Set rs = CurrentDb.OpenRecordset("Select [CORREO_ELECTRÓNICO] from ALUMNOS Where Len ([CORREO_ELECTRÓNICO]) >0")
    If rs.RecordCount > 0 Then
        rs.MoveFirst
        Do Until rs.EOF
            If IsNull(rs!CORREO_ELECTRÓNICO) Then
                rs.MoveNext
            Else
                customerEmail = customerEmail & rs!CORREO_ELECTRÓNICO & ";"
                .To = customerEmail
                rs.MoveNext
            End If
        Loop
    Else
        MsgBox " NADIE TIENE EMAIL"
    End If
    Set rs = Nothing
 
.CC = ""
.Subject = "PRUEBA DE ALAS"
For n = 0 To Me.Lista14.ListCount - 1
.Attachments.Add (Me.Lista14.ItemData(n))
Next n
 
.Display
End With
Set oEmailItem = Nothing
Set oOutlook = Nothing
End Sub

A ver si esto te ayuda y me da una solución, otra posibilidad, sería escribir otro código fuente que hiciera esto , desde 0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Anonimo1 (6 intervenciones) el 24/02/2017 20:48:27
Hay un código perfectamente funcional (según se indica en el primer mensaje del hilo) que presenta un único inconveniente: enviar a múltiples usuarios.

Línea del código original:
.To = Me.CORREO_ELECTRÓNICO

Si en esa línea se adjuntasen diferentes direcciones de correo, (.To = Me.CORREO_ELECTRÓNICO + .To = Me.CORREO_ELECTRÓNICO +.To = Me.CORREO_ELECTRÓNICO + .....) ese mismo mensaje se enviaría a todos los correos.

Esa es la (supuesta) funcionalidad de la variable que aparece después (customerEmail) en la que se deberían encolar todas las direcciones de correo, separadas por el separador de listas indicado en la configuración regional de Windows (el punto y coma en España y en países latinos generalmente la coma simple).

Y aquí entra el código propuesto (y que no ha sido utilizado, a lo sumo alguna parte), en el se comienza por

.- seleccionar aquellos registros con 'contenido valido' (o eso se espera: una dirección de correo electrónico)
.- se valida que existan (devolverá cero o 'cualquier otra cosa' en RecordCount, dependiendo del origen de datos real pues tablas locales o remotas devuelven datos diferentes, incluso valores inferiores a cero)
.- Se 'agita' el recordset (se le envía al final y de nuevo al inicio) para que cargue todos los datos y así trabajar con datos reales (RecordCount tras esto devolverá el numero REAL de registros implicados)

Solo se precisa recorrer TODOS los registros (todos tienen una dirección de correo supuestamente valida dado que los que no tienen han sido descartados) y añadir un separador entre ellos (sea el punto y coma o la coma simple en función de la configuración regional)

Al final del proceso (si todo ha sido correcto) en la variable customerEmail tenemos un listado ([email protected] ; [email protected] ; ....) que se le asignara a .To y ......

Asumí que sustituyendo el código original por 'lo mismo' en la nueva versión, un simple Copy & Paste sobrescribiendo, obtendría resultados óptimos (no la copia de una mínima parte de todo el conjunto)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Javier (71 intervenciones) el 01/03/2017 18:00:22
Buenas y gracias por la respuesta, no se hacer esto que dices podrías ponerme un ejemplo o escribirme tu el código? el primer código es perfectamente funcional si

comentar que el correo electrónico es un campo texto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Anonimo1 (6 intervenciones) el 01/03/2017 23:34:54
Si aun no lo has logrado, será porque aun no has analizado detalladamente mi primera respuesta ....

Lo primero:
Copiar la base (si algo falla, no destruir lo que existe).

Lo segundo (en la copia o el original, pero SOLO EN UNA DE ELLAS):
Tan sencillo como ELIMINAR (borrar) las líneas que (en mi primera intervención) están descritas como 'Original' y poner en su lugar las que están bajo el epígrafe 'lo ideal' (las líneas de puntos suspensivos del final no son necesarias)

Copio y pego eso misto, tomado de mi anterior mensaje:

Asumí que

sustituyendo el código original por 'lo mismo' en la nueva versión


, un simple Copy & Paste sobrescribiendo, obtendría resultados óptimos (no la copia de una mínima parte de todo el conjunto)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 26
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por David (10 intervenciones) el 16/08/2017 12:50:39
Hola, he realizado tu prueba y me funciona perfectamente siempre y cuando coja los datos de una tabla pero no de una consulta.

Antes de pasar todo el codigo para el envío del e-mail e intentado pasar todos los e-mails de una consulta a un campo separado por comillas para el envío, el problema es que me dice que no encuentra los datos, pero si los cojo de una tabla no hay problema.

El tema es que necesito que sea de una consulta:

1
2
3
4
5
6
7
8
9
10
11
Dim rs As Recordset
Dim direccionesemail
Set rs = CurrentDb.OpenRecordset("Select [LContactsCampaign.Column(5) From LContactsCampaign")
'verificamos que hay datos
If rs.RecordCount = 0 Then Exit Sub ' si no hay direcciones se aborta el envío ....
'Comenzamos la carga de las direcciones
Do Until rs.EOF
If direccionesemail <> "" Then direccionesemail = direccionesemail & "; "
direccionesemail = direccionesemail & rs!LContactsCampaign.Column(5
rs.MoveNext
Loop


Gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ENVIAR CORREOS A TODOS LOS DESTINATARIOS DE LA BASE

Publicado por Anonimo (3314 intervenciones) el 16/08/2017 18:35:48
Este origen de datos:

Set rs = CurrentDb.OpenRecordset("Select [LContactsCampaign.Column(5) From LContactsCampaign")

No me parece que sea una consulta que funcione, pues no entenderá que es eso de la columna 5.

La columna xx la tendrá un cuadro de lista o un combo 'como objeto del formulario' y no existe como tal, lo adecuado seria se utilizase el nombre del campo que ocupa el sexto lugar (el sexto porque comienzan a contar en cero) por ejemplo si el origen de datos de ese cuadro de lista/combo fuera algo como (inventando: por falta de datos reales):

Select campoA, campoB, campoC, campoD, campoE, campoF, campoG, campoH ... From TablaZZZ Were KKKK = 33

El origen de datos para el recordset seria algo como:

Select campoF From TablaZZZ Were KKKK = 33

Esto es:
Set rs = CurrentDb.OpenRecordset("Select campoF From TablaZZZ Were KKKK = 33")
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar