miércoles, 18 de marzo de 2020

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...!!!

0 comentarios :