Compartir a través de


Correo electrónico

Examinar ejemplo. Examinar el ejemplo

En este artículo se describe cómo puede usar la interfaz de interfaz de usuario de aplicaciones multiplataforma de .NET (.NET MAUI) IEmail para abrir la aplicación de correo electrónico predeterminada. Cuando se carga la aplicación de correo electrónico, se puede establecer para crear un nuevo correo electrónico con los destinatarios, asunto y cuerpo especificados.

La implementación predeterminada de la interfaz IEmail está disponible a través de la propiedad Email.Default. Tanto la interfaz IEmail como la clase Email se encuentran en el espacio de nombres Microsoft.Maui.ApplicationModel.Communication.

Comenzar

Para acceder a la funcionalidad de correo electrónico, se requiere la siguiente configuración específica de la plataforma.

Si la versión de Android de destino del proyecto está establecida en Android 11 (R API 30) o superior, debe actualizar el manifiesto de Android con consultas que usen los requisitos de visibilidad de paquetes de Android.

En el archivo Platforms/Android/AndroidManifest.xml , agregue los siguientes queries/intent nodos en el manifest nodo:

<queries>
  <intent>
    <action android:name="android.intent.action.SENDTO" />
    <data android:scheme="mailto" />
  </intent>
</queries>

Uso de correo electrónico

La funcionalidad Correo electrónico funciona proporcionando la información de correo electrónico como argumento para el ComposeAsync método . En este ejemplo, el EmailMessage tipo se usa para representar la información de correo electrónico:

if (Email.Default.IsComposeSupported)
{

    string subject = "Hello friends!";
    string body = "It was great to see you last weekend.";
    string[] recipients = new[] { "john@contoso.com", "jane@contoso.com" };

    var message = new EmailMessage
    {
        Subject = subject,
        Body = body,
        BodyFormat = EmailBodyFormat.PlainText,
        To = new List<string>(recipients)
    };

    await Email.Default.ComposeAsync(message);
}

Archivos adjuntos

Al crear el correo electrónico proporcionado al cliente de correo electrónico, puede agregar archivos adjuntos. El tipo de archivo (MIME) se detecta automáticamente, por lo que no es necesario especificarlo. Algunos clientes de correo pueden restringir los tipos de archivos que envíe o, posiblemente, impedir los datos adjuntos por completo.

Use la EmailMessage.Attachments colección para administrar los archivos adjuntos a un correo electrónico.

En el ejemplo siguiente se muestra cómo agregar un archivo de imagen a los datos adjuntos de correo electrónico.

if (Email.Default.IsComposeSupported)
{

    string subject = "Hello friends!";
    string body = "It was great to see you last weekend. I've attached a photo of our adventures together.";
    string[] recipients = new[] { "john@contoso.com", "jane@contoso.com" };

    var message = new EmailMessage
    {
        Subject = subject,
        Body = body,
        BodyFormat = EmailBodyFormat.PlainText,
        To = new List<string>(recipients)
    };

    string picturePath = Path.Combine(FileSystem.CacheDirectory, "memories.jpg");

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

    await Email.Default.ComposeAsync(message);
}

Controlar ubicaciones de archivos

Importante

Esta sección solo se aplica a Android.

En algunos escenarios de Android, como cuando un archivo está en almacenamiento privado, se puede copiar en la memoria caché de la aplicación, que luego se comparte a través de una FileProviderde Android. Sin embargo, esto puede exponer involuntariamente toda la memoria caché y los datos de la aplicación a un atacante. Esto se puede evitar agregando un archivo de anulación de rutas de archivo del proveedor en tu aplicación y asegurándote de que los archivos se copian en la ubicación especificada en este archivo antes de compartir.

Para añadir un archivo de anulación de rutas de acceso de proveedor de archivos a tu aplicación, agrega un archivo llamado microsoft_maui_essentials_fileprovider_file_paths.xml a la carpeta Platforms\Android\Resources\xml de la aplicación. Por lo tanto, el nombre de archivo relativo completo al proyecto debe ser Plataformas\Android\Resources\xml\microsoft_maui_essentials_fileprovider_file_paths.xml. A continuación, agregue XML al archivo para las rutas de acceso necesarias:

 <?xml version="1.0" encoding="UTF-8" ?>
 <paths>
    <external-path name="external_files" path="sharing-root" />
    <cache-path name="internal_cache" path="sharing-root" />
    <external-cache-path name="external_cache" path="sharing-root" />  
 </paths>

Para obtener más información sobre las rutas de acceso del proveedor de archivos, consulte FileProvider en developer.android.com.

Antes de compartir un archivo, debe asegurarse de que esté escrito primero en la carpeta raíz de uso compartido en una de las ubicaciones del archivo de anulación:

// Write into the specific sub-directory
var dir = Path.Combine(FileSystem.CacheDirectory, "sharing-root");  
Directory.CreateDirectory(dir);
var file = Path.Combine(dir, "mydata.txt");
await File.WriteAllTextAsync(file, $"My data: {count}");

// Share the file
await Launcher.OpenAsync(new OpenFileRequest
{
   Title = "My data",
   File = new ReadOnlyFile(file),
});

Puede comprobar que el archivo se comparte correctamente si el URI compartido excluye el directorio raíz de uso compartido. Por ejemplo, si comparte el archivo <CacheDirectory>/sharing-root/mydata.txt y el URI compartido es content://com.companyname.overwritefileproviderpaths.fileProvider/internal_cache/sharing-root/mydata.txt el proveedor de archivos no usa la ruta de acceso correcta. Si el URI compartido es content://com.companyname.overwritefileproviderpaths.fileProvider/internal_cache/mydata.txt, el proveedor de archivos usa la ruta de acceso correcta.

Advertencia

Al compartir un archivo, si recibe un Java.Lang.IllegalArgumentException, con un mensaje similar a "No se pudo encontrar la raíz configurada que contiene /data/data/com.companyname.overwritefileproviderpaths/cache/some-non-sharing-path/mydata.txt", es probable que esté compartiendo un archivo que se encuentra fuera de la raíz de uso compartido.

Diferencias de plataforma

No todos los clientes de correo electrónico para android admiten EmailBodyFormat.Html, ya que no hay ninguna manera de detectar esto, se recomienda usar EmailBodyFormat.PlainText al enviar correos electrónicos.