Autor Tema: Envio email con cdo clase  (Leído 16228 veces)

0 Usuarios y 1 Visitante están viendo este tema.

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Envio email con cdo clase
« en: Julio 21, 2014, 01:27:39 pm »
hola estoy intentando utlizar el modulo  clase para enviar correo con
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/337-enviar-correo-en-vb-con-microsoft-cdo.htm

pero me marcar error

en esta linea
Código: [Seleccionar]
    ' Crea un Nuevo objeto CDO.Message
    Set oCDO = CreateObject("CDO.Message")



Código: [Seleccionar]
Option Explicit

' para la conexión a internet
Private Declare Function InternetGetConnectedState _
    Lib "wininet.dll" ( _
    ByRef lpdwFlags As Long, _
    ByVal dwReserved As Long) As Long

Private Const INTERNET_CONNECTION_MODEM_BUSY As Long = &H8
Private Const INTERNET_RAS_INSTALLED As Long = &H10
Private Const INTERNET_CONNECTION_OFFLINE As Long = &H20
Private Const INTERNET_CONNECTION_CONFIGURED As Long = &H40

' variables locales
Private mServidor As String
Private mPara As String
Private mDe As String
Private mAsunto As String
Private mMensaje As String
Private mAdjunto As String
Private mPuerto As Variant
Private mUsuario As String
Private mPassword As String
Private mUseAuntentificacion As Boolean
Private mSSL As Boolean

Public Event Error(Descripcion As String, Numero As Variant)
Public Event EnvioCompleto()

Function Enviar_Backup() As Boolean
   
    ' Variable de objeto Cdo.Message
    Dim oCDO As Object
         
    ' chequea si hay conexión
    If InternetGetConnectedState(0&, 0&) = False Then
       RaiseEvent Error("No se puede enviar el correo. " & _
                        "Verificar la conexión a internet si está disponible", 0)
       Exit Function
    End If
   
   
   
    ' chequea que el puerto sea un número, o que no esté vacío
    If Not IsNumeric(puerto) Then
       RaiseEvent Error("No se ha indicado el puerto del servidor", 0)
       Exit Function
    End If
   
    ' Crea un Nuevo objeto CDO.Message
    Set oCDO = CreateObject("CDO.Message")
   
    ' Indica el servidor Smtp para poder enviar el Mail ( puede ser el nombre _
      del servidor o su dirección IP )
    oCDO.Configuration.Fields( _
    "http://schemas.microsoft.com/cdo/configuration/smtpserver") = mServidor
   
    oCDO.Configuration.Fields( _
    "http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
   
    ' Puerto. Por defecto se usa el puerto 25, _
     en el caso de Gmail se usa el puerto 465
   
    oCDO.Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = mPuerto

   
    ' Indica el tipo de autentificación con el servidor de correo _
     El valor 0 no requiere autentificarse, el valor 1 es con autentificación
    oCDO.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/" & _
                "configuration/smtpauthenticate") = Abs(mUseAuntentificacion)
   
    ' Tiempo máximo de espera en segundos para la conexión
    oCDO.Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10

    ' Configura las opciones para el login en el SMTP
    If mUseAuntentificacion Then

    ' Id de usuario del servidor Smtp ( en el caso de gmail, _
     debe ser la dirección de correro mas el @gmail.com )
    oCDO.Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/sendusername") = mUsuario

    ' Password de la cuenta
    oCDO.Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mPassword

    ' Indica si se usa SSL para el envío. En el caso de Gmail requiere que esté en True
    oCDO.Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = mSSL
   
    End If
   
    ' Estructura del mail
    '''''''''''''''''''''''''''''''''''''''''''''''
   
    ' Dirección del Destinatario
   
    oCDO.To = mPara
   
    ' Dirección del remitente
    oCDO.From = mDe
   
    ' Asunto del mensaje
    oCDO.Subject = mAsunto
   
    ' Cuerpo del mensaje
    oCDO.TextBody = mMensaje
   
    'Ruta del archivo adjunto
    If mAdjunto <> "" Then
        If Len(Dir(mAdjunto)) = 0 Then
            ' ..error
            RaiseEvent Error("No se ha encontrado el archivo en la siguiente ruta: ", 0)
            Exit Function
        Else
            ' ..lo agrega
            oCDO.AddAttachment (mAdjunto)
        End If
    End If
   
    ' Actualiza los datos antes de enviar
    oCDO.Configuration.Fields.Update
   
    On Error Resume Next
    Screen.MousePointer = vbHourglass
    ' Envía el email
    oCDO.Send
    Screen.MousePointer = 0
    ' .. si no hubo error
    If Err.Number = 0 Then
       Enviar_Backup = True
       RaiseEvent EnvioCompleto
   
    ElseIf Err.Number = -2147220973 Then
       RaiseEvent Error("Posible error : nombre del Servidor " & _
                        "incorrecto o número de puerto incorrecto", Err.Number)
    ElseIf Err.Number = -2147220975 Then
       RaiseEvent Error("Posible error : error en la el nombre de usuario, " & _
                                                "o en el password ", Err.Number)
    Else
       RaiseEvent Error(Err.Description, Err.Number)
    End If

    ' Descarga la referencia
    If Not oCDO Is Nothing Then
        Set oCDO = Nothing
    End If
   
    Err.Clear
   
    Screen.MousePointer = vbNormal
End Function

' propiedades
'''''''''''''''''''''
Property Get servidor() As String
    servidor = mServidor
End Property
Property Let servidor(value As String)
    mServidor = value
End Property


Property Get para() As String
    para = mPara
End Property
Property Let para(value As String)
    mPara = value
End Property


Property Get de() As String
    de = mDe
End Property
Property Let de(value As String)
    mDe = value
End Property


Property Get Asunto() As String
    Asunto = mAsunto
End Property
Property Let Asunto(value As String)
    mAsunto = value
End Property


Property Get Mensaje() As String
    Mensaje = mMensaje
End Property
Property Let Mensaje(value As String)
    mMensaje = value
End Property


Property Get Adjunto() As String
    Adjunto = mAdjunto
End Property
Property Let Adjunto(value As String)
    mAdjunto = value
End Property


Property Get puerto() As Variant
    puerto = mPuerto
End Property
Property Let puerto(value As Variant)
    mPuerto = value
End Property


Property Get Usuario() As String
    Usuario = mUsuario
End Property
Property Let Usuario(value As String)
    mUsuario = value
End Property


Property Get PassWord() As String
    PassWord = mPassword
End Property
Property Let PassWord(value As String)
    mPassword = value
End Property


Property Get UseAuntentificacion() As Boolean
    UseAuntentificacion = mUseAuntentificacion
End Property
Property Let UseAuntentificacion(value As Boolean)
    mUseAuntentificacion = value
End Property


Property Get ssl() As Boolean
    ssl = mSSL
End Property
Property Let ssl(value As Boolean)
    mSSL = value
End Property


quisiera saber si alguien tuvo el mismo problema o si alguien me puede orientar para resolverlo de antemano muchas gracias por tomarse la molestias de leer mi post  saludos
No he fracasado. He encontrado 10000 soluciones que no funcionan.

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #1 en: Julio 21, 2014, 09:29:32 pm »
Estimado aedEric
 
Quizás no tienes instalado los componentes de CDO
Coloca un punto de depuración en Set oCDO = CreateObject("CDO.Message") y luego ejecuta tú código a ver que te retorna en ese punto. Si el objeto se crea continua con la ejecución paso a paso para determinar en qué punto se produce el error
 
Saludos desde algún lugar en Lima-Peru.

 
Saludos, desde algún lugar de Lima-Perú

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #2 en: Julio 22, 2014, 02:26:36 pm »
Hola Albertomi gracias por contestar

te comento el error se produce en esta linea
Código: [Seleccionar]
Set oCDO = CreateObject("CDO.Message")
Marcando Error de automatizaciòn intente agregando la referencia microsoft cdo windows 2000 pero aun asi me marca el error, no se si talvez sea la libreria tengo windows 7 talvez tenga que reinstalarla intentare con eso de antemano gracias
No he fracasado. He encontrado 10000 soluciones que no funcionan.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #3 en: Julio 22, 2014, 03:12:46 pm »
Sera permisos de administrador?

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #4 en: Julio 22, 2014, 03:25:22 pm »
Leandro te agradezco por contestar fijate que probe en otra maquina windows xp y funciono solo que en la mia de trabajo no?

intentare ejecutandola como administrador muchas gracias
No he fracasado. He encontrado 10000 soluciones que no funcionan.

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #5 en: Julio 22, 2014, 05:11:10 pm »
Hola Leandro te comento que acabo de ejecutarlo con Permisos y aun asi sigue marcando el mismo error gracias de antemano
No he fracasado. He encontrado 10000 soluciones que no funcionan.

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #6 en: Julio 23, 2014, 04:08:10 pm »
Estimado aedEric


Por favor podrías postear un screenshot de la referencia que has adicionado a tu proyecto.
Por otro lado, existen otras formas de enviar un email desde VB en los que no es necesarios usar CDO
 
Saludos, desde algún lugar en Lima-Perú
Saludos, desde algún lugar de Lima-Perú

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Envio email con cdo clase
« Respuesta #7 en: Julio 23, 2014, 05:47:31 pm »
Si, otra forma es la que le pase al amigo aedEric que no necesita referencias... bueno al menos en un proyecto nuevo funciona sin adicionar referencias. Este es el proyecto que alguna vez lo conseguir por aqui creo.

El detalle es que este codigo siempre me ha funcionado y ahora me percato que con otras cuentas del mismo gmail no funciona, no marca error y siempre pasa el Send pero el correo nunca llega, es raro.
Me encuentras en YAcosta.com

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #8 en: Julio 23, 2014, 08:14:18 pm »
pues le comento que no me funciona ami, la referencia es esta



esto me sucede en w7 en xp si me funciona que pasara  :(

saludos gracias de antemano por sus respuestas
No he fracasado. He encontrado 10000 soluciones que no funcionan.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #9 en: Julio 24, 2014, 12:22:34 am »
Estimado Albertomi: si no desvirtuara el hilo, ¿podrías decir qué forma es la que encontrás más adecuada para el envío de mails (en lo posible, que sea compatible con WinXP y 7 (32 y 64 bits), por favor?
Muchas gracias.

Jerónimo

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #10 en: Julio 24, 2014, 03:40:41 am »
Estimado aedEric
 
He probado el código que ha compartido Ivan y funciona adecuadamente. Mi plataforma es Windows 7 de 64 Bits en idioma ingles con configuración regional de Perú.
Haz intentado probar tu código en otro equipo con Windows 7, en último caso lo podrías compartir para probarlo nosotros.
 
Saludos, desde algún lugar de Lima-Perú
Saludos, desde algún lugar de Lima-Perú

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #11 en: Julio 24, 2014, 04:09:50 am »
Estimado Jeronimo
 
En lo personal evito depender de componentes (DLL, OCX, TLB, entre otros) de terceros, suelos utilizar los que vienen nativamente en el sistema operativo (Windows XP, 7, 8 u 8.1) o construir mis propios componentes (DLL, OCX, TLB, entre otros). Quizás algunos esto les parecerá un exceso de trabajo, pero lo prefiero así por varios motivos económicos (no tengo que pagar por licencias a terceros), no depende de terceros en caso se requiera aplicar un parche de servicio, puedo modificar el control a mi necesidad, entre otras.

Siempre hay que tener en mente las diferencias en la invocación de métodos y/o fusiones, así como, el comportamiento de los componentes dependiendo el sistema operativo. Quizás necesites tener versiones especiales de tus componentes de acuerdo al sistema operativo o parches de servicios que soluciones problemas por versión del sistema operativo. Por otro lado, lamentablemente el compilador de Visual Basic 6 solo compila a 32 bit, pero si la aplicación está bien desarrollada e instalada debería de funcionar sin mayor contratiempo en un sistema operativo de 64 bit; claro está que estaría ejecutándose en modo WoW.

A continuación les dejo un link de donde pueden descargar una aplicación (me parece que la autoría de la aplicación es de Leandro) que es un cliente para envió de email en HTML, requiere antes que lo ejecuten registren el siguiente TLB SubclassingSink.tlb para que pueda ser referenciado adecuadamente. Adicionalmente la aplicación tiene 3 dependencias:
 - Microsoft Internet Control
 - Microsoft HTML Object Library
 - Microsoft CDO


Link de descarga  http://1drv.ms/UuqZ7K
 
Saludos, desde algún lugar en Lima-Perú
Saludos, desde algún lugar de Lima-Perú

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #12 en: Julio 24, 2014, 10:38:58 am »
hola Albertomi de antemano muchisimas gracias por tu interes en el tema y el ejemplo que proporcionas te comento en mi maquina en la que normalmente trabajo me marca error de automatización en otra maquina me marca el mismo error (windows 7 32 bits)  sólo en una con xp funciona bien.
no se aque se debera el problema pero creo que tendre que buscar una alternativa a cdo de windows  :( de, hecho la estoy buscando en el propio gmail, espero no desvirtuar el tema (lo que trato es poder obtener un alerta en un dispositivo movil con el correo, pero gmail en eventos de calendario da la opcion alertas mediante sms que es fantastico  ;D solo que tambien sigo atorado tambien al no poder eliminar eventos desde el vb6)

 antemano gracias  Albertomi muy agradecido saludos
No he fracasado. He encontrado 10000 soluciones que no funcionan.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #13 en: Julio 24, 2014, 10:50:10 am »
Estimado Albertomi: muy clara e ilustrativa tu respuesta.
Estoy descargando el proyecto que compartiste.
Muchas gracias.

Jerónimo

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Envio email con cdo clase
« Respuesta #14 en: Julio 24, 2014, 12:43:21 pm »
Estimado aedEric
 
Otra alternativa para el envió de email es que hagas uso de un web service o una página web (automatizada claro está), así ya no depende de CDO.
Si dispones de un hosting web podrías implementar una página web (en ASP, PHP, ASPX, entre otros) que envié email y a la que los parámetros (email de destino, asunto, cuerpo del email) se los pasas por URL.

 
Saludos, desde algún lugar de Lima-Perú
Saludos, desde algún lugar de Lima-Perú