- Presentación.
Seguimos con nuestro tutorial básico, en esta ocasión vamos a ver cómo podemos enviar un correo con el protocolo SMTP, explorar los archivos de Windows para elegir uno y mostrar una Caja de Mensaje (MsgBox)
- En Basic4Android vimos cómo enviar un correo con SMTP y en otro tutorial vimos cómo explorar archivos(ejemplo 3).
Nos basamos en esos tutoriales y los vamos a adaptar a B4J.
Necesitamos una cuenta de Gmail.com, de Yahoo.com,... para que sirva como "intermediario" entre el correo que enviamos y el receptor.
Vamos a enviar nuestro mensaje al servidor por el protocolo SMTP y el puerto 465 para que el servidor lo reenvíe al destinatario de nuestro correo.
Baja para ver su aspecto.(necesita Java 1.7.1)
|
Librerías necesarias |
1.- Mediante el Designer...
- Creamos un Layout y lo llamamos: "Layout", que contendrá 4 Label, las tres primeras contendrá estos textos:
Enviar a...
Asunto
Mensaje
La cuarta Label llevará el texto Label1 y le pondremos en JavaFX CSS Id: Label1
(a los anteriores Label no es necesario ponerle Identificador de JavaFX porque no se utilizan dentro del código que realizamos.)
Agregamos dos TextField, en sus JavaFX CSS Id escribimos: tf_enviar_a, tf_asunto
Agregamos un TextArea, en su JavaFX CSS Id escribimos: ta_mensaje
Agregamos un Button, en su JavaFX CSS Id escribimos: boton_enviar
Agregamos un ListView, en su JavaFX CSS Id escribimos: ListView1
- Ahora vamos a crear otro Layout que llamaremos "CajaMensaje", contendrá:
Un Label, en su JavaFX CSS Id escribimos: Label_Mensaje
Un Button, en su JavaFX CSS Id escribimos: boton_cerrar
El Layout "CajaMensaje" funcionará como ventana MsgBox que podremos utilizar como confirmación de llegada de correo o para mensajes de errores.
2.- Copiamos y pegamos el código...
Código Main |
#Region Project Attributes
#MainFormWidth: 600
#MainFormHeight: 731
#End Region
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
' Diciembre 2013
Private fx As JFX
Private MainForm As Form
Private CajaMensaje As CajaMensaje
Private SMTP As SMTP
Dim tf_enviar_a, tf_asunto As TextField
Dim ta_mensaje As TextArea
' Adjuntar archivo
Dim ListView1 As ListView
Dim Label1 As Label
Dim Listado As List
Dim ruta, archivo As String
End Sub
Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.Title = "Correo SMTP © Juan Antonio Villalpando"
MainForm.RootPane.LoadLayout("Layout")
MainForm.Show
MainForm.BackColor = fx.Colors.White
SMTP.Initialize("smtp.gmail.com", 465, "micorreo@gmail.com","micontraseñadegmail","SMTP")
' SMTP.Initialize("smtp.mail.yahoo.com", 465, "micorreo@yahoo.es","miclave","SMTP")
SMTP.UseSSL = True
tf_enviar_a.Text = "iesteleco@gmail.com"
tf_asunto.Text = "Prueba"
ta_mensaje.Text = "Correo enviado por Juan Antonio Villalpando, prueba de SMTP"
CajaMensaje.Initialize
Cargar_ListView("C:\")
End Sub
Sub boton_enviar_Action
SMTP.To.Add(tf_enviar_a.Text)
SMTP.subject = tf_asunto.Text
SMTP.body = ta_mensaje.Text
SMTP.AddAttachment(ruta, archivo)
SMTP.Send
End Sub
Sub SMTP_MessageSent(Success As Boolean)
If Success Then
Aviso("Correcto.","Mensaje enviado el " & DateUtils.TicksToString(DateTime.Now))
Else
Aviso("Error.","Error en el envío del mensaje: " & LastException)
End If
End Sub
Sub Cargar_ListView(folder As String)
ruta = folder
Listado.Initialize
Listado = File.ListFiles(ruta)
Listado.Sort(True)
ListView1.Items.Clear
ListView1.Items.Add("..") ' Directorio superior
For n = 0 To Listado.Size-1
archivo = Listado.Get(n)
If File.IsDirectory(ruta, archivo)=True Then
' Añade (DIR) si es directorio
ListView1.Items.Add(archivo & " (DIR)")
Else
ListView1.Items.Add(archivo)
End If
Next
End Sub
Sub ListView1_SelectedIndexChanged(Index As Int)
If Index = -1 Then Return
archivo = ListView1.SelectedItem
' Elimina (DIR)
archivo = archivo.Replace(" (DIR)", "")
Try
Label1.Text = File.Combine(ruta & "\", archivo)
If archivo = ".." Then
' Elimina el último directorio de la ruta
' C:\Android\B4J\Correo\Files --->>> C:\Android\B4J\Correo
ruta = ruta.SubString2(0, ruta.LastIndexOf("\"))
If ruta = "C:" Then ruta = "C:\"
Cargar_ListView(ruta)
Label1.Text = ruta
Else
If File.IsDirectory (ruta, archivo) Then
Cargar_ListView(File.Combine(ruta & "\",archivo))
End If
End If
Catch
Aviso("Error.","Error al entrar en el directorio")
Cargar_ListView(File.DirApp)
End Try
End Sub
Public Sub Aviso(titulo As String, mensaje As String)
CajaMensaje.Escribe(titulo, mensaje)
End Sub
|
3.- Ahora creamos un Módulo de Clase y lo llamamos CajaMensaje
Project / Add New Module / Class Module
Copiamos y pegamos el código...
Código CajaMensaje |
' Class CajaMensaje
Sub Class_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
' Diciembre 2013
Private SubForm As Form
Private Label_Mensaje As Label
End Sub
Public Sub Initialize
SubForm.Initialize("SubForm", -1, -1)
SubForm.RootPane.LoadLayout("CajaMensaje")
End Sub
Public Sub Escribe(titulo As String, mensaje As String)
SubForm.Title=titulo
Label_Mensaje.Text=mensaje
SubForm.ShowAndWait
End Sub
Private Sub boton_cerrar_Action
SubForm.Close
End Sub
|
___________________________
- Comentarios.
Creo que el código es sencillo de entender, los puntos más complicados pueden ser...
- ListView1.Items.Add("..") ' Directorio superior
Agrega al principio del ListView dos puntos para indicar que queremos "ir al directorio superior".
- ListView1.Items.Add(archivo & " (DIR)")
Agrega a la línea del ListView " (DIR)" en el caso que sea un directorio, para indicarlo al usuario.
- archivo = archivo.Replace(" (DIR)", "")
Cuando pulsamos sobre un Directorio, por ejemplo:
Correo (DIR)
elimina la cadena (DIR) para poder trabajar con su nombre correcto, en este caso Correo.
' Elimina el último directorio de la ruta
' C:\Android\B4J\Correo\Files --->>> C:\Android\B4J\Correo
ruta = ruta.SubString2(0, ruta.LastIndexOf("\"))
- Si pulsamos los dos puntos .., que significa "ir al directorio superior", eliminamos la última parte de la ruta
C:\Android\B4J\Correo\Files --->>> C:\Android\B4J\Correo
Para ello mediante SubString2, eliminamos todo a partir del último(Last) ("\")
- CajaMensaje es otro Formulario que utilizamos para mostrar los Avisos.
en vez de poner: Aviso("Error.","Error al entrar en el directorio")
Podríamos haber puesto directamente: CajaMensaje.Escribe("Error.","Error al entrar en el directorio")
- Mejoras
Podemos introducir una orden para que cuando no se halla seleccionado archivo, no se envíe adjunto.
If archivo <> "" Then SMTP.AddAttachment(ruta, archivo)
________________________
- Explorar archivos.
Otra manera de localizar el archivo que queremos enviar es modificando el código de esta manera...
Código |
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
' Diciembre 2013
Private fx As JFX
Private MainForm As Form
Private fc As FileChooser ' Declaramos un Elector de Archivos
End Sub
Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.RootPane.LoadLayout("Layout")
MainForm.Show
fc.Initialize ' Lo iniciamos
End Sub
Sub boton_enviar_Action
Dim f As String = fc.ShowOpen(MainForm) ' Abrimos la ventana de elección
End Sub
|
__________________________________
NOTA:
Como he comentado en una ocasión anterior, no es buena idea utilizar esta aplicación para realizar programas de escritorio, la verdadera utilidad de B4J considero que es hacer librerías .jar o crear aplicación multiplataforma, es decir crear una aplicación en Windows para ejecutarla en Linux, por ejemplo.
Para realizar programas de Escritorio recomiendo el gratuito Visual Basic 2010 o el también gratuito AutoIt.
Para mostrar un documento
' fx.ShowExternalDocument(File.GetUri("C:\Android\Correo", "Archvo.txt"))