Condividi tramite


Posta elettronica

Sfoglia l'esempio. Sfoglia l'esempio

Questo articolo descrive come usare l'interfaccia IEmail del framework multipiattaforma .NET MAUI per aprire l'app di posta elettronica predefinita. Quando l'app di posta elettronica viene caricata, può essere impostata per creare un nuovo messaggio di posta elettronica con i destinatari, l'oggetto e il corpo specificati.

L'implementazione predefinita dell'interfaccia IEmail è disponibile tramite la proprietà Email.Default. Sia l'interfaccia IEmail che la classe Email sono contenute nello spazio dei nomi Microsoft.Maui.ApplicationModel.Communication.

Inizia subito

Per accedere alla funzionalità di posta elettronica, è necessaria la configurazione specifica della piattaforma seguente.

Se la versione di destinazione del tuo progetto Android è impostata su Android 11 (R API 30) o superiore, è necessario aggiornare il Manifesto di Android con query che usano i requisiti di visibilità dei pacchetti di Android.

Nel file Piattaforme/Android/AndroidManifest.xml, aggiungere i seguenti nodi di queries/intent nel nodo manifest:

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

Uso della posta elettronica

La funzionalità Posta elettronica funziona fornendo le informazioni di posta elettronica come argomento al metodo ComposeAsync. In questo esempio, il tipo di EmailMessage viene usato per rappresentare le informazioni di posta elettronica:

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);
}

Allegati di file

Quando si crea il messaggio di posta elettronica fornito al client di posta elettronica, è possibile aggiungere allegati di file. Il tipo di file (MIME) viene rilevato automaticamente, quindi non è necessario specificarlo. Alcuni client di posta elettronica possono limitare i tipi di file inviati o impedire del tutto gli allegati.

Utilizzare la raccolta EmailMessage.Attachments per gestire i file allegati a un messaggio di posta elettronica.

Nell'esempio seguente viene illustrato l'aggiunta di un file di immagine agli allegati di posta elettronica.

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);
}

Controllare i percorsi dei file

Importante

Questa sezione si applica solo ad Android.

In alcuni scenari su Android, ad esempio quando un file si trova in un'archiviazione privata, può essere copiato nella cache dell'app, che viene quindi condivisa tramite FileProvidersu Android. Tuttavia, questo può esporre involontariamente l'intera cache e i dati dell'applicazione a un utente malintenzionato. Ciò può essere impedito aggiungendo alla tua app un file di override dei percorsi del provider di file e assicurandoti che i file vengano copiati nel percorso specificato in questo file prima della condivisione.

Per aggiungere un file di sostituzione dei percorsi del provider di file all'app, inserire un file chiamato microsoft_maui_essentials_fileprovider_file_paths.xml nella cartella Platforms\Android\Resources\xml dell'app. Pertanto, il nome file relativo completo al progetto deve essere Platforms\Android\Resources\xml\microsoft_maui_essentials_fileprovider_file_paths.xml. Aggiungere quindi XML al file per i percorsi necessari:

 <?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>

Per altre informazioni sui percorsi del provider di file, vedere FileProvider su developer.android.com.

Prima di condividere un file, assicurati che sia prima salvato nella cartella sharing-root, in una delle posizioni indicate nel file di override.

// 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),
});

È possibile verificare che il file sia condiviso correttamente se l'URI condiviso esclude la directory radice di condivisione. Ad esempio, se si condivide il file <CacheDirectory>/sharing-root/mydata.txt e l'URI condiviso è content://com.companyname.overwritefileproviderpaths.fileProvider/internal_cache/sharing-root/mydata.txt il provider di file non usa il percorso corretto. Se l'URI condiviso è content://com.companyname.overwritefileproviderpaths.fileProvider/internal_cache/mydata.txt, il provider di file usa il percorso corretto.

Avvertimento

Quando si condivide un file, se si riceve un Java.Lang.IllegalArgumentException, con un messaggio simile a "Impossibile trovare la radice configurata che contiene /data/data/com.companyname.overwritefileproviderpaths/cache/some-non-sharing-path/mydata.txt", è molto probabile condividere un file al di fuori della radice di condivisione.

Differenze della piattaforma

Non tutti i client email per Android supportano EmailBodyFormat.Html, poiché non è possibile rilevare questo problema, è consigliabile usare EmailBodyFormat.PlainText quando si inviano email.