次の方法で共有


電子メール

サンプルを参照します。 サンプルを参照する

この記事では、.NET マルチプラットフォーム アプリ UI (.NET MAUI) IEmail インターフェイスを使用して既定の電子メール アプリを開く方法について説明します。 電子メール アプリが読み込まれると、指定した受信者、件名、本文を含む新しい電子メールを作成するように設定できます。

IEmail インターフェイスの既定の実装は、Email.Default プロパティを使用して使用できます。 IEmail インターフェイスと Email クラスの両方が、Microsoft.Maui.ApplicationModel.Communication 名前空間に含まれています。

始めましょう

電子メール機能にアクセスするには、次のプラットフォーム固有のセットアップが必要です。

プロジェクトのターゲット Android バージョンが Android 11 (R API 30) 以上に設定されている場合は、Android のパッケージ可視性要件を使用するクエリで Android マニフェストを更新する必要があります。

Platforms/Android/AndroidManifest.xml ファイルで、manifest ノードに次のqueries/intent ノードを追加します。

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

電子メールの使用

電子メール機能は、電子メール情報を ComposeAsync メソッドの引数として指定することによって機能します。 この例では、 EmailMessage の種類を使用して電子メール情報を表します。

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

添付ファイル

電子メール クライアントに提供される電子メールを作成するときに、添付ファイルを追加できます。 ファイルの種類 (MIME) は自動的に検出されるため、指定する必要はありません。 一部のメール クライアントでは、送信するファイルの種類が制限されたり、添付ファイルが完全に禁止されたりすることがあります。

EmailMessage.Attachments コレクションを使用して、電子メールに添付されたファイルを管理します。

次の例では、電子メールの添付ファイルに画像ファイルを追加する方法を示します。

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

ファイルの場所を制御する

重要

このセクションは Android にのみ適用されます。

ファイルがプライベート ストレージ内にある場合など、Android 上の一部のシナリオでは、アプリ キャッシュにコピーし、Android FileProvider経由で共有できます。 ただし、これにより、キャッシュとアプリのデータ 全体が意図せずに攻撃者に公開 可能性があります。 これを防ぐには、ファイル プロバイダーのファイル パスオーバーライド ファイルをアプリに追加し、共有前にこのファイルで指定された場所にファイルがコピーされるようにします。

ファイル プロバイダー のファイル パスオーバーライド ファイルをアプリに追加するには、microsoft_maui_essentials_fileprovider_file_paths.xml という名前のファイルをアプリの Platforms\Android\Resources\xml フォルダーに追加します。 したがって、プロジェクトに対する完全な相対ファイル名は、プラットフォーム\Android\Resources\xml\microsoft_maui_essentials_fileprovider_file_paths.xmlです。 次に、必要なパスの XML をファイルに追加します。

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

ファイル プロバイダーパスの詳細については、developer.android.com の FileProvider を参照してください。

ファイルを共有する前に、オーバーライド ファイルのいずれかの場所にある sharing-root フォルダーに最初に書き込まれるようにする必要があります。

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

共有 URI で共有ルート ディレクトリが除外されている場合は、ファイルが正しく共有されていることを確認できます。 たとえば、CacheDirectory</sharing-root/mydata.txt>ファイルを共有し、共有 URI が content://com.companyname.overwritefileproviderpaths.fileProvider/internal_cache/sharing-root/mydata.txt 場合、ファイル プロバイダーは正しいパスを使用していません。 共有 URI が content://com.companyname.overwritefileproviderpaths.fileProvider/internal_cache/mydata.txt 場合、ファイル プロバイダーは正しいパスを使用しています。

警告

ファイルを共有するときに、"Failed to find configured root that contains /data/data/com.companyname.overwritefileproviderpaths/cache/some-non-sharing-path/mydata.txt" のようなメッセージが含まれる Java.Lang.IllegalArgumentExceptionを受け取った場合、あなたが共有しているファイルは共有ルートの外部にある可能性が非常に高いです。

プラットフォームの違い

Android 用のすべての電子メール クライアントが EmailBodyFormat.Htmlをサポートしているわけではありません。これを検出する方法がないため、電子メールを送信するときに EmailBodyFormat.PlainText を使用することをお勧めします。