Ir al contenido principal

Enviando correo con API de Xamarin.Essentials

En la API Xamarin.Essential de esta semana, echamos un vistazo a la API de (Email) correo electrónico que nos permitirá abrir la aplicación de correo electrónico predeterminada y precargada con destinatarios, asunto y cuerpo del mensaje. Para lo cual crearemos el proyecto Email.XEssential con Visual Studio 2019 que será nuestro primer ejemplo practico con Xamarin.Essential.

Requisitos para el ejemplo práctico:
Microsoft Visual Studio Community 2019
Xamarin.Froms - XAML
Xamarin.Essentials - API
Sistema cliente de envío - Gmail

Interfaz:
Después de haber creado el proyecto, iniciaremos con la parte del diseño para cual abriremos el archivo MainPage.xaml e ingresamos lo siguiente:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:AwesomeApp"
             x:Class="AwesomeApp.MainPage">
    <StackLayout>
        <Image Source="HadsonparLogo.jpg"
               HorizontalOptions="Center"
               Margin="10"/>
        <Label Text="Visiten el Blog"
               TextColor="Blue"
               TextDecorations="Underline"
               HorizontalOptions="Center"
               VerticalOptions="CenterAndExpand"
               FontSize="Title">
            <Label.GestureRecognizers>
                <TapGestureRecognizer Command="{Binding TapCommand}"           CommandParameter="http://blog.hadsonpar.com/" />
            </Label.GestureRecognizers>
        </Label>
        <Label Text="&#128526;"
               HorizontalOptions="Center"
               FontSize="Title"/>
        <Label Text="Publicamos temas acerca de las siguientes tecnologías:"
               HorizontalOptions="Center"/>
        <Label Text="ORACLE | MICROSOFT | OPEN SOURCE | CLOUD"
               HorizontalOptions="Center"/>
        <Label Text="Pequeñas aplicaciones, pero de gran impacto &#128522;"
               TextColor="Turquoise"
               FontSize="Subtitle"
               HorizontalOptions="Center"
               VerticalOptions="CenterAndExpand"/>

        <Label Text="&#127760; Enviar Correo electrónico &#10;API de Xamarin.Essentials"
               Margin="0,0,0,10"
               FontAttributes="Bold"
               FontSize="Small"
               TextColor="#36FF33"
               HorizontalTextAlignment="Center"/>

        <Entry x:Name="txtTo" Placeholder="tu-email@dominio.com" />
        <Entry x:Name="txtSubject" Placeholder="Asunto" />
        <Editor x:Name="txtBody" HeightRequest="50"/>
        <Button x:Name="btnSend" Text="Enviar" Clicked="btnSend_Clicked"/>
       
        <Label Text="&#128588; Welcome to Xamarin.Forms!"
            HorizontalOptions="Center"
            VerticalOptions="CenterAndExpand" />
        <Button Text="Click me" Clicked="Button_Clicked" />
    </StackLayout>
</ContentPage>

Por ahora nos concentramos en la siguientes propiedades:
<Entry x:Name="txtTo" Placeholder="tu-email@dominio.com" />
<Entry x:Name="txtSubject" Placeholder="Asunto" />
<Editor x:Name="txtBody" HeightRequest="50"/>
<Button x:Name="btnSend" Text="Enviar" Clicked="btnSend_Clicked"/>
Desarrollo de código:
Seguidamente abrir el archivo o clase MainPage.xaml.cs y agregamos la referencia Xamarin.Essentials en la clase en mención, así mismo creamos las siguientes instrucciones (tareas y métodos asíncronos):

using Xamarin.Essentials;

Ahora creamos una tarea asíncrona de nombre SendEmail(...) con los siguientes parámetros de entrada subject, body y recipients:

        /// <summary>
        /// Tarea asincrona para realizar el envío del mensaje
        /// </summary>
        /// <param name="subject">Asunto del email</param>
        /// <param name="body">Cuerpo del mensaje del email</param>
        /// <param name="recipients">Destinatarios</param>
        /// <returns></returns>
        private async Task SendEmail(string subject, string body, List<string> recipients)
        {
            try
            {
                //Propiedades del mensaje
                var message = new EmailMessage
                {
                    Subject = subject,
                    Body = body,
                    To = recipients,
                };

                //API que se encarga de abrir el cliente como el Gmail, Outlook u otros para realizar el envío del mensaje
                await Email.ComposeAsync(message);
            }
            catch (FeatureNotSupportedException fnsEx)
            {
                // Email is not supported on this device
                await DisplayAlert("Error", fnsEx.ToString(), "OK");
            }
            catch (Exception ex)
            {
                // Some other exception occurred
                await DisplayAlert("Error", ex.ToString(), "OK");
            }
        }

Luego crea la tarea asíncrona  ValidateForm(), encargado de validar las propiedades de envío de mensaje:

/// <summary>
        /// Validar las propiedades de la pantalla de envio de email
        /// </summary>
        /// <returns></returns>
        private async Task<bool> ValidateForm()
        {
            //Valida si el valor en el Entry txtTo se encuentra vacio o es igual a Null
            if (String.IsNullOrWhiteSpace(txtTo.Text))
            {
                await this.DisplayAlert("Advertencia", "El campo tu-mail es obligatorio.", "OK");
                return false;
            }
            else {
                //Valida que el formato del correo sea valido
                bool isEmail = Regex.IsMatch(txtTo.Text, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);
                if (!isEmail)
                {
                    await this.DisplayAlert("Advertencia", "El formato del correo electrónico es incorrecto, revíselo e intente nuevamente.", "OK");
                    return false;
                }
            }

            //Valida si el valor en el Entry txtSubject se encuentra vacio o es igual a Null
            if (String.IsNullOrWhiteSpace(txtSubject.Text))
            {
                await this.DisplayAlert("Advertencia", "El campo Asunto es obligatorio.", "OK");
                return false;
            }

            //Valida si el valor en el Entry se encuentra vacio o es igual a Null
            if (String.IsNullOrWhiteSpace(txtBody.Text))
            {
                var res = await DisplayAlert("Advertencia", "Aún no se a ingresado el mensaje, esta seguro de enviarlo", "OK", "Cancel");
                if (res)//True si se preciona OK, se esta confirmado que el correo se enviará sin mensaje
                {
                    return true;
                }
                else
                {//False si se preciona Cancel, y se debe ingresar el mensaje a enviar
                    return false;
                }
            }
            return true;
        }

Para finalizar creamos el método btnSend_Clicked encargado de realizar en envío, previa invocación a la tarea de ValidateForm(), si la validación retorna verdadero (true) invocamos a la tarea SendEmail(...):

        /// <summary>
        /// Botón encargado de realizar en envío
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        async void btnSend_Clicked(object sender, System.EventArgs e)
        {
            if (await ValidateForm()) {
                List<string> toAddress = new List<string>();
                toAddress.Add(txtTo.Text);
                await SendEmail(txtSubject.Text, txtBody.Text, toAddress);
            }
        }

Resultado:
Comparto el vídeo 📹 acerca de lo desarrollado de acuerdo a la descripción de este post publicado, todas la pruebas a nivel de Diseño ✨ y CodeBehind C# 💬 fueron validados en plataforma 📱Android.


Mayor información disponible en:
👉 channel9.msdn.com
👉 docs.microsoft.com

Descarga la fuente de:
En proceso de carga...
Nuevamente agradecer 😊 de antemano a todos por la acogida de este nuevo post publicado, bendiciones 🙏 y fuerte 💪 abrazo...!!!

Comentarios

Entradas más populares de este blog

Habilitar Usuario HR Oracle

Al realizar la primera instalación del Oracle, el usuario HR por defecto está bloqueado y por ende no podemos loguearnos como dicho usuario, lo que debe hacer son los siguiente pasos, aplicables para Linux o Windows.
1. Conectarse como usuario system o sysdba + contraseña haciendo uso del comando connect.
Usuario: system
Password: xxxx 


2. Hacer uso  del comando alter user hr account unlock desbloqueamos la cuenta.
alter user hr account unlock;

3. Escribimos el comando alter user HR identified by hr; con esto estamos diciendo que la contraseña será hr.

alter user HR identified by hr;

4. Ahora testeamos la conexión con el comando - conn hr/hr@xe. Si deseas después de conectarnos se puede realizar un select a la tabla employees del hr.


Resultado del select realizado
5. Con todos estos pasos realizados ya podemos logearnos desde cualquier IDE como el usuario hr  y la contraseña hr que definimos en el paso 3. 
Para finalizar nos loguearemos con el IDE Oracle SQL Developer.

Espero les sea de utilidad,…

Usuario SYS y SYSTEM - ORACLE

Usuario SYS y SYSTEM
Ambos usuario son creados de forma automática al crear la base de datos ORACLE y se otorga el rol de DBA.

SYS (password por defecto: CHANGE_ON_INSTALL).
SYSTEM (password por defecto: MANAGER).

Lo que se recomienda es cambiar el password de ambos usuarios por el tema de seguridad.

SYS:
Todas las tablas y vistas para el diccionario de datos de la base de datos están almacenados en el esquema SYS. Estas tablas y vistas son críticas para el funcionamiento de la base de datos ORACLE. Para mantener la integridad del diccionario de datos, las tablas del esquema SYS son manipulados solo por la base de datos. Nunca se debería modificar algo o crear tablas en el esquema del usuario SYS.

SYSTEM:
El usuario SYSTEM se utiliza para crear tablas y vistas adicionales que muestran información administrativa, tablas internas y vistas utilizado por varias opciones y herramientas de la base de datos ORACLE. No se recomienda utilizar el esquema SYSTEM para almacenar tablas de interés para usu…

Parámetro de entrada y salida – PL/SQL

Parámetro de entrada y salida – PL/SQL:
Los parámetros de entrada y salida no son los parámetros de inicialización de la base de datos ORACLE. Los parámetros de entra y salida son utilizados mayormente en implementaciones de funciones, procedimientos almacenados o bloques de código bajo el lenguaje del PL/SQL, se considera que ambos parámetros (entra y salida) puedan realizar operaciones en el mismo bloque PL/SQL, es decir, si enviamos un parámetro de entrada hará que cumpla cierta operación y retornara los valores de salida de dicha operación procesada de acuerdo al parámetro de ingresado. Es de acuerdo al caso que nos presenta en la implementación.
Algo importante al definir los parámetros, es saber y considerar cuántos tipos de parámetro existe si solo hablamos de entrada y salida, en realidad mi determinación seria 3 tipos:

Parámetros:

IN – entrada
OUT – salida
IN OUT – entrada salida

Parámetro IN – entrada:
El comportamiento común de estés tipos de parámetros es estar siempre pendiente d…