MAUI作为跨平台应用开发框架,本身没有提供统一的邮件发送接口,要实现发送电子邮件的功能,需要通过依赖服务的方式,分别实现各平台的邮件发送逻辑,再通过统一的接口调用。这种方式可以适配Android、iOS、Windows等不同平台的原生邮件能力,保证功能在各平台正常运行。

定义邮件发送接口
首先在MAUI项目的共享代码部分定义一个通用的邮件发送接口,所有平台都实现这个接口,上层调用时只需要依赖接口即可,不需要关心具体平台的实现细节。
// 定义邮件发送接口
public interface IEmailService
{
// 发送邮件的方法,参数为收件人、主题、内容
Task SendEmailAsync(string to, string subject, string body);
}
各平台实现接口
Android平台实现
Android平台可以通过隐式意图调用系统自带的邮件应用来发送邮件,这种方式不需要应用本身配置邮件服务器,用户可以使用自己已登录的邮箱账户发送。
using Android.App;
using Android.Content;
using Android.OS;
using Microsoft.Maui.Controls;
// Android平台的邮件服务实现
public class EmailService_Android : IEmailService
{
public async Task SendEmailAsync(string to, string subject, string body)
{
// 创建发送邮件的意图
Intent emailIntent = new Intent(Intent.ActionSend);
// 设置类型为邮件
emailIntent.SetType("message/rfc822");
// 添加收件人
emailIntent.PutExtra(Intent.ExtraEmail, new string[] { to });
// 添加邮件主题
emailIntent.PutExtra(Intent.ExtraSubject, subject);
// 添加邮件内容
emailIntent.PutExtra(Intent.ExtraText, body);
// 启动系统邮件应用,使用新建任务的方式启动
emailIntent.AddFlags(ActivityFlags.NewTask);
// 获取当前上下文并启动活动
Android.App.Application.Context.StartActivity(emailIntent);
await Task.CompletedTask;
}
}
iOS平台实现
iOS平台同样可以调用系统的邮件组件,需要引入对应的原生库,通过MFMailComposeViewController来实现邮件发送功能,使用前需要判断设备是否支持邮件发送。
using Foundation;
using UIKit;
using Microsoft.Maui.Controls;
// iOS平台的邮件服务实现
public class EmailService_iOS : IEmailService
{
public async Task SendEmailAsync(string to, string subject, string body)
{
// 判断设备是否支持发送邮件
if (MFMailComposeViewController.CanSendMail)
{
// 创建邮件编写控制器
MFMailComposeViewController mailController = new MFMailComposeViewController();
// 设置收件人
mailController.SetToRecipients(new string[] { to });
// 设置邮件主题
mailController.SetSubject(subject);
// 设置邮件内容
mailController.SetMessageBody(body, false);
// 获取当前窗口的根视图控制器并展示邮件页面
UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(mailController, true, null);
}
else
{
// 设备不支持发送邮件时提示用户
await App.Current.MainPage.DisplayAlert("提示", "当前设备未配置邮件账户,无法发送邮件", "确定");
}
await Task.CompletedTask;
}
}
Windows平台实现
Windows平台可以使用Windows.ApplicationModel.Email命名空间下的EmailManager类来调用系统邮件功能,实现邮件发送。
using Windows.ApplicationModel.Email;
using Microsoft.Maui.Controls;
// Windows平台的邮件服务实现
public class EmailService_Windows : IEmailService
{
public async Task SendEmailAsync(string to, string subject, string body)
{
// 创建邮件消息对象
EmailMessage emailMessage = new EmailMessage();
// 添加收件人
emailMessage.To.Add(new EmailRecipient(to));
// 设置邮件主题
emailMessage.Subject = subject;
// 设置邮件内容
emailMessage.Body = body;
// 调用系统邮件应用发送邮件
await EmailManager.ShowComposeNewEmailAsync(emailMessage);
}
}
注册依赖服务
定义好各平台的实现类之后,需要在MAUI的项目配置中注册这些依赖服务,让框架可以在运行时自动匹配对应平台的实现。
在MauiProgram.cs文件中添加服务注册代码:
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using Microsoft.Extensions.DependencyInjection;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
// 注册邮件服务,根据平台自动匹配实现
builder.Services.AddTransient<IEmailService, EmailService_Android>();
builder.Services.AddTransient<IEmailService, EmailService_iOS>();
builder.Services.AddTransient<IEmailService, EmailService_Windows>();
return builder.Build();
}
}
调用邮件发送功能
完成上述配置之后,就可以在页面的业务逻辑中调用邮件发送功能了,通过依赖注入获取IEmailService实例,调用对应的方法即可。
using Microsoft.Maui.Controls;
using System.Threading.Tasks;
public partial class MainPage : ContentPage
{
private readonly IEmailService _emailService;
// 通过构造函数注入邮件服务
public MainPage(IEmailService emailService)
{
InitializeComponent();
_emailService = emailService;
}
// 发送邮件按钮的点击事件
private async void OnSendEmailClicked(object sender, EventArgs e)
{
try
{
// 调用发送邮件方法,传入收件人、主题、内容
await _emailService.SendEmailAsync("test@ipipp.com", "MAUI测试邮件", "这是一封通过MAUI应用发送的测试邮件");
await DisplayAlert("成功", "邮件已成功调起发送", "确定");
}
catch (Exception ex)
{
await DisplayAlert("失败", $"发送邮件失败:{ex.Message}", "确定");
}
}
}
常见问题说明
- 如果调用后没有调起邮件应用,需要检查对应平台是否配置了邮件账户,尤其是iOS和Windows平台,未配置账户会导致功能无法使用。
- Android平台如果安装了多个邮件应用,系统会弹出选择器让用户选择使用哪个应用发送,属于正常情况。
- 这种方式调用的是系统邮件应用,邮件最终由用户手动点击发送,应用本身不会直接发送邮件,不需要配置SMTP服务器信息。
- 如果需要应用后台自动发送邮件,不依赖用户操作,需要配置SMTP服务,这种方式不属于依赖服务的范畴,需要单独实现SMTP客户端逻辑。