Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#1231
Foro Libre / Re: La Tierra es... NO plana.
17 Febrero 2018, 20:55 PM
Pues vaya, si que ha tenido expectación este thread a largo plazo...

Lo que no se puede descartar hasta que sea demostrado o refutado es la teoría cientifica del multiverso, que eso ya es Ciencia y no conspiranoias Illuminati así que no me mireis mal... y en fin, que a raíz de eso quizás pueda existir una tierra plana en alguno de los otros universos xD... por poder, todo es posible en esas circunstancias de supuesta aleatoriedad, ¿no?.

PD: ¿tu que opinas sobre mi hipótesis, Orubatosu?.  :-)

Saludos!
#1232
Cita de: El_Andaluz en 14 Febrero 2018, 00:37 AMhe estado mirando una herramienta que se llama TunesGo

Has elegido bien, yo te iba a recomendar la aplicación MobileGo de Wondershare ya que la uso desde siempre y considero que no hay ninguna otra aplicación-administradora de móviles que esté al mismo nivel, pero si ya estás utilizando TunesGo que también es de Wondershare pues... perfecto.

Cita de: El_Andaluz en 14 Febrero 2018, 00:37 AMexportar mi contacto de teléfonos a mi PC me salen varias opciones pero no se bien cual elegir

No se exactamente que opciones te dará el TunesGo, pero imagino que te permitirá llevar a cabo la exportación en los formatos vCard y CSV, en ese caso da exactamente lo mismo cual de los dos elijas ya que luego podrás importar cualquiera de esos dos formatos. Pero puestos a elegir quizás deberías considerar que el formato vCard o también conocido por VCF (Virtual Contact File) es un formato más orientado o específico para representar ese tipo de datos...


CSV y VCF ambos son archivos de texto plano, sin embargo el formato CSV te podría resultar algo más legible ya que basicamente es una tabla con sus filas y columnas. Si ese detalle te es indiferente entonces yo escogería el formato VCF simplemente por ser algo más específico que un CSV, aunque ya te digo que da lo mismo cual elijas, de hecho, incluso en la lista de Contactos de Windows te permite importar contactos en CSV y VCF...

Saludos!
#1233
.NET (C#, VB.NET, ASP) / Re: Iniciar Clase
13 Febrero 2018, 11:02 AM
Cita de: PETTETE en 13 Febrero 2018, 10:07 AMllevo un tiempillo programando con vb.net y c# pero todo este tiempo no he utilizado clases.

Ese tipo de comentario a estas alturas demuestra que te estás precipitando y algo está fallando en el aprendizaje autodidacta... por que te estás saltando pasos esenciales por el camino.

Deberías empezar por leer la definición de lo que es una clase hasta comprenderlo bien, y veo realmente necesario que leas una guía de introducción básica al lenguaje C# o VB.NET y los principales conceptos de la programación orientada a objetos, basicamente por que llevas mucho tiempo programando en .NET sin saber o entender ni diferenciar lo que es una clase... cuando en realidad has estado utilizado clases cientos de veces para hacer cualquier cosa.




Cita de: PETTETE en 13 Febrero 2018, 10:07 AMcomo puedo ejecutar la clase?

El término apropiado es instanciar. Para crear una instancia de tu clase (suponiendo que hayas definido una clase instanciable) lo harías de la misma forma que lo has estado haciendo todo este tiempo con el resto de clases definidas en la librería de clases de .NET Framework, es decir, usando al operador New (o new en C#) para llamar al método constructor de tu clase.




Cita de: PETTETE en 13 Febrero 2018, 10:07 AM¿algún consejito?

Creo que no hay mejor consejo que te pueda servir más que por tu parte empieces a estudiar y practicar para que comprendas lo que es cada cosa. Aquí abajo está todo lo que necesitas saber para resolver la duda que tienes y de paso aprender un poco, empieza a leer...


Saludos!
#1234
Cita de: DSREY en 12 Febrero 2018, 16:49 PMDONDE ESTA EL LINK..¿?¿?

Había un problema con la imagen que coloqué en el BBCODE... ya "caducó" y no aparecia ni la imagen ni el enlace...

Ya está corregido el enlace.

saludos!
#1235
Foro Libre / Re: Minado al estilo ruso
12 Febrero 2018, 10:53 AM
La obsesión por el minado de criptomonedas es peor de lo que ya fue la fiebre del Pokémon GO...
#1236
Dudas Generales / Re: Es posible hacer esto?
12 Febrero 2018, 03:39 AM
Cita de: big50 en 11 Febrero 2018, 22:23 PMlo ideal seria que algun programador que este dispuesto a hacer esto...

Aquí tienes una ayuda gratuita:

Con ese código (para quien sepa programar en .NET) tendrías la mitad o casi la mitad del trabajo hecho, eso suponiendo que quieras usar 10minutemail.com (de lo contrario habría que hacerle muchos cambios al código), aunque te faltaría una lista de proxies por la restricción que ya mencioné...

PD: el código lo desarrollé por que la idea de implementar la característica de usar cuentas de correo deshechables me pareció una funcionalidad interesante para añadirla a mi framework comercial, tampoco soy aquí una persona super altruista... xD, aunque por otro lado comparto este y un porrón más de códigos útiles y reutilizables sin ánimo de lucro.

Saludos!
#1237
¿Cómo crear y administrar una cuenta de correo deshechable/temporal?.

El siguiente código que voy a mostrar sirve para crear una cuenta de correo temporal usando el servicio https://10minutemail.com/, leer e-mails entrantes, y responderlos.

Hasta donde han llegado mis análisis y experimentos todo parece indicar que funciona como es esperado. Si encuentran algún problema háganmelo saber para corregir el código.

LO BUENO:

  • Renovación automática del tiempo de vida de la dirección deshechable. Dicho de otro modo: la dirección de correo NO expira... hasta que se libere la instancia de clase.
  • Implementación thread-safe.
  • Implementación orientada a eventos.
  • Funcionalidad para obtener y leer los correos entrantes.
  • Funcionalidad para responder a correos entrantes usando la dirección de correo deshechable.
  • Simple, abstracto, es muy sencillo de usar.

LO MALO:

  • No añadí soporte para leer archivos adjuntos en los mails recibidos.
  • No añadí soporte para responder a un destinatario de un mail recibido.
  • 10minutemail.com es un servicio gratuito y por ende también limitado, solo permite crear alrededor de 3-5 direccioens e-mail por minuto y por IP.
    Sin embargo, probablemente esta limitación se podría bypassear usando proxies.




1.

Primero de todo he creado una interfaz con nombre IDisposableMail, la cual podremos rehutilizar en el futuro para representar cualquier otro servicio de correo temporal similar a https://10minutemail.com/. Evidentemente pueden extender la interfaz si lo desean.

Código (vbnet) [Seleccionar]
#Region " Imports "

Imports System.Net.Mail

#End Region

#Region " IDisposableMail "

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Represents a disposable mail address.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <remarks>
''' Wikipedia article: <see href="https://en.wikipedia.org/wiki/Disposable_email_address"/>
''' </remarks>
''' ----------------------------------------------------------------------------------------------------
Public Interface IDisposableMail

#Region " Events "

   ''' <summary>
   ''' Occurs when a new inbox message arrived.
   ''' </summary>
   Event MailMessageArrived As EventHandler(Of MailMessageArrivedEventArgs)

#End Region

#Region " (Public) Methods "

   ''' <summary>
   ''' Creates a new temporary mail address.
   ''' </summary>
   ''' <param name="updateInterval">
   ''' The time interval to check for new incoming mail messages.
   ''' </param>
   Sub CreateNew(ByVal updateInterval As TimeSpan)

   ''' <summary>
   ''' Renews the life-time for the current temporary mail address.
   ''' </summary>
   Sub Renew()

#End Region

#Region " (Private) Functions "

   ''' <summary>
   ''' Gets the mail address.
   ''' </summary>
   ''' <returns>
   ''' The mail address.
   ''' </returns>
   Function GetMailAddress() As MailAddress

   ''' <summary>
   ''' Gets the inbox message count.
   ''' </summary>
   ''' <returns>
   ''' The inbox message count.
   ''' </returns>
   Function GetMessageCount() As Integer

   ''' <summary>
   ''' Gets the inbox messages.
   ''' </summary>
   ''' <returns>
   ''' The inbox messages.
   ''' </returns>
   Function GetMessages() As IEnumerable(Of MailMessage)

   ''' <summary>
   ''' Gets the time left to expire the current temporary mail address.
   ''' </summary>
   ''' <returns>
   ''' The time left to expire the current temporary mail address.
   ''' </returns>
   Function GetExpirationTime() As TimeSpan

#End Region

End Interface

#End Region





2.

Para el evento IDisposableMail.MailMessageArrived creé la siguiente clase con nombre MailMessageArrivedEventArgs, la cual proveerá los datos del evento:

Código (vbnet) [Seleccionar]
#Region " Imports "

Imports System.Net.Mail
Imports System.Runtime.InteropServices

#End Region

#Region " MailMessageArrivedEventArgs "

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Represents the event data for the <see cref="IDisposableMail.MailMessageArrived"/> event.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <seealso cref="EventArgs" />
''' ----------------------------------------------------------------------------------------------------
<ComVisible(True)>
Public NotInheritable Class MailMessageArrivedEventArgs : Inherits EventArgs

#Region " Properties "

   ''' <summary>
   ''' Gets the mail message.
   ''' </summary>
   ''' <value>
   ''' The mail message.
   ''' </value>
   Public ReadOnly Property MailMessage As MailMessage

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Initializes a new instance of the <see cref="MailMessageArrivedEventArgs"/> class.
   ''' </summary>
   ''' <param name="msg">
   ''' The mail message that arrived.
   ''' </param>
   Public Sub New(ByVal msg As MailMessage)
       Me.MailMessage = msg
   End Sub

#End Region

End Class

#End Region


3.

Seguidamente, extendí la clase WebClient para añadirle soporte para el uso de cookies, esto no es estrictamente necesario, la alternativa sería usar la clase HttpWeRequest y etc, pero de esta forma añadimos cierto nivel de abstracción adicional en la clase WebClient para poder utilizarla para este fin, y así podremos simplificar mucho el código necesario para escribir las solicitudes/requests al servicio de 10minutemail.com...

Código (vbnet) [Seleccionar]
#Region " Imports "

Imports System.ComponentModel
Imports System.Drawing
Imports System.Net
Imports System.Runtime.InteropServices

#End Region

#Region " ElektroWebClient "

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Represents a <see cref="WebClient"/> with support for cookies.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <remarks>
''' Original idea taken from: http://www.codingvision.net/tips-and-tricks/c-webclient-with-cookies
''' </remarks>
''' ----------------------------------------------------------------------------------------------------
<DisplayName("ElektroWebClient")>
<Description("A extended WebClient component, with support for cookies.")>
<DesignTimeVisible(False)>
<DesignerCategory("Component")>
<ToolboxBitmap(GetType(Component), "Component.bmp")>
<ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Allow)>
<ComVisible(True)>
Public Class ElektroWebClient : Inherits WebClient

#Region " Properties "

   ''' <summary>
   ''' Gets or sets a value indicating whether cookies are enabled.
   ''' </summary>
   ''' <value>
   ''' <see langword="True"/> if cookies are enabled; otherwise, <see langword="False"/>.
   ''' </value>
   Public Property CookiesEnabled As Boolean

   ''' <summary>
   ''' Gets the cookies.
   ''' </summary>
   ''' <value>
   ''' The cookies.
   ''' </value>
   Public ReadOnly Property Cookies As CookieContainer
       Get
           Return Me.cookiesB
       End Get
   End Property
   ''' <summary>
   ''' (Backing field)
   ''' <para></para>
   ''' The cookies.
   ''' </summary>
   Private cookiesB As CookieContainer

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Initializes a new instance of the <see cref="ElektroWebClient"/> class.
   ''' </summary>
   Public Sub New()
       MyBase.New()
   End Sub

#End Region

#Region " Inherited Methods "

   ''' <summary>
   ''' Returns a <see cref="WebRequest"/> object for the specified resource.
   ''' </summary>
   ''' <param name="address">
   ''' A <see cref="Uri"/> that identifies the resource to request.
   ''' </param>
   ''' <returns>
   ''' A new <see cref="WebRequest"/> object for the specified resource.
   ''' </returns>
   Protected Overrides Function GetWebRequest(ByVal address As Uri) As WebRequest
       If Not (Me.CookiesEnabled) Then
           Return MyBase.GetWebRequest(address)
       End If

       Dim request As WebRequest = MyBase.GetWebRequest(address)
       If (TypeOf request Is HttpWebRequest) Then
           If (Me.cookiesB Is Nothing) Then
               Me.cookiesB = New CookieContainer()
           End If
           DirectCast(request, HttpWebRequest).CookieContainer = Me.cookiesB
       End If
       Return request
   End Function

#End Region

End Class

#End Region





4.

Esta es la última pieza de toda esta implementación, una clase con nombre TenMinuteMail que nos servirá para representar y administrar el correo deshechable...

Código (vbnet) [Seleccionar]
#Region " Imports "

Imports System.Diagnostics.CodeAnalysis
Imports System.Linq
Imports System.Net
Imports System.Net.Mail
Imports System.Runtime.Serialization.Json
Imports System.Text
Imports System.Threading
Imports System.Web
Imports System.Xml

#End Region

#Region " TenMinuteMail "

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Creates and manages a temporary mail address using the https://10minutemail.com/ service.
''' <para></para>
''' Be aware the mail address will expire in approx. 10 minutes after calling the <see cref="TenMinuteMail.Dispose()"/> method.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <seealso cref="IDisposableMail"/>
''' <seealso cref="IDisposable"/>
''' ----------------------------------------------------------------------------------------------------
Public Class TenMinuteMail : Implements IDisposableMail, IDisposable

#Region " Properties "

   ''' <summary>
   ''' Gets the mail address.
   ''' </summary>
   ''' <value>
   ''' The mail address.
   ''' </value>
   Public ReadOnly Property MailAddress As MailAddress
       Get
           Return Me.mailAddressB
       End Get
   End Property
   ''' <summary>
   ''' (Backing field) The current mail address.
   ''' </summary>
   Private mailAddressB As MailAddress

   ''' <summary>
   ''' Gets the message count.
   ''' </summary>
   ''' <value>
   ''' The message count.
   ''' </value>
   Public ReadOnly Property MessageCount As Integer
       Get
           Return Me.GetMessageCount()
       End Get
   End Property

   ''' <summary>
   ''' Gets the inbox messages.
   ''' </summary>
   ''' <value>
   ''' The inbox messages.
   ''' </value>
   Public Overridable ReadOnly Property Messages As IEnumerable(Of MailMessage)
       Get
           Return Me.GetMessages()
       End Get
   End Property

   ''' <summary>
   ''' Gets the inbox message with the specified message id.
   ''' </summary>
   ''' <param name="id">
   ''' The message id.
   ''' </param>
   ''' <value>
   ''' The inbox message with the specified message id.
   ''' </value>
   Public Overridable ReadOnly Property Messages(ByVal id As String) As MailMessage
       Get
           Return Me.GetMessage(id)
       End Get
   End Property

   ''' <summary>
   ''' Gets a value indicating whether the temporary mail service is blocked.
   ''' <para></para>
   ''' If <see langword="True"/>,
   ''' this means you have requested too many temporary mail addresses from your IP address too quickly.
   ''' <para></para>
   ''' And you must wait some minutes to be able use 10minutemail.com service again.
   ''' </summary>
   ''' <value>
   ''' If <see langword="True"/>,
   ''' this means you have requested too many temporary mail addresses from your IP address too quickly.
   ''' <para></para>
   ''' And you must wait some minutes to be able use 10minutemail.com service again.; otherwise, <see langword="False"/>.
   ''' </value>
   Public ReadOnly Property IsBlocked As Boolean
       Get
           If Not (Me.isBlockedB) Then
               Me.isBlockedB = Me.GetIsBlocked()
           End If
           Return isBlockedB
       End Get
   End Property
   ''' <summary>
   ''' ( Backing field)
   ''' <para></para>
   ''' Gets a value indicating whether the temporary mail service is blocked.
   ''' <para></para>
   ''' If <see langword="True"/>,
   ''' this means you have requested too many temporary mail addresses from your IP address too quickly.
   ''' <para></para>
   ''' And you must wait some minutes to be able use 10minutemail.com service again.
   ''' </summary>
   Private isBlockedB As Boolean

#End Region

#Region " Fields "

#Region " Common "

   ''' <summary>
   ''' The <see cref="ElektroWebClient"/> instance that manage cookies and requests to https://10minutemail.com/.
   ''' </summary>
   Protected Client As ElektroWebClient

   ''' <summary>
   ''' A <see cref="Timer"/> instance that will renew the life-time of the temporary mail address,
   ''' and check for new incoming mail messages.
   ''' </summary>
   Protected TimerUpdate As Timer

   ''' <summary>
   ''' A counter to keep track of the current mail message count, and so detect new incoming mail messages.
   ''' </summary>
   Private messageCounter As Integer

#End Region

#Region " Uris "

   ''' <summary>
   ''' The Uri that points to the main site.
   ''' </summary>
   Protected uriBase As Uri

   ''' <summary>
   ''' The Uri that points to the address resource.
   ''' </summary>
   Protected uriAddress As Uri

   ''' <summary>
   ''' The Uri that points to the blocked resource.
   ''' </summary>
   Protected uriBlocked As Uri

   ''' <summary>
   ''' The Uri that points to the messagecount resource.
   ''' </summary>
   Protected uriMessageCount As Uri

   ''' <summary>
   ''' The Uri that points to the messages resource.
   ''' </summary>
   Protected uriMessages As Uri

   ''' <summary>
   ''' The Uri that points to the reply resource.
   ''' </summary>
   Protected uriReply As Uri

   ''' <summary>
   ''' The Uri that points to the reset resource.
   ''' </summary>
   Protected uriReset As Uri

   ''' <summary>
   ''' The Uri that points to the secondsleft resource.
   ''' </summary>
   Protected uriSecondsLeft As Uri

#End Region

#End Region

#Region " Events "

   ''' <summary>
   ''' Occurs when a new inbox message arrived.
   ''' </summary>
   Public Event MailMessageArrived As EventHandler(Of MailMessageArrivedEventArgs) Implements IDisposableMail.MailMessageArrived

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Initializes a new instance of the <see cref="TenMinuteMail"/> class.
   ''' </summary>
   <DebuggerStepThrough>
   Public Sub New()
       Me.New(TimeSpan.FromSeconds(10))
   End Sub

   ''' <summary>
   ''' Initializes a new instance of the <see cref="TenMinuteMail"/> class.
   ''' </summary>
   ''' <param name="updateInterval">
   ''' The time interval to check for new incoming messages.
   ''' <para></para>
   ''' Be aware that 10minutemail.com server's update interval are 10 seconds by default.
   ''' </param>
   ''' <exception cref="ArgumentException">
   ''' Update interval must be in range between 10 to 60 seconds. - updateInterval
   ''' </exception>
    <SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors", Justification:="Don't panic")>
   <DebuggerStepThrough>
   Public Sub New(ByVal updateInterval As TimeSpan)
       Me.uriBase = New Uri("https://10minutemail.com/")
       Me.uriAddress = New Uri(Me.uriBase, "/10MinuteMail/resources/session/address")
       Me.uriBlocked = New Uri(Me.uriBase, "/10MinuteMail/resources/session/blocked")
       Me.uriMessageCount = New Uri(Me.uriBase, "/10MinuteMail/resources/messages/messageCount")
       Me.uriMessages = New Uri(Me.uriBase, "/10MinuteMail/resources/messages")
       Me.uriReply = New Uri(Me.uriBase, "/10MinuteMail/resources/messages/reply")
       Me.uriReset = New Uri(Me.uriBase, "/10MinuteMail/resources/session/reset")
       Me.uriSecondsLeft = New Uri(Me.uriBase, "/10MinuteMail/resources/session/secondsLeft")

       Me.CreateNew(updateInterval)
   End Sub

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' Creates a new temporary mail address.
   ''' </summary>
   ''' <param name="updateInterval">
   ''' The time interval to check for new incoming messages.
   ''' <para></para>
   ''' Be aware that 10minutemail.com server's update interval are 10 seconds by default.
   ''' </param>
   ''' <exception cref="ArgumentException">
   ''' Update interval must be in range between 10 to 60 seconds. - updateInterval
   ''' </exception>
   <DebuggerStepThrough>
   Public Overridable Sub CreateNew(ByVal updateInterval As TimeSpan) Implements IDisposableMail.CreateNew
       Dim totalMilliseconds As Integer = Convert.ToInt32(updateInterval.TotalMilliseconds)

       Select Case totalMilliseconds
           Case Is < 10000 ' 10 seconds.
               Throw New ArgumentException("Update interval must be in range between 10 to 60 seconds.", "updateInterval")

           Case Is > 60000 ' 1 minute.
               Throw New ArgumentException("Update interval must be in range between 10 to 60 seconds.", "updateInterval")

           Case Else
               If (Me.TimerUpdate IsNot Nothing) Then
                   Me.TimerUpdate.Change(Timeout.Infinite, Timeout.Infinite)
               End If

               If (Me.Client IsNot Nothing) Then
                   Me.Client.Dispose()
                   Me.Client = Nothing
               End If

               Me.isBlockedB = False
               Me.mailAddressB = Nothing
               Me.messageCounter = 0

               Me.Client = New ElektroWebClient() With {.CookiesEnabled = True, .Encoding = Encoding.UTF8}
               Me.mailAddressB = Me.GetMailAddress()
               Me.TimerUpdate = New Timer(AddressOf Me.UpdateTimer_CallBack, Me, totalMilliseconds, totalMilliseconds)

       End Select
   End Sub

   ''' <summary>
   ''' Replies to a <see cref="MailMessage"/> with the specified message id.
   ''' </summary>
   ''' <param name="msgId">
   ''' The message id of the <see cref="MailMessage"/>.
   ''' </param>
   '''
   ''' <param name="body">
   ''' The body.
   ''' </param>
   Public Overridable Sub Reply(ByVal msgId As String, ByVal body As String)
       Me.Reply(Me.Messages(msgId), body)
   End Sub

   ''' <summary>
   ''' Replies to the specified <see cref="MailMessage"/>.
   ''' </summary>
   ''' <param name="msg">
   ''' The <see cref="MailMessage"/>.
   ''' </param>
   '''
   ''' <param name="body">
   ''' The body.
   ''' </param>
   Public Overridable Sub Reply(ByVal msg As MailMessage, ByVal body As String)

       Dim msgId As String = msg.Headers.Item("msgId")
       Dim parameters As String = String.Format("messageId={0}&replyBody=""{1}""", msgId, HttpUtility.UrlEncode(body))

       Dim result As String
       SyncLock (Me.Client)
           Me.Client.Headers(HttpRequestHeader.ContentType) = "application/x-www-form-urlencoded"
           result = Me.Client.UploadString(Me.uriReply, "POST", parameters)
           Me.Client.Headers.Remove(HttpRequestHeader.ContentType)
       End SyncLock

       ' ToDo: need to improve...
       If Not String.IsNullOrEmpty(result) Then
           ' ...
       End If

   End Sub

#End Region

#Region " Private/Protected Methods "

   ''' <summary>
   ''' Gets the mail address.
   ''' </summary>
   ''' <returns>
   ''' The mail address.
   ''' </returns>
   ''' <exception cref="WebException">
   ''' You have requested too many temporary mail addresses from your IP address too quickly.
   ''' Please wait some minutes and try again.
   ''' </exception>
   <DebuggerStepThrough>
   Protected Overridable Function GetMailAddress() As MailAddress Implements IDisposableMail.GetMailAddress
       If (Me.IsBlocked) Then
           Throw New WebException("You have requested too many temporary mail addresses from your IP address too quickly. Please wait some minutes and try again.")
       End If

       If (Me.mailAddressB Is Nothing) Then
           SyncLock (Me.Client)
               Dim value As String = Me.Client.DownloadString(Me.uriAddress)
               Me.mailAddressB = New MailAddress(value, "TenMinuteMail", Encoding.Default)
           End SyncLock
       End If

       Return Me.mailAddressB
   End Function

   ''' <summary>
   ''' Gets the inbox message count.
   ''' </summary>
   ''' <returns>
   ''' The inbox message count.
   ''' </returns>
   ''' <exception cref="WebException">
   ''' You have requested too many temporary mail addresses from your IP address too quickly.
   ''' Please wait some minutes and try again.
   ''' </exception>
   <DebuggerStepThrough>
   Protected Overridable Function GetMessageCount() As Integer Implements IDisposableMail.GetMessageCount
       If (Me.IsBlocked) Then
           Throw New WebException("You have requested too many temporary mail addresses from your IP address too quickly. Please wait some minutes and try again.")
       End If

       SyncLock (Me.Client)
           Dim value As String = Me.Client.DownloadString(Me.uriMessageCount)
           Return Convert.ToInt32(value)
       End SyncLock
   End Function

   ''' <summary>
   ''' Gets the inbox message with the specified message id.
   ''' </summary>
   ''' <param name="id">
   ''' The message id.
   ''' </param>
   ''' <returns>
   ''' The inbox message with the specified message id.
   ''' </returns>
   ''' <exception cref="WebException">
   ''' You have requested too many temporary mail addresses from your IP address too quickly.
   ''' Please wait some minutes and try again.
   ''' </exception>
   <DebuggerStepThrough>
   Protected Overridable Function GetMessage(ByVal id As String) As MailMessage

       Return (From msg As MailMessage In Me.GetMessages()
               Where msg.Headers("msgId").Equals(id, StringComparison.OrdinalIgnoreCase)
              ).Single()

   End Function

   ''' <summary>
   ''' Gets the inbox messages.
   ''' </summary>
   ''' <returns>
   ''' The inbox messages.
   ''' </returns>
   ''' <exception cref="WebException">
   ''' You have requested too many temporary mail addresses from your IP address too quickly.
   ''' Please wait some minutes and try again.
   ''' </exception>
   <DebuggerStepThrough>
   Protected Overridable Iterator Function GetMessages() As IEnumerable(Of MailMessage) Implements IDisposableMail.GetMessages
       If (Me.IsBlocked) Then
           Throw New WebException("You have requested too many temporary mail addresses from your IP address too quickly. Please wait some minutes and try again.")
       End If

       If (Me.GetMessageCount = 0) Then
           Exit Function
       End If

       SyncLock (Me.Client)

           Dim src As Byte() = Me.Client.DownloadData(Me.uriMessages)
           Using xmlReader As XmlDictionaryReader =
             JsonReaderWriterFactory.CreateJsonReader(src, 0, src.Length, Encoding.UTF8, New XmlDictionaryReaderQuotas, Nothing)

               Dim xml As XElement = XElement.Load(xmlReader)
               If (xml Is Nothing) Then
                   Exit Function
               End If

               For Each item As XElement In xml.Elements("item")

                   Dim recipientList As XElement = item.<recipientList>.Single()
                   Dim primaryFromAddress As String = item.<primaryFromAddress>.Value
                   Dim subject As String = item.<subject>.Value
                   Dim body As String = item.<bodyText>.Value
                   ' Get the message id. to identify and reply the message:
                   Dim id As String = item.<id>.Value

                   ' ToDO: attachment support.
                   ' Dim attachmentCount As Integer = Convert.ToInt32(item.<attachmentCount>.Value)
                   ' Dim attachments As XElement = item.<attachments>.Single()
                   ' ...
                   ' MailMessage.Attachments.Add(New Attachment( ... , MediaTypeNames.Application.Octet))

                   Dim msg As New MailMessage()
                   With msg
                       .BodyEncoding = Encoding.UTF8
                       ' .HeadersEncoding = Encoding.UTF8
                       .SubjectEncoding = Encoding.UTF8

                       .Headers.Add("msgId", id) ' store the message id. in the headers.
                       .From = New MailAddress(primaryFromAddress, "primaryFromAddress", Encoding.UTF8)
                       .Subject = subject
                       .IsBodyHtml = True
                       .Body = body
                   End With

                   For Each recipient As XElement In recipientList.Elements("item")
                       msg.To.Add(New MailAddress(recipient.Value))
                   Next recipient

                   Yield msg

               Next item

           End Using

       End SyncLock
   End Function

   ''' <summary>
   ''' Gets the time left to expire the current temporary mail address.
   ''' </summary>
   ''' <returns>
   ''' The time left to expire the current temporary mail address.
   ''' </returns>
   <DebuggerStepThrough>
   Protected Overridable Function GetExpirationTime() As TimeSpan Implements IDisposableMail.GetExpirationTime
       Throw New NotImplementedException("The implementation is not necessary for 10minutemail.com service.")
   End Function

   ''' <summary>
   ''' Gets a value indicating whether the current temporary mail is blocked.
   ''' <para></para>
   ''' If <see langword="True"/>,
   ''' this means you have requested too many temporary mail addresses from your IP address too quickly.
   ''' <para></para>
   ''' And you must wait some minutes to be able use 10minutemail.com service again.
   ''' </summary>
   ''' <returns>
   ''' <para></para>
   ''' If <see langword="True"/>,
   ''' this means you have requested too many temporary mail addresses from your IP address too quickly.
   ''' <para></para>
   ''' And you must wait some minutes to be able use 10minutemail.com service again.
   ''' </returns>
   <DebuggerStepThrough>
   Protected Overridable Function GetIsBlocked() As Boolean
       SyncLock (Me.Client)
           Dim value As String = Me.Client.DownloadString(Me.uriBlocked)
           Return CBool(value)
       End SyncLock
   End Function

   ''' <summary>
   ''' Renews the life-time for the current temporary mail address.
   ''' </summary>
   ''' <exception cref="WebException">
   ''' You have requested too many temporary mail addresses from your IP address too quickly.
   ''' Please wait some minutes and try again.
   ''' </exception>
   '''
   ''' <exception cref="NotSupportedException">
   ''' Unexpected response value: '{value}'
   ''' </exception>
   <DebuggerStepThrough>
   Protected Overridable Sub Renew() Implements IDisposableMail.Renew
       If (Me.IsBlocked) Then
           Throw New WebException("You have requested too many temporary mail addresses from your IP address too quickly. Please wait some minutes and try again.")
       End If

       SyncLock (Me.Client)
           Dim value As String = Me.Client.DownloadString(Me.uriReset)
           If Not (value.Equals("reset", StringComparison.OrdinalIgnoreCase)) Then
               Throw New NotSupportedException(String.Format("Unexpected response value: '{0}'", value))
           End If
       End SyncLock
   End Sub

   ''' <summary>
   ''' Handles the calls from <see cref="TenMinuteMail.TimerUpdate"/>.
   ''' </summary>
   ''' <param name="state">
   ''' An object containing application-specific information relevant to the
   ''' method invoked by this delegate, or <see langword="Nothing"/>.
   ''' </param>
   Protected Overridable Sub UpdateTimer_CallBack(ByVal state As Object)

       If (Me.Client.IsBusy) Then
           Exit Sub
       End If

       SyncLock (Me.Client)
           Me.Renew()

           Dim oldMsgCount As Integer = Me.messageCounter
           Dim newMsgCount As Integer = Me.GetMessageCount()

           If (newMsgCount > oldMsgCount) Then
               Me.messageCounter = newMsgCount
               Dim messages As IEnumerable(Of MailMessage) = Me.GetMessages()

               For msgIndex As Integer = oldMsgCount To (newMsgCount - 1)
                   Me.OnMailMessageArrived(New MailMessageArrivedEventArgs(messages(msgIndex)))
               Next msgIndex
           End If
       End SyncLock

   End Sub

#End Region

#Region " Event Invocators "

   ''' <summary>
   ''' Raises the <see cref="TenMinuteMail.MailMessageArrived"/> event.
   ''' </summary>
   ''' <param name="e">
   ''' The <see cref="MailMessageArrivedEventArgs"/> instance containing the event data.
   ''' </param>
   Protected Overridable Sub OnMailMessageArrived(ByVal e As MailMessageArrivedEventArgs)

       If (Me.MailMessageArrivedEvent IsNot Nothing) Then
           RaiseEvent MailMessageArrived(Me, e)
       End If

   End Sub

#End Region

#Region " IDisposable Implementation "

   ''' <summary>
   ''' Flag to detect redundant calls when disposing.
   ''' </summary>
   Protected isDisposed As Boolean

   ''' <summary>
   ''' Releases all the resources used by this instance.
   ''' </summary>
   <DebuggerStepThrough>
   Public Sub Dispose() Implements IDisposable.Dispose
       Me.Dispose(isDisposing:=True)
       GC.SuppressFinalize(obj:=Me)
   End Sub

   ''' <summary>
   ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
   ''' Releases unmanaged and, optionally, managed resources.
   ''' </summary>
   ''' <param name="isDisposing">
   ''' <see langword="True"/>  to release both managed and unmanaged resources;
   ''' <see langword="False"/> to release only unmanaged resources.
   ''' </param>
   Protected Overridable Sub Dispose(ByVal isDisposing As Boolean)
       If Not (Me.isDisposed) AndAlso (isDisposing) Then
           Me.MailMessageArrivedEvent = Nothing

           Me.TimerUpdate.Dispose()
           Me.TimerUpdate = Nothing

           Me.Client.Dispose()
           Me.Client = Nothing

           Me.mailAddressB = Nothing
           Me.messageCounter = 0
           Me.isBlockedB = False

           Me.uriAddress = Nothing
           Me.uriBase = Nothing
           Me.uriBlocked = Nothing
           Me.uriMessageCount = Nothing
           Me.uriMessages = Nothing
           Me.uriReply = Nothing
           Me.uriReset = Nothing
           Me.uriSecondsLeft = Nothing
       End If

       Me.isDisposed = True
   End Sub

#End Region

End Class

#End Region





MODO DE EMPLEO

Un ejemplo simple para crear la dirección temporal y controlar la recepción de nuevos correos entrantes...

Código (vbnet) [Seleccionar]
Imports System.Net.Mail
Imports System.Text

Public NotInheritable Class Form1

   Private WithEvents TempMail As TenMinuteMail

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Me.TempMail = New TenMinuteMail(TimeSpan.FromSeconds(10)) ' Set inbox notification interval to 10 sec.
       Console.WriteLine(String.Format("Your 10MinuteMail Address: '{0}'", Me.TempMail.MailAddress.Address))
   End Sub

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Handles the <see cref="TenMinuteMail.MailMessageArrived"/> event of the <see cref="Form1.TempMail"/> object.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="sender">
   ''' The source of the event.
   ''' </param>
   '''
   ''' <param name="e">
   ''' The <see cref="MailMessageArrivedEventArgs"/> instance containing the event data.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   Private Sub TempMail_MailMessageArrived(ByVal sender As Object, ByVal e As MailMessageArrivedEventArgs) _
   Handles TempMail.MailMessageArrived

       Dim sb As New StringBuilder()
       With sb
           .AppendLine()
           .AppendLine("NEW MAIL MESSAGE ARRIVED")
           .AppendLine("************************")
           .AppendLine()
           .AppendLine(String.Format("From...: {0}", e.MailMessage.From.Address))
           .AppendLine(String.Format("To.....: {0}", String.Join(";", (From msg As MailAddress In e.MailMessage.To))))
           .AppendLine(String.Format("Subject: {0}", e.MailMessage.Subject))
           .AppendLine(String.Format("Msg.Id.: {0}", e.MailMessage.Headers("msgId")))
           .AppendLine()
           .AppendLine("-------BODY START-------")
           .AppendLine(e.MailMessage.Body)
           .AppendLine("-------BODY END---------")
       End With

       Console.WriteLine(sb.ToString())

   End Sub

End Class


En el ejemplo provisto, el formato a mostrar cuando se recibe un nuevo correo sería algo parecido a esto:

NEW MAIL MESSAGE ARRIVED
************************

From...: elektrostudios@elhacker.net
To.....: z421459@mvrht.net
Subject: Hello Sir.
Msg.Id.: 6443119781926234531

-------BODY START-------
Hello World!
<br />
<br />
-------BODY END---------


nota: el cuerpo del mensaje se devuelve en formato HTML.

EDITO:
Para responder a un e-mail simplemente deben usar el método TenMinuteMail.Reply pasándole como argumento la instancia del mensaje al que quieren responder, o en su defecto un identificador de mensaje, el cual lo puede encontrar almacenado en la cabecera de un mensaje: MailMessage.Headers("msgId")

Saludos!
#1238
Cita de: **Aincrad** en 11 Febrero 2018, 15:42 PM
Gracias si funciona . me fui en el apartado de SEGURIDAD de mi cuenta Gmail y permití las aplicaciones menos seguras. :) si funciona .   ;-)

Me alegro de que lo hayas resuelto.

saludos
#1239
Repito de nuevo:

Cita de: Eleкtro en 10 Febrero 2018, 19:03 PM
Lee aquí:
Sobre todo lee la advertencia que hago sobre las 'aplicaciones menos seguras' de Google, ya que probablemente sea el motivo por el que no te funciona tu código.

...aclara si ya habilitaste el uso de aplicaciones menos seguras. Comprueba que el nombre de usuario y contraseña sean correctos, y prueba acctivando y desactivando la conexiónn segura (SmtpClient.EnableSsl) en el método que envía el email.

saludos
#1240
Cita de: p4md4 en 11 Febrero 2018, 05:27 AMcomo es bien sabido vb6 dejo de tener soporte, y por ende en un futuro no muy lejano tal vez se presenten algunos problemas de compatibilidad cuando el cliente necesite actualizar por "a" o "b" su OS por ejemplo.

Lee esto:
Cita de: MicrosoftThe Visual Basic team's goal is that Visual Basic 6.0 applications continue to run on supported Windows versions. As detailed in this document, the core Visual Basic 6.0 runtime will be supported for the full lifetime of supported Windows versions, which is five years of mainstream support followed by five years of extended support...

Eso fue publicado en 2017, y hablan de seguir ofreciendo soporte a los runtimes de VB6 durante los próximos 10 años, hazte una idea...


( nota: el documento de declaración también está disponible en Español. )




Cita de: p4md4 en 11 Febrero 2018, 05:27 AM¿Que harian?¿Iniciarian el proyecto de migración?

Yo lo veo así:

Por mucha experiencia que una persona haya podido adquir a lo largo de los años en VB6 hasta alcanzar un dominio profesional, yo considero que a largo plazo si pusieramos una balanza, y en igualdad de condiciones, el procedimiento para el desarrollo del código y algoritmos en VB6 ya te ha creado y te seguirá creando muchas más complicaciones, imperfecciones, tiempo y pasos adicionales que si tuvieras esa misma experiencia adquirida en Visual Basic.NET y llevases a cabo el mismo código en dicho lenguaje.

Aquí tienes algo de ayuda si decides empezar la migración... pero a VB.NET (puesto que es un lenguaje de alto nivel de abstracción, en continua actualización y provee una sintaxis familiar a VB6, no sé por que buena razón deberías atormentarte eligiendo otro lenguaje distinto):


PD: si lees la guía no te fijes en el asistente de actualización de VB6 a VB.NET, simplemente lee las recomendaciones, diferencias de sintaxis, equivalencia entre miembros y etcétera... luego instalas Visual Studio 2017 y empiezas de cero el desarrollo con lo que ya tenías escrito en VB6. Esa es mi recomendación, pero hazlo como quieras claro está.

Saludos!