Sobre CDO: lista de chequeo

680 views
Skip to first unread message

HernanCano

unread,
Apr 29, 2025, 9:49:37 PM4/29/25
to Comunidad de Visual Foxpro en Español
Buena tarde, colegas.

Estoy teniendo dificultades con el envío de emails con CDO y Gmail.

Como ya les informé, la rutina la estoy usando desde hace varias décadas. Evidentemente uso contraseña de aplicación y confirmo el envío funciona bien (como debiera) (ver imagen #1, tomada hace unos minutos) desde mi portátil con Win10 Pro.

Pero desde un cliente está fallando mostrando el mensaje que adjunto en la imagen #2 (tomada hace unos minutos), tanto desde los computadores satélites (estaciones) como desde el ppal; el ppal tiene Win10 Pro como en el mío. En este escenario CDO está funcionando --y bien-- desde hace mucho más de diez años.

Pero desde mediados del mes pasado, en ese cliente ha dejado de enviar mostrando:

0x00000213 Error de transporte en la conexión al servidor.

Repito que desde el mío también con Win10 Pro la misma rutina envía correctamente (ver imagen #1).

¿Hay alguna lista de chequeo que pudiera seguir para encontrar el problema?
borrable1.png
borrable2.png

borrable1.png
borrable2.png

Zarlu

unread,
Apr 30, 2025, 10:06:45 AM4/30/25
to Comunidad de Visual Foxpro en Español
Buenos días Hernán!

Prueba con diferentes puertos.
Me ha pasado en la misma ciudad, con diferente proveedor de internet,  funciona con diferente puerto

Suerte
zarlu
Chetumal, Quintana Roo, México

HernanCano

unread,
May 5, 2025, 9:10:20 PM5/5/25
to Comunidad de Visual Foxpro en Español
He encontrado (a través de AI Studio) que el puerto 465 está descontinuado, y que en general se usan
465, 25, 2525 y 587.

Y que con TELNET se puede verificar si los puertos son válidos, así:

telnet smtp.gmail.com 465
telnet smtp.gmail.com 25
telnet smtp.gmail.com 2525
telnet smtp.gmail.com 587

pero con todos me sale (en el cliente):

Conectándose a smtp.gmail.com...No se puede abrir la conexión al host, en puerto 465: Error en la conexión

(el subrayado es mío)

Sigo investigando...........



Zarlu

unread,
May 6, 2025, 5:40:46 PM5/6/25
to Comunidad de Visual Foxpro en Español
Buenas tardes Hernán!

Probando con Telnet he conectado con el puerto 587

Suerte
zarlu
Chetumal, Quintana Roo, México

Sin título.png

Victor Espina

unread,
May 7, 2025, 1:29:39 PM5/7/25
to Comunidad de Visual Foxpro en Español
Es raro que en unos computadores te funcione y otros no.  CDO no soporta TLS asi que no se puede usar el puerto 587, lo que te deja con la unica opcion (en el caso de GMail) de usar el puerto 465 via SSL.  Estas son las configuraciones que yo use con CDO para enviar por GMail:

LOCAL lcSchema, loConfig, loMsg
lcSchema = "http://schemas.microsoft.com/cdo/configuration/"
loConfig = CREATEOBJECT("CDO.Configuration")
WITH loConfig.FIELDS
 .ITEM(lcSchema + "smtpserver") = "smtp.gmail.com"
 .ITEM(lcSchema + "smtpserverport") = 465
 .ITEM(lcSchema + "sendusing") =  2
 .ITEM(lcSchema + "smtpauthenticate") = .T.
 .ITEM(lcSchema + "smtpusessl") = .T.
 .ITEM(lcSchema + "sendtls") = .F.
 .ITEM(lcSchema + "sendusername") = "tuus...@gmail.com"
 .ITEM(lcSchema + "sendpassword") = "tu-app-pwd"
 .UPDATE()
ENDWITH


Ojala te sirva

Saludos

Victor Espina

Hernan Cano

unread,
May 7, 2025, 6:26:05 PM5/7/25
to publice...@googlegroups.com
Víctor: (si me hablas a mí):

- En mi computador la rutina me funciona (incluso actualmente) como desde hace más de veinte años: mi escenario es Win10, VFP9, CDO.

- En un computador del cliente la misma rutina ha funciona como desde hace más de veinte años, pero está fallando desde hace como un mes: el escenario del cliente es Win10, VFP9, CDO. Lo mismo pasa desde unos cuatro computadores del mismo cliente: la rutina de envío que tengo da el mismo mensaje de error (q he compartido).

- En otro cliente tengo el mismo reporte de error.

Mira: el hecho de que "CDO no soporte TLS" no va al caso por ahora...por ahora...por ahora.... ya que la rutina es la misma que tengo desde hace más de dos décadas.....y actualmente funciona desde mi portátil.

El script que tienes (q inicia con loConfig = CREATEOBJECT("CDO.Configuration") es lo q hacemos todos (evidentemente incluido yo... ya dije: desde hace más de veinte años), pero hay algo en esas dos empresas que hace que los emails no salgan dsde hace unas tres o cuatro semanas. (Ambos me replican que no han hecho ajustes recientemente, pero por favor ésto es lo q quiero verificar: ¿hay alguna checklist?)

Repito: el script que compartes es lo q hago, tanto desde mi computador (donde sí está funcionando), como desde esos dos clientes (donde no está funcionando) desde hace más de veinte años.


Zarlu

unread,
May 7, 2025, 6:34:48 PM5/7/25
to Comunidad de Visual Foxpro en Español
Buenas tardes Hernán!

Como mencione antes...el proveedor de internet también participa en las situaciones.
Si tienes diferentes ubicaciones y puedes probar con una laptop quizá puedas notar lo que comento

Suerte
zarlu
Chetumal, Quintana Roo, México


Victor Espina

unread,
May 7, 2025, 11:33:33 PM5/7/25
to Comunidad de Visual Foxpro en Español
Suponiendo que ya verificaste cosas obvias como que el firewall del equipo no haya sido activado o que la salida por el puerto 465 este bloqueada, lo unico que se me ocurre es que alguna actualizacion automatica de Windows haya dañadao algun certificado de seguridad que le impida ahora hacer el handshake SSL.  Siguiendo esa idea tuve una interesantre conversacion con ChatGPT sobre el tema.  Te anexo la respuesta final, que tiene puntos que quizas vale la pena que revises:

Yo:
Since the program uses 465 port, does this discard any TLS-related problem ? Or is an outdated TLS setting still be a possible cause for SSL connection problems ?

ChatGPT said:
Great question — and the answer is no, using port 465 does not discard TLS-related problems.

Here's why:

🔐 Port 465 uses Implicit SSL/TLS, not plain SSL
When you connect to smtp.gmail.com on port 465, the client is expected to immediately start an SSL/TLS handshake.
That handshake requires support for modern TLS protocols, such as TLS 1.2 or TLS 1.3.
If the client (your app, via CDO) only supports outdated SSLv3 or TLS 1.0/1.1, Gmail will reject the connection.
⚠️ What changed: Gmail (and other providers) disabled older TLS versions
In recent years, Google and others have disabled support for:

SSL 3.0
TLS 1.0
TLS 1.1
So if your Windows installation or CDO relies on any of those, the handshake fails immediately, causing the "Transport failed to connect to the server" error.

✅ So yes — outdated TLS settings are absolutely still a possible cause, even on port 465.
🔧 What you should check:
Ensure TLS 1.2 is enabled system-wide
Use these registry settings (you can apply via .reg file or regedit):

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:00000001
"DisabledByDefault"=dword:00000000
Make sure your Windows version supports TLS 1.2
Windows 7 needs at least KB3140245
Windows XP doesn't support TLS 1.2 at all
Windows 10/11 support it by default
Reboot after changing TLS registry settings


Saludos

Victor Espina

HernanCano

unread,
May 8, 2025, 12:09:39 AM5/8/25
to Comunidad de Visual Foxpro en Español
Chévere, chévere.

Ahora voy por "crear una clave en RegEdit vía CLI.

Gracias por compartir.

HernanCano

unread,
May 8, 2025, 2:22:01 AM5/8/25
to Comunidad de Visual Foxpro en Español
Desde mi computador --que es una laptop, como mencionas--,  y desde dónde sí funciona el envío de emails (ojo: no está en la red de ninguno de los clientes), intento ejecutar los comandos (el primero --con permisos de admor-- es para habilitar TELNET, y ejecuta bien):

dism /online /enable-feature /featurename:telnetclient /all /norestart


telnet smtp.gmail.com 465
telnet smtp.gmail.com 25
telnet smtp.gmail.com 2525
telnet smtp.gmail.com 25025
telnet smtp.gmail.com 587

Si desde mi portátil, ejecuto... con los puertos 25, 2525, y 25025 sale "Error en la conexión".

Si ejecuto con el puerto 587, intenta mostrar cosas como lo que muestras; y al final sale "Se ha perdido la conexión con el host".

Si ejecuto con el puerto 465, inicia con "Conectándose a smtp.gmail.com...", pero luego de mucho rato termina con la CLI vacía/limpia: no sale error ni ningún mensaje.
Repito: desde mi portátil no necesitamos hacer estos chequeos, por que los mensajes de email sí salen normalmente por smtp.gmail.com, por el puerto 465,... el mismo escenario/comandos CDO que mostraste.....


C:\Windows\system32>telnet smtp.gmail.com 25
Conectándose a smtp.gmail.com...No se puede abrir la conexión al host, en puerto 25: Error en la conexión

C:\Windows\system32>telnet smtp.gmail.com 2525
Conectándose a smtp.gmail.com...No se puede abrir la conexión al host, en puerto 2525: Error en la conexión

C:\Windows\system32>telnet smtp.gmail.com 25025
Conectándose a smtp.gmail.com...No se puede abrir la conexión al host, en puerto 25025: Error en la conexión


C:\Windows\system32>telnet smtp.gmail.com 587
220 smtp.gmail.com ESMTP 3f1490d57ef6-e78ef4e7ac1sm529008276.57 - gsmtp
Se ha perdido la conexión con el host.


C:\Windows\system32>telnet smtp.gmail.com 465
Conectándose a smtp.gmail.com...

C:\Windows\system32>


Sigo investigando.....

borrable1.png

Zarlu

unread,
May 8, 2025, 1:12:02 PM5/8/25
to Comunidad de Visual Foxpro en Español
Buenos días Hernán!

Aunque es posible enviar algunos correos con TELNET su función es comprobar la conectividad y para eso se aplicó en éste caso
La línea "250-smtp.gmail.com at your service...." comprueba la conexión. En mi caso funciona con el puerto 25 y 587.

Respecto de "Se ha perdido la conexión con el host."   hay que introducir comandos sino después de "x" tiempo se desconecta

Suerte
zarlu
Chetumal, Quintana Roo, México


HernanCano

unread,
May 8, 2025, 9:15:07 PM5/8/25
to Comunidad de Visual Foxpro en Español

Mis acercamientos por ahora se describen así:

1. Tengo una rutina/procedimiento/función funcionando desde hace más de veinte años basada en CDO utilizando SMPT.GMAIL.COM por el uerto 465.

Desde hace aprox un mes esa rutina me está fallando en dos empresas clientes: ya no envía emails.

Pero la misma rutina/procedimiento/función la ejecuto en mi computador personal y funciona bien (sin problema de ninguna clase), aunque no está conectado a ninguno de los dos clientes... bueno: me conecto vía AnyDesk para soporte.

2. En los computadores de esas dos empresas clientes ejecuto los sgtes comandos para verificar, y todos los puertos indican que no se puede conectar. En general digo que en el mío no necesito hacer esta prueba, pues desde el mío sí se envían.


telnet smtp.gmail.com 465
telnet smtp.gmail.com 25
telnet smtp.gmail.com 2525
telnet smtp.gmail.com 25025
telnet smtp.gmail.com 587

3. Crear las claves TLS 1.2\Client y TLS 1.2\Server no ayudó.
Un análisis de AIStudio me indicó que el problema debe ser algún tipo de bloqueo en las redes internas.

4. Como mencioné, utilizo CDO, pero he estado analizando otras librerías a ver si con alguna puedo solucionar, así:

            en mi computador     en los clientes
  (antes y desde hace un mes)    (antes OK, pero desde hace un mes ERR)
CDO           OK  465            Err             es una DLL interna (no necesita registro)
SFMail        OK  465            Err             es una DLL externa, pero no necesita registro
csFoxySmtp    OK  587            Err             es una DLL .Net (externa), y sí necesita registro
SendGrid      ***                ***             servicio HTTP

SendGrid me ha fallado inicialmente y entiendo que es por la autenticación, pero estoy con AIStudio para ver si puedo hacer algo; estoy en proceso con ésta.

Victor Espina

unread,
May 9, 2025, 4:41:31 PM5/9/25
to Comunidad de Visual Foxpro en Español
A ver:

Es que a ver, si la rutina venia funcionando bien hasta un cierto dia, y esa misma rutina funciona perfectamente hoy en otros equipos, entonces eso descarta DE PLANO que sea un error con la rutina o un cambio a nivel de GMail.   Por lo tanto, el problema tiene que esstar causandolo el equipo particular donde no funciona.  Y el sospechoso #1 en un caso de comunicaciones es FIREWALL, bien sea a nivel del equipo o de la red.   Eso es lo primero que tienes descartar.  Si otros equipos en la misma red pueden enviar emails por el 465, eso descarta temas de firewall a nivel de la LAN, por lo que el siguiente paso seria verificar que EN EL COMPUTADOR donde falla, el firewall este desactivado o tenga una regla de OUTBOUND que permite la salida por el puerto 465.

Saludos

Victor Espina

Zarlu

unread,
May 9, 2025, 4:55:21 PM5/9/25
to Comunidad de Visual Foxpro en Español
Buenas tardes Hernán!

Te mandé un correo desde gmail usando SwithMail.
Ahí tienes otra opción para probar

Suerte
zarlu
Chetumal, Quintana Roo, México

HernanCano

unread,
May 9, 2025, 8:08:23 PM5/9/25
to Comunidad de Visual Foxpro en Español
Lo lamento.... no veo algo tuyo relacionado con SwithMail.

Igual lo conozco. Es una librería para usar desde la línea de comandos (DOS): no es algo de mi agrado, pero lo probaría.

HernanCano

unread,
May 11, 2025, 11:38:17 PM5/11/25
to Comunidad de Visual Foxpro en Español
Me había llegado al spam.
Pero SwithMail es un .EXE.................

Zarlu

unread,
May 12, 2025, 8:45:52 AM5/12/25
to Comunidad de Visual Foxpro en Español
Buenos días Hernán!

Si, es un exe y tal como mencionas puede funcionar en línea de comandos.


Suerte
zarlu
Chetumal, Quintana Roo, México


HernanCano

unread,
May 12, 2025, 11:29:01 AM5/12/25
to Comunidad de Visual Foxpro en Español
Perdón.... por ser precisamente un .EXE está descartado de mi estilo de programación.

Logré hacer algo con SendGrid. 
Aunq para uno de mis clientes el límite de 300 (tres cientos) es bajo, estoy analizando situaciones..... (pero basadas en SendGrid...)

Victor Espina

unread,
May 13, 2025, 9:34:28 PM5/13/25
to Comunidad de Visual Foxpro en Español
Hernan, no se ya habias visto esto:
https://github.com/vespina/sendgrid

Victor Espina

HernanCano

unread,
May 14, 2025, 1:38:02 AM5/14/25
to Comunidad de Visual Foxpro en Español
Claro que sí, Víctor: fue lo que me impulsó a iniciar.

Quisiera que vieras ésto:

Victor Espina

unread,
May 14, 2025, 1:42:27 PM5/14/25
to Comunidad de Visual Foxpro en Español
Pues mira, no te sabria decir porque caen en SPAM.  Mi empresa usa SendGrid para enviar correos a los clientes para informarles del avance de su proceso,  y hasta ahora no tenemos reportes de que les caigan en SPAM... ahora, la llamada al API de SendGrid se hace desde un winservice en  .NET, no desde VFP... no estoy seguro como eso pueede hacer alguna diferencia de cara a SendGrid.

Victor Espina

Hernan Cano

unread,
May 14, 2025, 1:44:46 PM5/14/25
to publice...@googlegroups.com
Ok.
Message has been deleted

jaime....@gmail.com

unread,
May 14, 2025, 5:29:13 PM5/14/25
to Comunidad de Visual Foxpro en Español
Buen dia les dejo un proyecto en C#, para que lo cambien a su gusto y generen la dll para enviar correos usando la nueva forma segura de google usando OAUTH2, aqui les dejo tambien como usarla en VFP, ojala les sirva


Pasos
1. Generar su IDs de clientes de OAuth 2.0 en google  https://console.cloud.google.com/apis/credentials  ahi generan su aplicacion para que les genere su ClientID y ClientSecrect que debes usar para el envio seguro de emails
3. Descargar proyecto abrir en Visual studio hacen sus modificacion a su gusto y generar la DLL. https://drive.google.com/file/d/1sqSV3uZJhj4mT1DiBL1yJ76VZs1IqXn9/view?usp=sharing
4. Copian los archivos que se generen en el folder bin\Release  a el folder donde guarden sus librerias
5. Ejecutan con permiso de administrador el archivo registraremailgmaildll.bat con la ruta donde guardaron la DLL para registrar la DLL y puedan usarla en VFP ( el archivo registraremailgmaildll.bat esta en el archivo de google drive)
6. Escribir el codigo en VFP y usar la libreria como se indica, la primera vez debe autorizar la cuenta para el envio de correos se abrira en automatico el navegador hacen login con su cuenta y dan permitir.


&&Codigo para envio de email en VFP
Local loMail, llReturn

loMail = Createobject("EmailGmail.EmailService")

lclienteid       =  "Su client id de google"
lclientsecret = "Su client secret de google"
loMail.SetCredentials(lclienteid, lclientsecret)

larchivos = Strtran((Fullpath("ruta de su archivo")),[\],[\\])
**Pueden agregar mas archivos usando el separador coma ","

**Ejemplo ruta del archivo Credentials.json se descarga de Google "C:\\Invent\\Credentials.json"

llReturn = loMail.SendEmail("Correo del cual se enviara el email", "Correo al que se enviara",  "Correo 2 al que se enviara", "Asunto del email", "Cuerpo del email(mensaje)","Archivo con ruta completa de Credentials.json descargado de Google Apis", larchivos)

If (llReturn = "true")
Wait Window  "Correo enviado con exito..." Timeout 1.5
Else
Wait Window  llReturn Timeout 1.5
Endif

loMail = Null

Zarlu

unread,
May 15, 2025, 10:40:49 AM5/15/25
to Comunidad de Visual Foxpro en Español
Buenos días Jaime!

Creé una aplicación de App de escritorio
Me sale el mensaje que adjunto. Como solucionar?

Muchas gracias por el aporte

zarlu
Chetumal, Quintana Roo, México

Sin título.png

Zarlu

unread,
May 15, 2025, 11:02:56 AM5/15/25
to Comunidad de Visual Foxpro en Español
Qué tal Jaime!

El error anterior lo he solucionado. Debe hacerse pública la aplicación, ponerse en modo producción.

Ahora tengo éste error:
sin titulo2.png

Mi código:
llReturn = loMail.SendEmail("zar...@gmail.com", "not...@prodigy.net.mx", "Zarlu Asunto del email", "Cuerpo del email(mensaje)","C:\\Users\\Luis-S\\Desktop\\nuevomail\\Credentials.json", larchivos)


Gracias
zarlu
Chetumal, Quintana Roo, México

Zarlu

unread,
May 15, 2025, 3:14:41 PM5/15/25
to Comunidad de Visual Foxpro en Español
Buenas tardes foxeros!

Ya he solventado mis errores y funcionó el envío desde gmail con OAuth
Mi segundo error versaba en que estaba omitiendo el parámetro del segundo correo

De nuevo agradezco a Jaime el aporte. Y por supuesto Jaime que servirá

(Habrá algo para Hotmail?)

zarlu
Chetumal, Quintana Roo, México




HernanCano

unread,
May 19, 2025, 5:35:02 AM5/19/25
to Comunidad de Visual Foxpro en Español
Hola, Jaime.
Intentando usar tu librería, llegué hasta lo sgte....

1. Cuando tu librería intenta ejecutar el navegador: ver imagen 1.

Sale error de que "la solicitud no es válida".

2. Cuando le pido más detalles, veo que es en la Redirect_URI: ver imagen 2.

Veo que la Redirect_URI que usas parece(parece-parece) tener un valor diferente al que yo uso; el valor que yo uso corresponde a una página dentro del mismo Google que se usa para configurar todo ese embrollo de OAuth2 en Gmail.

3. En Redirect_URI yo tengo (ver imagen 3):


4. Y mi aplicación VFP se bloquea: ver imagen 4.

Tengo que cerrarla desde el Admor de Tareas de Windows.


El miércoles, 14 de mayo de 2025 a la(s) 4:29:13 p.m. UTC-5, jaime.... escribió:
Buen dia les dejo un proyecto en C#, para que lo cambien a su gusto y generen la dll para enviar correos usando la nueva forma segura de google usando OAUTH2, aqui les dejo tambien como usarla en VFP, ojala les sirva


Pasos
1. Generar su IDs de clientes de OAuth 2.0 en google  https://console.cloud.google.com/apis/credentials  ahi generan su aplicacion para que les genere su ClientID y ClientSecrect que debes usar para el envio seguro de emails
3. Descargar proyecto abrir en Visual studio hacen sus modificacion a su gusto y generar la DLL. https://drive.google.com/file/d/1sqSV3uZJhj4mT1DiBL1yJ76VZs1IqXn9/view?usp=sharing
4. Copian los archivos que se generen en el folder bin\Release  a el folder donde guarden sus librerias
5. Ejecutan con permiso de administrador el archivo registraremailgmaildll.bat con la ruta donde guardaron la DLL para registrar la DLL y puedan usarla en VFP ( el archivo registraremailgmaildll.bat esta en el archivo de google drive)
6. Escribir el codigo en VFP y usar la libreria como se indica, la primera vez debe autorizar la cuenta para el envio de correos se abrira en automatico el navegador hacen login con su cuenta y dan permitir.borrable1.png

borrable2.png

borrable3.png

 borrable4.png
borrable4.png
borrable2.png
borrable1.png
borrable3.png

jaime....@gmail.com

unread,
May 22, 2025, 7:04:04 PM5/22/25
to Comunidad de Visual Foxpro en Español
Hola, si se puede agregar otra rutina dentro de la misma libreria para el envio por medio de hotmail, igual debes generar tus credenciales para poder hacer el envio el codigo seria algo asi


using Microsoft.Identity.Client;

var pcaOptions = new PublicClientApplicationOptions
{
    ClientId = "TU_CLIENT_ID",
    TenantId = "common",
    RedirectUri = "https://login.live.com/oauth20_desktop.srf"
};

var pca = PublicClientApplicationBuilder
    .CreateWithApplicationOptions(pcaOptions)
    .Build();

string[] scopes = new string[] { "wl.offline_access", "wl.signin", "wl.imap", "wl.emails" };

var authResult = await pca.AcquireTokenInteractive(scopes).ExecuteAsync();

string accessToken = authResult.AccessToken;
string userEmail = authResult.Account.Username;

void SendMailWithOAuth2(string userEmail, string accessToken)
{
    try
    {
        SmtpServer oServer = new SmtpServer("smtp.office365.com")
        {
            Port = 587,
            ConnectType = SmtpConnectType.ConnectSSLAuto,
            AuthType = SmtpAuthType.XOAUTH2,
            User = userEmail,
            Password = accessToken
        };

        SmtpMail oMail = new SmtpMail("TryIt")
        {
            From = userEmail,
            Subject = "Correo de prueba con OAuth2",
            TextBody = "Este es un correo de prueba enviado utilizando OAuth2."
        };
        oMail.To.Add("destin...@dominio.com");

        SmtpClient oSmtp = new SmtpClient();
        oSmtp.SendMail(oServer, oMail);

        Console.WriteLine("El correo ha sido enviado exitosamente.");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error al enviar el correo: {0}", ex.Message);
    }
}
Reply all
Reply to author
Forward
0 new messages