この記事では、.NET マルチプラットフォーム アプリ UI (.NET MAUI) IEmail インターフェイスを使用して既定の電子メール アプリを開く方法について説明します。 電子メール アプリが読み込まれると、指定した受信者、件名、本文を含む新しい電子メールを作成するように設定できます。
IEmail
インターフェイスの既定の実装は、Email.Default プロパティを使用して使用できます。
IEmail
インターフェイスと Email
クラスの両方が、Microsoft.Maui.ApplicationModel.Communication
名前空間に含まれています。
始めましょう
電子メール機能にアクセスするには、次のプラットフォーム固有のセットアップが必要です。
- Android
-
iOS/Mac Catalyst
- Windows
プロジェクトのターゲット 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
-
iOS/Mac Catalyst
- Windows
Android 用のすべての電子メール クライアントが EmailBodyFormat.Htmlをサポートしているわけではありません。これを検出する方法がないため、電子メールを送信するときに EmailBodyFormat.PlainText を使用することをお勧めします。
.NET MAUI