Ticker

6/recent/ticker-posts

API Xamarin.Essentials - Enviando email con archivo adjunto


En el anterior articulo realizamos un ejemplo práctico acerca del como enviar email haciendo uso de la API Xamarin.Essentials, en este ejemplo veremos una versión mejorada, agregando la opción de envío de email con archivo adjunto.

Requisitos:

  • Microsoft Visual Studio Community 2019
  • Xamarin.Froms - XAML
  • Xamarin.Essentials - API
  • Sistema cliente de envío - Gmail

Crear proyecto:

Iniciaremos creando un nuevo proyecto de nombre EssentialsEmailAttach, te sugiero revisen el siguiente articulo para saber como crear un proyecto desde cero de Xamarin.Forms en Visual Studio 2019 - son los mismo pasos que se realiza en este articulo.

Después de crear el proyecto se debe adicionar los siguiente directorios View y Model en el proyecto creado - EssentialsEmailAttach; seguidamente creamos el modelo agregando una clase de nombre EmailProperties.cs en el directorio Model y para finalizar agregamos una Pagina de Contenido de nombre PageEmailSQLite.xaml en el directorio View.

Instalar paquetes desde NuGet:

Puedes instalar los paquetes desde el Administrador de paquetes NuGet o haciendo uso de la consola - Clic en menú herramienta del Visual Studio, clic en administrador de paquetes NuGet, puede  hacer uso al menos 1 de las 2 opciones (consola o Administrador):

Para este ejemplo se utilizo la opción de Administrar paquetes NuGet para la solución...

Examina e instales los paquetes
Xamarin.Essentials y Plugin.Permissions.
 
Se esta haciendo uso de Xamarin.Essentials y
Plugin.Permissions. El paquete Xamarin.Forms
se adiciona al crear el proyecto, en caso no lo
estuviera - puedes instalar siguiendo los mismos
pasos realizados.


Diseño de MVVM:

Para este ejemplo sólo agregaremos un 2 Labels y un Button x:Name="sendEmail" e implementaremos el método Clicked="btn_Clicked" para realizar en envío del email. XAML completo del archivo PageEmailSQLite.xaml:

<?xml version="1.0" encoding="utf-8" ?>

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"

             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"

             x:Class="EssentialsEmailAttach.View.PageEmailSQLite"

             Title="Email con archivo adjunto">

    <ContentPage.Content>       

        <FlexLayout AlignContent="Center" Padding="10,10,10,10">

            <StackLayout>

                <Frame BackgroundColor="#2196F3" Padding="24" CornerRadius="0">

                    <Label Text="Email with attachment file!" HorizontalTextAlignment="Center" TextColor="White" FontSize="36"/>

                </Frame>

                <Label Text="Clic en el bóton Enviar email!" FontSize="25" HorizontalTextAlignment="Center"/>

                <Button x:Name="sendEmail" FontSize="Medium" BorderColor="White" BorderWidth="2" Padding="30,0,30,0"

                        FlexLayout.AlignSelf="Center" CornerRadius="50"  HorizontalOptions="CenterAndExpand"

                        Text="Enviar Email" Clicked="btn_Clicked" TextColor="White" BackgroundColor="#2196F3"/>

            </StackLayout>

        </FlexLayout>

    </ContentPage.Content>

</ContentPage>

Implementar CodeBehind:

En nuestro clase EmailProperties.cs que fue creado para nuestro modelo de entidad a datos, agrega los siguientes atributos.

Implementar modelo:

using System.Collections.Generic;

namespace EssentialsEmailAttach.Model

{       

    public class EmailProperties

    {

        /// <summary>

        /// Atributos para enviar el Email

        /// </summary>

        public string subject { get; set; }

        public string body { get; set; }

        public List<string> to { get; set; }

        //public string to { get; set; }

        public string attachment { get; set; }

    }

}

Implementar PageEmailSQLite.xaml.cs

Iniciamos la implementación importando la librería de using Xamarin.Essentials (para acceder a la propiedad del EmailMessage de la API de Xamarin.Essentials), seguidamente importamos using Plugin.Permissions using Plugin.Permissions.Abstractions para otorgar el permiso de necesario con el fin de poder acceder al archivo local de celular - móvil.

using System;

using System.Collections.Generic;

using System.IO;

using System.Threading.Tasks;

using Xamarin.Essentials;

using Xamarin.Forms;

using Xamarin.Forms.Xaml;

using EssentialsEmailAttach.Model;

using Plugin.Permissions;

using Plugin.Permissions.Abstractions;

 

namespace EssentialsEmailAttach.View

{

    [XamlCompilation(XamlCompilationOptions.Compile)]

    public partial class PageEmailSQLite : ContentPage

    {

        //Instancia al modelo para pasar los datos del email

        EmailProperties emailProperties = new EmailProperties();       

        public PageEmailSQLite()

        {

            InitializeComponent();

        }

        private async void btn_Clicked(object sender, EventArgs e)

        {

            //Otorgar permisos a la aplicación para poder acceder al archivo almacenado en el móvil - celuar

            var storageStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);

 

            if (storageStatus != Plugin.Permissions.Abstractions.PermissionStatus.Granted)

            {

                var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Storage });

                storageStatus = results[Permission.Storage];

            }

            //Acceder a la ubicación de archivo para poder adjunar como parte del email a ser enviado.

            var file = Path.Combine(FileSystem.AppDataDirectory, "/storage/emulated/0/DIAbetes/RPT HADSON PERIODO MAR-2021.xlsx");

 

            //Acceder a la ubicación de archivo para poder adjunar como parte del email a ser enviado.

            DateTime strPeriod = DateTime.Now;

            List<string> emailTo = new List<string>();

            emailTo.Add("hadparedes@hotmail.com");

 

            //Asigna lo valores para cargar a los datos de nuestro modelo EmailProperties

            emailProperties.subject = "Test-01";

            emailProperties.body = "Hola!\n\nEstamos realizando envío de email haciendo uso de la API Xamarin.Essentials "+

                                    "extrayendo los valores del mensaje desde SQLite.\n\nEspero les sea útil."+

                                    "\n\nAtentamente;\nHadson!";

            emailProperties.to = emailTo;

            emailProperties.attachment = file;

 

            //Invoca a la tarea asincrona parando el modelo EmailProperties con el fin de realizar el envío del email

            await SendEmail(emailProperties);

        }

 

        public async Task SendEmail(EmailProperties pemailProperties)

        {

            try

            {

                //Propiedades del mensaje

                var message = new EmailMessage

                {

                    Subject = pemailProperties.subject,

                    Body = pemailProperties.body,

                    To = pemailProperties.to,

                };

                var fn = pemailProperties.attachment;

                var file = Path.Combine(FileSystem.CacheDirectory, fn);

                message.Attachments.Add(new EmailAttachment(file));

 

                //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");

            }

        }

    }

}

Resultado del ejemplo:

Corresponde al MainPage

Página donde se esta implementado
el envío de email
  
Clic en ALLOW (permitir)
  
Dato lista para enviar.

Resultado del envío realizado.


Descarga la fuente desde:


Gratitud a Dios 😊 y gracias a todos ustedes por la acogida de este nuevo articulo, éxitos y bendiciones 🙏 y un gran abrazo a todos ✌...!!!

Publicar un comentario

2 Comentarios

  1. Excelente aporte, solo no me queda claro como se integra el archivo adjunto a la aplicacion

    ResponderBorrar
    Respuestas
    1. Hola un gusto saludarte, para adjuntar el archivo se tiene que definir el origen; como en este ejemplo se esta definiendo de el storage del móvil propiamente dicho - fíjate en está línea de código var file = Path.Combine(FileSystem.AppDataDirectory, "/storage/emulated/0/DIAbetes/RPT HADSON PERIODO MAR-2021.xlsx"); luego la variable file será parte del objeto del mensaje a enviar con está linea
      message.Attachments.Add(new EmailAttachment(file)); lo resto se encarga propiamente la API Xamarin.Essentials.

      Borrar