Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta en Enero 09, 2013, 02:02:54 am
-
Para enviar un email desde mi aplicativo utilizo la clase clsCDOmail y uso este código:
Set oMail = New clsCDOmail
With oMail
.servidor = "smtp.gmail.com"
.puerto = 465
.UseAuntentificacion = True
.ssl = True
.Usuario = "tedoysoporte@gmail.com"
.PassWord = "password"
.Asunto = licencia & ": " & mensaje
.de = "tedoysoporte@gmail.com"
.para = "tedoysoporte@gmail.com"
.Mensaje = txMensaje.text
.Enviar_Backup ' manda el mail
End With
Set oMail = Nothing
Cuando alguien instala el programa este programa me envia un email indicando que alguien lo instalo. Todo estuvo bien por mas de 1 año, hasta que algunos antivirus como el Avast delata esta acción. Para evitar "malos pensamientos naturales" de que me estoy enviando otra cosa, podría poner que la acción se realice avisando al cliente de esto (aunque igual no resuelve nada porque debajo uno se puede estar maleando), pero igual el antivirus salta y como saben no todos los clientes lo interpretan bien y la venta del sistema se me cae.
Si este método no es adecuado ¿cual me sugieren?. Estoy terminando de realizar un aplicativo que colgaré en mi web para que los navegantes lo descarguen, pero cuando este navegante lo instale y lo use quiero que el programa me envie un mensaje o email indicando que alguien instalo el programa y así tener presente cuantas personas han instalado el programa que no es lo mismo a saber cuantos lo descargaron que ya eso lo resolvi en la web. ¿Como podria hacer?
Gracias.
-
La mejor salida (más eficiente en menos tiempo) es que en lugar de mandar el mail desde el programa, abras un link hacia una web de contacto (o sea, enviar mail desde la web o archivarlo en algun lado), y problema solucionado :P
-
Hola está clase que usas Ivan envia ese email de forma anónima? O en una ventana emergente ? Lo que propone Raul creo que es como un form decontacto no?
-
No un form desconectado, sino hacerlo en web, con PHP u otras herramientas
Lo veo incluso mejor de que si te cambias de mail o te lo dan de baja :P
-
Hola, Yván.
Se me ocurren dos cosas.
Hay muchos softwares que requieren autenticación automática por internet. Este podría ser un caso. Si avisás al cliente mediante un mensaje que el programa necesita conectarse a internet para validarse, no creo que tengas problemas.
Por otro lado, ¿no se podría incluir un webbrowser no visible en tu aplicativo y abrir una página (tal vez creada al vuelo) donde envíes a tu sitio los datos necesarios (seguramente por POST para no dejar rastros en algún historial de URLs, si es que esto sucede)? ¿Esto sería detectado por un antivirus?
Un gran saludo.
-
La mejor salida (más eficiente en menos tiempo) es que en lugar de mandar el mail desde el programa, abras un link hacia una web de contacto (o sea, enviar mail desde la web o archivarlo en algún lado), y problema solucionado :P
Hola Raul. Pero ¿que pasa si el cliente no llena ese formulario?, tengo que asumir de plano que este cliente anonimo no llenara el formulario porque suele pasar y no tendría estadística real.
-
Hola está clase que usas Ivan envia ese email de forma anónima? O en una ventana emergente ? Lo que propone Raul creo que es como un form decontacto no?
De forma silenciosa diria, anónima no porque si se de que cliente se envia el correo. Osea, hasta antes de una actualización del Avast por ejemplo, el email se enviaba sin que el cliente se entere, incluso aun lo tengo en algo de 20 clientes a cuyo Avast ya le admitimos el envio de mensajes, de esa forma controlo a que cliente ya se le va a acabar la licencia, luego lo llamo para coordinar la renovación, con ellos no hay problema, pero el nuevo programa lo voy a dar libre porque me interesa la publicidad y queria una estadistica de el. Los downloads de la web no me es suficiente.
-
Me han llegado dos emails pidiendo el codigo de esta clase, y sinceramente lo tengo hace tanto tiempo que no recuerdo la fuente, asi que aqui lo publico.
En un Modulo de Clase (Copiar y pegar):
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
Dim oCDO As Object ' Variable de objeto Cdo.Message
' 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
Set oCDO = CreateObject("CDO.Message") ' Crea un Nuevo objeto 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 correo 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
'''''''''''''''''''''''''''''''''''''''''''''''
oCDO.To = mPara ' Dirección del Destinatario
oCDO.From = mDe ' Dirección del remitente
oCDO.Subject = mAsunto ' Asunto del mensaje
oCDO.TextBody = mMensaje ' Cuerpo del mensaje
'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
oCDO.Configuration.Fields.Update ' Actualiza los datos antes de enviar
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
Y con esto envio un correo desde el aplicaitivo, en el Load del sistema tambien tengo este codigo que despues de algunas validaciones se ejecuta de forma silenciosa (sin ventanas), pero en este caso es el mismo codigo pero desde un boton:
Private Sub BtEnviar_Click()
PicAviso.Visible = True
BtEnviar.Enabled = False
Label1 = "Enviando mensaje..."
Refresh
Set oMail = New clsCDOmail
With oMail
'datos para enviar
.servidor = "smtp.gmail.com"
.puerto = 465
.UseAuntentificacion = True
.ssl = True
.Usuario = "micorreo@gmail.com"
.PassWord = p15 & p2 & p7 & p9 & p14 'aqui armo el password
.Asunto = memTipoMensaje & ": " & memGlobalNombreEmpresaMEM & ": " & memG_MPER_NOM & ": PC " & memNumHD 'aqui armo el mensaje con una serie de datos adicionales.
' .Adjunto = "c:\archivo.zip" ' no lo uso porque no envio adjuntos.
.de = "micorreo@gmail.com"
.para = "micorreo@gmail.com"
.Mensaje = txMensaje.text & Chr(13) & Chr(13) & "Licencia: " & BASE.LbControlVesion
.Enviar_Backup ' manda el mail
End With
Set oMail = Nothing
End Sub
(http://i.snag.gy/a8OPU.jpg)
Saludos
-
Me han llegado dos emails pidiendo el codigo de esta clase, y sinceramente lo tengo hace tanto tiempo que no recuerdo la fuente, asi que aqui lo publico.
En un Modulo de Clase (Copiar y pegar):
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
Dim oCDO As Object ' Variable de objeto Cdo.Message
' 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
Set oCDO = CreateObject("CDO.Message") ' Crea un Nuevo objeto 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 correo 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
'''''''''''''''''''''''''''''''''''''''''''''''
oCDO.To = mPara ' Dirección del Destinatario
oCDO.From = mDe ' Dirección del remitente
oCDO.Subject = mAsunto ' Asunto del mensaje
oCDO.TextBody = mMensaje ' Cuerpo del mensaje
'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
oCDO.Configuration.Fields.Update ' Actualiza los datos antes de enviar
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
Y con esto envio un correo desde el aplicaitivo, en el Load del sistema tambien tengo este codigo que despues de algunas validaciones se ejecuta de forma silenciosa (sin ventanas), pero en este caso es el mismo codigo pero desde un boton:
Private Sub BtEnviar_Click()
PicAviso.Visible = True
BtEnviar.Enabled = False
Label1 = "Enviando mensaje..."
Refresh
Set oMail = New clsCDOmail
With oMail
'datos para enviar
.servidor = "smtp.gmail.com"
.puerto = 465
.UseAuntentificacion = True
.ssl = True
.Usuario = "micorreo@gmail.com"
.PassWord = p15 & p2 & p7 & p9 & p14 'aqui armo el password
.Asunto = memTipoMensaje & ": " & memGlobalNombreEmpresaMEM & ": " & memG_MPER_NOM & ": PC " & memNumHD 'aqui armo el mensaje con una serie de datos adicionales.
' .Adjunto = "c:\archivo.zip" ' no lo uso porque no envio adjuntos.
.de = "micorreo@gmail.com"
.para = "micorreo@gmail.com"
.Mensaje = txMensaje.text & Chr(13) & Chr(13) & "Licencia: " & BASE.LbControlVesion
.Enviar_Backup ' manda el mail
End With
Set oMail = Nothing
End Sub
(http://i.snag.gy/a8OPU.jpg)
Saludos
La fuente seguramente es de Recursos Visual Basic.
Yvan yo utilizo esa clase en un viejo aplicativo, y hasta ahora funciona. El unico problema es que si gmail detecta que el correo es como un spam lo bloquea y se jode. Para ello simplemente uso un ini donde coloco el correo, el password encriptado y listo, si por alguna razón me lo bloquea lo cambio en el archivo ini colocando otro correo y otro password y ya.
-
La fuente seguramente es de Recursos Visual Basic.
Yvan yo utilizo esa clase en un viejo aplicativo, y hasta ahora funciona. El unico problema es que si gmail detecta que el correo es como un spam lo bloquea y se jode. Para ello simplemente uso un ini donde coloco el correo, el password encriptado y listo, si por alguna razón me lo bloquea lo cambio en el archivo ini colocando otro correo y otro password y ya.
No entendí doc. O sea, si entendí la funcionalidad de lo que planteas, pero no entendí porque el gmail lo detectaria como correo spam cosa que a mi no me sucede, con el correo no tengo problema, es el antivirus que salta cuando quiero enviar un correo, esto claro solo la primera vez, luego le digo al antivirus que si es confiable y adios problema en esa pc.
Voy a ver si consigo una captura para mostrarles el mensaje que me sale.
-
Acabo de instalar en un virtual el avast y este es el mensaje que me sale cuando envio un mensaje de forma silenciosa:
(http://i.snag.gy/X68ea.jpg)
Luego cuando quiero volver a enviar un mensaje (ya no de forma silenciosa) se me traba el aplicativo (arrancado desde VB6) y se cuelga, ni siquiera puedo cerrar el vb6, incluso desactive el antivirus y sigue colgado, tuve que matarlo desde Administrador de tareas.
Creo que tendria que desactivar algo... pero no se si en el Gmail... o en el codigo???
Voy a probar poniendo .ssl = false a ver si resulta.
-
No, con .ssl = false no envia ningún correo.
-
Lo he vuelto a poner en true, he vuelto a ejecutar el código y ya no sale el mensaje de avast y el correo si llego... tonses, solo me queda hacer lo siguiente:
Cuando se ejecuta por primera vez el programa, daré un mensaje diciendo que probablemente su antivirus informe que el envio de codigo de registro y bla bla sera detectado por bla bla y hasta eso ya abre enviado el mensaje, ya lsa segunda vez no abra problemas al parecer.
Ojala halla una mejor solución.
Saludos
-
hola estoy intentando correr un exe que solo tiene la clase que pasaste y un boton que envia el email en un Virtual M de XP que solo tiene el Avast instalado y internet configurado y me tira el error
Run-Time error '429'
Que requiere wininet.dll ? puede ser esa dll que ustiliza ?
-
uff, la verdad alli me agarras amigo, yo encontré ese código y lo copypastee y me funciono, pero si creo que si usa el wininet.dll.
Te comento que el código funciona y recibo los correos, es para estos potenciales nuevos clientes que pueda que tengan el Avast o similar y le salga ese mensaje que arriba mostre. Luego que le di Aceptar a la segunda vez ya no me salio la advertencia del Avast y me llegan los correos.
-
Hola Yvan creo que complicas las cosas enviando un email, porque no haces algo asi como te dice Raul, pero no enviando un email, sino con una simple pagina en php, que implemente un contador, entonces cuando la aplicación se ejecute por primera vez este abre un link de tu pagina.php, este escrive en un archivo de texto plano, las cantidades de llamadas, y luego tu puedes mirar ese archivo para ver cuantas aplicaciones hay instaladas, es la forma mas sensilla.
mira esto que facil
http://www.original-design.es/tutoriales/contador_en_php.php
luego para consultar esa pagina con php, lo haces como ya usas antes en esos ejemplos que te pase.
@Bazooka que cosa rara ese error, me sorprende que de un error de que no existe wininet.dll en xp?¿, es alguna versión especial?
-
Gracias Leandro, creo que no habia captado bien al amigo Raul, cierto voy a intentar esa forma que explican. Muchisimas gracias.
-
Ya esta, gracias Raul y Leandro, he usado ese método.
Saludos