Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: aedEric 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 (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 ' Crea un Nuevo objeto CDO.Message
Set oCDO = CreateObject("CDO.Message")
(http://i59.tinypic.com/fkb3u1.jpg)
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
-
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.
-
Hola Albertomi gracias por contestar
te comento el error se produce en esta linea 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
-
Sera permisos de administrador?
-
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
-
Hola Leandro te comento que acabo de ejecutarlo con Permisos y aun asi sigue marcando el mismo error gracias de antemano
-
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ú
-
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 (https://dl.dropboxusercontent.com/u/4052038/Otros/EnvioEmail.rar) 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.
-
pues le comento que no me funciona ami, la referencia es esta
(http://i59.tinypic.com/2n0vxq1.jpg)
esto me sucede en w7 en xp si me funciona que pasara :(
saludos gracias de antemano por sus respuestas
-
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
-
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ú
-
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 (http://1drv.ms/UuqZ7K)
Saludos, desde algún lugar en Lima-Perú
-
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
-
Estimado Albertomi: muy clara e ilustrativa tu respuesta.
Estoy descargando el proyecto que compartiste.
Muchas gracias.
Jerónimo
-
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ú
-
Hola Albertomi gracias por contestar te comento no dispongo de hosting web, realemente quise ocupar un envio de email para que fuera un tipo alerta, ya que deseo saber cada cierta fecha que dispongo en una bd se cumpla, opte por agregarlo y asi lo tengo a mi calendario de outlook funciona muy bien puedo agregar y eliminar citas desde vb6 y intente como alerta adicional porder enviar un email, pero veo que el calendar de google es mas completo se puede configurar inclusive para mandar sms a un celular como alerta o un email de forma automatica, de todos modos te agradezco muchisimo que te hayas tomado la molestia de leer y buscar una solucion a mi tema muy agradecido saludos desde México ;D
-
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 (https://dl.dropboxusercontent.com/u/4052038/Otros/EnvioEmail.rar) 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.
Hola amigo YAcosta No sera que llegan como correo no deseado ?
-
Gracias por la observacion, acabo de probarlo y no llegan, ni al correo no deseado. Pero de una de mis cuentas gmail siempre llega y a cualquier destino (lo probe con outlook, yahoo y gmail) y no se van al buzon de no deseados.
Seguire investigando.
-
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 (http://1drv.ms/UuqZ7K)
Saludos, desde algún lugar en Lima-Perú
Hola Albertomi, esta muy bueno la aplicacion, me gustaria saber que pasa si se cambia de Sistema Operativo ?
Ademas queria saber como puedo hacer para cargar en TxtPara.text los clientes que surgen de esta SQL que tengo en un DAtaEnviroment que cargo a un informe
SELECT tbclientes.Codigo, tbclientes.Direccion, tbclientes.Nombre, tbclientes.telefono,tbclientes.mail,
tbPlanVacunacion.NombreVac, tbPlanVacunacion.ProxVacuna, tbPlanVacunacion.FechaProxVac, tbPlanVacunacion.CodCliente, tbPlanVacunacion.CodMascota, tbmascotas.codmascota, tbmascotas.nombremascota FROM tbPlanVacunacion, tbclientes, tbmascotas WHERE tbPlanVacunacion.CodCliente = tbclientes.Codigo AND tbplanvacunacion.codmascota = tbmascotas.codmascota AND fechaproxvac = ? and fallecido <>-1
y ademas como hacer para validar una direccion de correo electronico para quie no me de error o me devuelva el mail
gracias
-
Gracias por la observacion, acabo de probarlo y no llegan, ni al correo no deseado. Pero de una de mis cuentas gmail siempre llega y a cualquier destino (lo probe con outlook, yahoo y gmail) y no se van al buzon de no deseados.
Seguire investigando.
Ami me llegan perfecto desde una cuenta gmail a gmail y de gmail a yahoo me los guarda en el CORREO NO DESEADO , yo uso windows 7 64 bits.
estoy interesado en esto . gracias
-
Albertomi gracias me salvaste la vida, jjijiji.
Consulta se podría hacer envíos automatizados...
Besitos
PatriciaBB
-
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 (http://1drv.ms/UuqZ7K)
Saludos, desde algún lugar en Lima-Perú
Hola Albertomi, esta muy bueno la aplicacion, me gustaria saber que pasa si se cambia de Sistema Operativo ?
Ademas queria saber como puedo hacer para cargar en TxtPara.text los clientes que surgen de esta SQL que tengo en un DAtaEnviroment que cargo a un informe
SELECT tbclientes.Codigo, tbclientes.Direccion, tbclientes.Nombre, tbclientes.telefono,tbclientes.mail,
tbPlanVacunacion.NombreVac, tbPlanVacunacion.ProxVacuna, tbPlanVacunacion.FechaProxVac, tbPlanVacunacion.CodCliente, tbPlanVacunacion.CodMascota, tbmascotas.codmascota, tbmascotas.nombremascota FROM tbPlanVacunacion, tbclientes, tbmascotas WHERE tbPlanVacunacion.CodCliente = tbclientes.Codigo AND tbplanvacunacion.codmascota = tbmascotas.codmascota AND fechaproxvac = ? and fallecido <>-1
y ademas como hacer para validar una direccion de correo electronico para quie no me de error o me devuelva el mail
gracias
quien me ayuda con esto porfa
-
Estimado gasafonso
No deberías de tener ningún problema, yo lo he probado en Windows XP, Windows 7 y en Windows 8.1 tanto en 32 como en 64 bit.
En TxtPara.Text simplemente pon las cuentas de email concatenadas separadas por coma (,) o por punto y coma ( ;) los dos funcionan. Ahora, la cantidad que cuentas que puedas concatenar por envió dependerá de las condiciones del servicio que te determine tu proveedor de email.
Saludos, desde algún lugar en Lima-Perú
-
Estimada PatriciaBB
Definitivamente si es posible que realices envíos automatizados.
Saludos, desde algún lugar en Lima-Perú
-
Estimado gasafonso
No deberías de tener ningún problema, yo lo he probado en Windows XP, Windows 7 y en Windows 8.1 tanto en 32 como en 64 bit.
En TxtPara.Text simplemente pon las cuentas de email concatenadas separadas por coma (,) o por punto y coma ( ;) los dos funcionan. Ahora, la cantidad que cuentas que puedas concatenar por envió dependerá de las condiciones del servicio que te determine tu proveedor de email.
Saludos, desde algún lugar en Lima-Perú
No se como desde esa sentencia cargar el txtpara.text con los mails de cada uno, y ademas como se hace para validar los mails ?
-
Estimado gasafonso
Bueno estamos desvirtuando el hilo, así que te explico a grandes rasgos lo que tienes que hacer:
- Haciendo uso de ADO ejecuta con ese SELECT una consulta a tú base de datos, asumiendo que tu SELECT esta OK te va retornar un Recordset que trae un conjunto de registros (uno o más de uno).
- Luego para hacer el envió de los email, solo tienes que recorrer el Recordset de inicio a fin y vas concatenando el valor del campo tbclientes.mail
- Ahora tú pregunta de como se hace para validar los email puede resultar un tanto genérica, pues quieres validar que el email cumpla con la sintaxis correcta de un email o quieres validar que el email realmente exista. Se supone que el sistema que deja la información en dicha base de datos debe haber realizado una validación de la sintaxis del email.
Saludos, desde algún lugar en Lima-Perú
-
Estimado gasafonso
Bueno estamos desvirtuando el hilo, así que te explico a grandes rasgos lo que tienes que hacer:
- Haciendo uso de ADO ejecuta con ese SELECT una consulta a tú base de datos, asumiendo que tu SELECT esta OK te va retornar un Recordset que trae un conjunto de registros (uno o más de uno).
- Luego para hacer el envió de los email, solo tienes que recorrer el Recordset de inicio a fin y vas concatenando el valor del campo tbclientes.mail
- Ahora tú pregunta de como se hace para validar los email puede resultar un tanto genérica, pues quieres validar que el email cumpla con la sintaxis correcta de un email o quieres validar que el email realmente exista. Se supone que el sistema que deja la información en dicha base de datos debe haber realizado una validación de la sintaxis del email.
Saludos, desde algún lugar en Lima-Perú
Muchas gracias ALbertomi, pero justamente no se como hacerlo , soy aficionado de visual basic 6
saludos