Problema con emails. SMTP 5.5.1 Autentificación.

Iniciado por #Aitor, 24 Febrero 2018, 19:33 PM

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

#Aitor

Buenas, he estado haciendo un programa que enviara un email y adjuntara una foto en él, el problema está en que, aún cuándo a mi me funciona sin problema, en los otros tres ordenadores dónde lo he probado el resultado ha sido una excepción no controlada (no uso try/catch) sobre un problema de autentificación en el SMTP.

Código (vb.net) [Seleccionar]
Public Function Email(path As String)
       Dim MIHTML As String = "<html><body><img src=""cidIMG1"">"

       Dim VISTAHTML As AlternateView = AlternateView.CreateAlternateViewFromString(MIHTML, Nothing, System.Net.Mime.MediaTypeNames.Text.Html)

       Dim IMAGEN1 As LinkedResource = New LinkedResource(path, System.Net.Mime.MediaTypeNames.Image.Jpeg)
       IMAGEN1.ContentId = "IMG1"
       VISTAHTML.LinkedResources.Add(IMAGEN1)

       Dim MENSAJE As MailMessage = New MailMessage
       MENSAJE.AlternateViews.Add(VISTAHTML)

       MENSAJE.From = New MailAddress("thisinsttheemailtho@gmail.com")
       MENSAJE.To.Add("0xbeetesting@gmail.com")
       MENSAJE.Subject = "Pic."

       Dim MISMT As SmtpClient = New SmtpClient("SMTP.GMAIL.COM")
       MISMT.EnableSsl = True
       MISMT.Port = "587"
       MISMT.Credentials = New Net.NetworkCredential("thisisnttheemailtho@gmail.com", "thisinstthepasswordtho")

       MISMT.Send(MENSAJE)
   End Function


He probado si fuera por ser en cuenta local, pero ya tengo más que comprobado que no. ¿Alguna idea? Y en el caso de no poder solucionarse, ¿alguna idea de pasar esa foto a algún otro sitio que no sea via e-mail?

Edito: Ahora que me percato esta el SSL activo, quizá es por eso. (Voy a testear y ahora editaré otra vez)
Edito otra vez: Sigue dando error, pero esta ocasion es diferente.

En windows 7, con SSL True:


En windows 7, con SSL False:


He probado en W8 y W10 con SSL True y el error es exactamente el mismo que la primera imagen, también con cuentas admin y locales.

Insisto en que en mi pc, W10, funciona sin problema, pero desconozco el por qué.
Gracias!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

**Aincrad**

yo también tenia es problema y por eso hice este post:

https://foro.elhacker.net/net/clase_o_modulo_para_enviar_correo_gmailhotmailyahoo-t480147.0.html

la solución al problema fue usar esta clase del compañero @Elektro:

https://pastebin.com/YXatPRiU esta es la clase, solo es para enviar Gmail .

Pero si quieres usar hotmail lee el post que te puse y busca la otra clase de Elektro y modificala.  ;D

PD : Empezando la Clase te dice como usarla .  ;D Agradécele a @Electro que es el autor.




Eleкtro

#2
Gracias por la mención, pero la clase que compartí de mi framework ElektroKit no es una solución al problema, sino una ayuda para envíar e-mails de forma abstracta y sencilla. Lo único y realmente importante a tener en cuenta es esto que ya he repetido en varias ocasiones en el foro:

Cita de: Eleкtro en 12 Diciembre 2017, 19:48 PMrecuerda que para poder enviar e-mails por GMail de forma programática, primero tienes que permitir el uso de aplicaciones de terceros, puedes hacerlo desde aquí:




Cita de: #Aitor en 24 Febrero 2018, 19:33 PMa mi me funciona sin problema, en los otros tres ordenadores dónde lo he probado el resultado ha sido una excepción no controlada (no uso try/catch) sobre un problema de autentificación en el SMTP.

Es evidente que si el código funciona usando tu cuenta de Gmail ello implica que en algún momento ya habilitaste el uso de "aplicaciones menos seguras" en tu cuenta de Google, pero quizás... ¿es posible que ya no recordases esa opción?, me refiero, si cada PC/usuario usa una cuenta distinta de gmail para envíar los emails a través de tu programa entonces cada una de esas cuentas debe habilitar el uso de "aplicaciones menos seguras", de lo contrario se disparará una excepción de autentificación en el servidor SMTP al intentar enviar un correo precisamente como el problema que has descrito.

Si ese no es el problema entonces no se me ocurre que otra cosa puede ser, problemas de red puede ser cualquier cosa...

Saludos.








#Aitor

#3
Cita de: Eleкtro en 25 Febrero 2018, 01:01 AM
Gracias por la mención, pero la clase que compartí de mi framework ElektroKit no es una solución al problema, sino una ayuda para envíar e-mails de forma abstracta y sencilla. Lo único y realmente importante a tener en cuenta es esto que ya he repetido en varias ocasiones en el foro:




Es evidente que si el código funciona usando tu cuenta de Gmail ello implica que en algún momento ya habilitaste el uso de "aplicaciones menos seguras" en tu cuenta de Google, pero quizás... ¿es posible que ya no recordases esa opción?, me refiero, si cada PC/usuario usa una cuenta distinta de gmail para envíar los emails a través de tu programa entonces cada una de esas cuentas debe habilitar el uso de "aplicaciones menos seguras", de lo contrario se disparará una excepción de autentificación en el servidor SMTP al intentar enviar un correo precisamente como el problema que has descrito.

Si ese no es el problema entonces no se me ocurre que otra cosa puede ser, problemas de red puede ser cualquier cosa...

Saludos.

Hola Elektro.

El email es siempre el mismo y tiene la configuración activada para el uso de aplicaciones externas.

Problemas de internet no pueden ser porque son tres ordenadores de tres diferentes sitios, (ciudades). Me he percatado que tengo un aviso de seguridad, diciendome que alguien de X ciudad intentó acceder a mi cuenta, misma ciudad de dónde están esos ordenadores, pero insisto en que tengo activada esa opción.

Ahora bien, otro ordenador de la misma ciudad que yo tampoco lo puede enviar.

Así qué realmente no sé de dónde viene el problema...

Edito:
Este es el mensaje que me envian al email cuándo el programa intenta acceder al email.

Alguien tiene tu contraseña; Google ha evitado que inicie sesión.  Más información
Dispositivo desconocido
Hora:    Hace 5 minutos
Ubicación:    Zaragoza, España
Dirección IP:    XX.XXX.XXX.XX


Mi idea, es, que gmail debe tener un algoritmo algo tal que así, guarda tu ultima conexión con su localización, y si la siguiente localización es una ciudad diferente, compara el intevarlo que ha habido desde la ultima conexion hasta la nueva, y la longitud en tiempo que hay desde la primera localizacion hasta la nueva, y si es fisicamente imposible estar ahi, reenvia el mensaje de alerta.

Eso explicaria porque a los ordenadores de mi ciudad, no les manda el mensaje de seguridad.

Ahora bien, no les manda el mensaje de seguridad pero tampoco gmail le conecta.

Si al menos me diese la alerta de seguridad, podria darle permiso al ordenador en cuestion aunque fuese manual, ya que está pensado para un ordenador de mi misma localidad.
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

Eleкtro

#4
Cita de: #Aitor en 25 Febrero 2018, 01:18 AMMe he percatado que tengo un aviso de seguridad, diciendome que alguien de X ciudad intentó acceder a mi cuenta, misma ciudad de dónde están esos ordenadores

Normal, lo mismo sucedería si usas una VPN o un proxy para loguearte a esa cuenta (puedes hacer la prueba, yo a veces me conecté a mi cuenta por descuido con una VPN activada, y al rato me llegaban ese tipo de emails). No pongo la mano en el fuego pero quizás ese podría ser el problema, que Google deniegue automáticamente el acceso a esos otros PC por que la cuenta se creó desde tu PC e IP, y entonces a esos otros PC los considere como un intento no autorizado de acceso por los factores que sea que Google utilice para considerarlo así (distinta IP + distinto nombre de PC + distinta ubicación geográfica, tal vez, quien sabe), generando como resultado un fallo de autentificación.

De ser así, supongo que en esa cuenta de google compartida en algún sitio se debe poder añadir una excepción para permitir que esos otros pcs accedan a la cuenta, debe haber alguna "lista blanca" de accesos, ¿quizás se pueda añadir la excepción a ese PC desde el email que te envió Google?.




De todas formas, si la idea es usar una cuenta de Gmail compartida por varios PC para enviar un e-mail, entonces supongo que lo ideal sería que uses la API de Gmail para .NET, es decir, primero registrar tu programa, y luego simplemente en tu programa cargarías el archivo.json que contiene los datos secretos (Client Id y Client Secret) para autorizar el acceso a dicha cuenta, y entonces enviar el email. Supongo que eso evitaría que Google considerase esos otros PC como accesos no autorizados, deberías probarlo al menos para salir de dudas, pero no te aseguro nada ya que nunca me he encontrado en la situación de tener que usar la misma cuenta de correo de gmail en distintos PC.

Si te animas a hacerlo como te recomiendo, aquí tienes por donde empezar para registrar tu aplicación, y documentación sobre la API de Gmail para .NET:

Google API Console:

Google API Console Credentials:

Application Authorizations:

Gmail API Reference:

Gmail API Quickstart:

Ten en cuenta que para enviar un email con la API de Gmail es bastante tedioso, no es como la clase MailMessage de .NET, aquí tienes que enviar el email entero o "raw" (siguiendo las especificaciones del formato RFC-2822). Una forma de simplificar dicha tarea es utilizando la librería AE.Net.Mail o MimeKit. Personálmente te recomiendo MimeKit, ya que aparte de estar más actualizada, puedes pasar una instancia de la clase MailMessage a la clase MimeMessage para realizar la conversión del mensaje.

Aquí tienes un ejemplo de uso de la API de Gmail junato a MimeKit para enviar un email con archivo adjunto:

PD: aprovecho para mencionar que dentro del extenso contenido que ofrezco en mi framework comercial ElektoKit, también se ofrece un cliente completo de la API de Gmail para administrar una cuenta personal, es una clase con nombre 'GmailClient' la cual tiene por porpósito abstraer de cualquier dificultad de uso a la API de Gmail. Con dicha clase el usuario se puede autentificar a su cuenta simplemente llamando a un método que tiene por nombre 'Authorize' (o 'AuthorizeAsync'), puede enviar emails de texto o html con y sin archivos adjuntos, crear borradores, obtener los correos de una carpeta, y reciclar correos o eliminarlos definitivamente.

Saludos!








#Aitor

Cita de: Eleкtro en 25 Febrero 2018, 04:33 AM
Normal, lo mismo sucedería si usas una VPN o un proxy para loguearte a esa cuenta (puedes hacer la prueba, yo a veces me conecté a mi cuenta por descuido con una VPN activada, y al rato me llegaban ese tipo de emails). No pongo la mano en el fuego pero quizás ese podría ser el problema, que Google deniegue automáticamente el acceso a esos otros PC por que la cuenta se creó desde tu PC e IP, y entonces a esos otros PC los considere como un intento no autorizado de acceso por los factores que sea que Google utilice para considerarlo así (distinta IP + distinto nombre de PC + distinta ubicación geográfica, tal vez, quien sabe), generando como resultado un fallo de autentificación.

De ser así, supongo que en esa cuenta de google compartida en algún sitio se debe poder añadir una excepción para permitir que esos otros pcs accedan a la cuenta, debe haber alguna "lista blanca" de accesos, ¿quizás se pueda añadir la excepción a ese PC desde el email que te envió Google?.




De todas formas, si la idea es usar una cuenta de Gmail compartida por varios PC para enviar un e-mail, entonces supongo que lo ideal sería que uses la API de Gmail para .NET, es decir, primero registrar tu programa, y luego simplemente en tu programa cargarías el archivo.json que contiene los datos secretos (Client Id y Client Secret) para autorizar el acceso a dicha cuenta, y entonces enviar el email. Supongo que eso evitaría que Google considerase esos otros PC como accesos no autorizados, deberías probarlo al menos para salir de dudas, pero no te aseguro nada ya que nunca me he encontrado en la situación de tener que usar la misma cuenta de correo de gmail en distintos PC.

Si te animas a hacerlo como te recomiendo, aquí tienes por donde empezar para registrar tu aplicación, y documentación sobre la API de Gmail para .NET:

Google API Console:

Google API Console Credentials:

Application Authorizations:

Gmail API Reference:

Gmail API Quickstart:

Ten en cuenta que para enviar un email con la API de Gmail es bastante tedioso, no es como la clase MailMessage de .NET, aquí tienes que enviar el email entero o "raw" (siguiendo las especificaciones del formato RFC-2822). Una forma de simplificar dicha tarea es utilizando la librería AE.Net.Mail o MimeKit. Personálmente te recomiendo MimeKit, ya que aparte de estar más actualizada, puedes pasar una instancia de la clase MailMessage a la clase MimeMessage para realizar la conversión del mensaje.

Aquí tienes un ejemplo de uso de la API de Gmail junato a MimeKit para enviar un email con archivo adjunto:

PD: aprovecho para mencionar que dentro del extenso contenido que ofrezco en mi framework comercial ElektoKit, también se ofrece un cliente completo de la API de Gmail para administrar una cuenta personal, es una clase con nombre 'GmailClient' la cual tiene por porpósito abstraer de cualquier dificultad de uso a la API de Gmail. Con dicha clase el usuario se puede autentificar a su cuenta simplemente llamando a un método que tiene por nombre 'Authorize' (o 'AuthorizeAsync'), puede enviar emails de texto o html con y sin archivos adjuntos, crear borradores, obtener los correos de una carpeta, y reciclar correos o eliminarlos definitivamente.

Saludos!

Hola otra vez Elektro, y gracias por tus maravillosas respuestas.

Realmente encuentro tedioso/complicado lo que dices, no tengo muchos conocimientos sobre programación, más bien lo justo.

Se me había ocurrido la idea de en lugar de mandarlo por E-mail, lo mandase a un servidor FTP, a fin de cuentas lo unico que necesito es tener esas imagenes que se generan periodicamente almacenadas en un solo sitio. ¿Esto sería aún más lidioso? ¿Se te ocurre alguna forma de subir esas imagenes que no sean por via e-mail?

De verdad que lamento mucho ser tan pedante con este tema.

Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

Eleкtro

#6
Cita de: #Aitor en 25 Febrero 2018, 06:08 AM¿Esto sería aún más lidioso?

No. Puedes usar la clase WebClient o también FtpWebRequest para subir un archivo a un FTP. Un ejemplo:

Código (vbnet) [Seleccionar]
Dim file As New FileInfo("C:\image.jpg")

Using wc As New WebClient With {.Credentials = New NetworkCredential("username", "password")}
   wc.UploadFile(New Uri(Path.Combine("ftp://hostname/directorio/", file.Name)), "STOR", file.FullName)
End Using





Cita de: #Aitor en 25 Febrero 2018, 06:08 AMDe verdad que lamento mucho ser tan pedante con este tema.

Yo por pedancia entiendo otra cosa (alguien que muestra sus conocimientos de forma engreida e inoportuna), de todas formas no me has parecido alguien pedante ni pesado ni nada de nada, aquí estamos para ayudar, y a mi me gusta resolver dudas siempre que pueda resolverlas... sobre todo de .NET, es mi droga favorita, así que tu sigue preguntando sin piedad si tienes más dudas. xD

Saludos!








#Aitor

#7
Cita de: Eleкtro en 25 Febrero 2018, 06:56 AM
No. Puedes usar la clase WebClient o también FtpWebRequest para subir un archivo a un FTP. Un ejemplo:

Código (vbnet) [Seleccionar]
Dim file As New FileInfo("C:\image.jpg")

Using wc As New WebClient With {.Credentials = New NetworkCredential("username", "password")}
   wc.UploadFile(New Uri(Path.Combine("ftp://hostname/directorio/", file.Name)), "STOR", file.FullName)
End Using





Yo por pedancia entiendo otra cosa (alguien que muestra sus conocimientos de forma engreida e inoportuna), de todas formas no me has parecido alguien pedante ni pesado ni nada de nada, aquí estamos para ayudar, y a mi me gusta resolver dudas siempre que pueda resolverlas... sobre todo de .NET, es mi droga favorita, así que tu sigue preguntando sin piedad si tienes más dudas. xD

Saludos!

Hola otra vez... Las 7:16 ¿No duermes?   :silbar:

Investigando me encontré con esto:

Código (vb.net) [Seleccionar]
My.Computer.Network.UploadFile(path, servidor, usuario, password, True, 500)

Que bueno, hasta dónde veo funciona sin problema, me sube la imagen al servidor y todo guay, la única pega es que en la subida genera una interfaz gráfica con dicha subida, ¿alguna forma de ocultar esa ventanita?



Aprovecho y te pregunto, el 500 supongo que será el intervalo de espera antes de lanzar una excepción, pero ese true no sé de qué es, al principio pensé que quizá era de la interfaz, le puse en false y dejó de funcionar.

https://msdn.microsoft.com/es-es/library/ms127893(v=vs.110).aspx

No encuentro mención a ese boleano...

Ahora probaré con lo que tú me dices.

Por último, veo VB.net increiblemente potente, y quisiera realmente en algún momento dedicarle el tiempo que se merece, ya que me parece increiblemente flexible, ahora bien, lejos de la propia página de microsoft, ¿recomiendas algún sitio o documento que pudiese ser de relevante utilidad? ya que estoy acostumbrado a programar - cosas simples - en c++, pero realmente nada tiene que ver con vb.net, y en cuánto al paradigma de orientación a objetos lo llevo bastante mal  :-[.

Gracias por todo Elektro! :)

Edito:

Cada vez más feliz.

Estoy leyendo por aquí para ocultar la interfaz, debe estar ShowUI en false, ahora bien, se supone que ese True si es de el ShowUI, pero al ponerle en false deja de funcionar, lanzandome un error al ejecutar el programa.



Edito once again:

Vale, soy gilipollas, el error era de otra cosa... xD Don't hate me too much.
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

Eleкtro

#8
Cita de: #Aitor en 25 Febrero 2018, 07:27 AMla única pega es que en la subida genera una interfaz gráfica con dicha subida, ¿alguna forma de ocultar esa ventanita?

ese true no sé de qué es, al principio pensé que quizá era de la interfaz, le puse en false y dejó de funcionar.

No encuentro mención a ese boleano...

No encuentras mención a ese parámetro por que estás mirando la documentación de la sobrecarga equivocada...

EDITO: ups, coloqué mal el enlace. corregido.

CitarshowUI
   Type: System.Boolean
   True para mostrar el progreso de la operación; de lo contrario, False. El valor predeterminado es False.

Como puedes ver por ti mismo y como parece que al final ya te diste cuenta de esto, el valor booleano precisamente sirve para indicar si quieres mostrar la interfaz gráfica o no. al ponerlo en False no se muestra, y por eso te pareció que "dejó de funcionar".

consejo: no te acostumbres demasiado a usar los métodos del espacio de nombres "My.Computer" más de lo realmente necesario, son muy cómodos de utilizar pero a costa de un precio: no te permiten tener ningún control sobre tus acciones (como por ejemplo en este caso poder determinar el progreso de la operación de upload del archivo al FTP).




Cita de: #Aitor en 25 Febrero 2018, 07:27 AM
lejos de la propia página de microsoft, ¿recomiendas algún sitio o documento que pudiese ser de relevante utilidad?

No, MSDN is the way to learn. Se que es una pesadilla tan siquiera considerar el ponerse a leer de la A a la Z la MSDN (o docs.microsoft.com, la nueva MSDN), pero no vas a encontrar libro ni tutorial tan denso y lleno con toda la información que necesitas saber sobre cualquier aspecto relacionado con la programación .NET y la programación de Windows.

Alternativa y/o complementariamente te recomendaria tutoriales de pluralsight.com, los hay muy profesionales, muy bien estructurizados, y llenos de ejemplos (código fuente incluido), pero los vas a encontrar todos en perfecto Inglés, y a veces no tan perfecto ya que hay rusos y de todo, jeje, pero son unos gurús. Opcionálmente tienes páginas como codigofacilito.com y servicios similares en Español, pero considero que no son tan... bueh... no es lo mismo.

Aquí tienes varios enlaces con recursos de todo tipo para el aprendizade de .NET / VB.NET:
...aunque la mayoría apuntan a la página de MSDN, pero muchos otros no.

Y ten en cuenta que en la propia MSDN (y en docs.microsoft.com) hay guías básicas para principantes, para aprender VB.NET desde cero, desde una guía para guiarte en el desarrollo de tu primera aplicación...





Cita de: #Aitor en 25 Febrero 2018, 07:27 AMen cuánto al paradigma de orientación a objetos lo llevo bastante mal  :-[.

Quizás esto pueda ayudarte en algún aspecto sobre el concepto y la aplicación de clases (o tipos), y objetos:

( los enlaces que puse al final de ese comentario. )

...si no recuerdo mal, creo que en el contenido de esos artículos no se profundizaba en conceptos de la POO como la encapsulación, herencia, polimorfismo, abstracción, interfaces y etc, pero para todo ello tienes un artículo dedicado en MSDN con su significado y explicación y ejemplos para aprender y practicar, solo tienes que buscar las cosas en MSDN y empezar a estudiarlas.




Cita de: #Aitor en 25 Febrero 2018, 07:27 AMLas 7:16 ¿No duermes?   :silbar:

Dormir es antiproductivo, y todavía no se me ha pasado el efecto de la "droga"... no estás ayudando en eso. ;)

Un saludo!








srWhiteSkull

Cita de: Eleкtro en 25 Febrero 2018, 08:42 AM



Dormir es antiproductivo, y todavía no se me ha pasado el efecto de la "droga"... no estás ayudando en eso. ;)

Un saludo!
;D