【问题标题】:Xamarin.Forms how open default email client on device?Xamarin.Forms 如何在设备上打开默认电子邮件客户端?
【发布时间】:2017-08-29 14:53:59
【问题描述】:

在 Xamarin.Forms 中,如果你想通过点击带有链接的标签来打开设备的默认浏览器,很简单:

private void WebUrl_TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
  var label = sender as Label;

  string url = "http://" + label.Text;

  Device.OpenUri(new Uri(url));
}

有没有类似简单的方法来打开设备的默认电子邮件客户端,打开带有电子邮件地址的 NewMessage?

private void EmailClient_TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
  var label = sender as Label;

  // what goes here?
}

谢谢。

【问题讨论】:

  • 有关最新文档,请参阅 Xamarin.Essentials: Email。在 .NET 6 上,这变成了 .NET MAUI Essentials,即使不使用 MAUI 作为 UI,它也应该可以使用,只需将 <UsingMauiEssentials>true</UsingMauiEssentials> 添加到您的 app.config。

标签: xamarin xamarin.ios xamarin.android xamarin.forms


【解决方案1】:

尝试:

var address = "your.address@gmail.com";
Device.OpenUri(new Uri($"mailto:{address}"));

希望这会有所帮助。-

【讨论】:

  • Android 模拟器说:“不支持的操作 - 当前不支持该操作。”
  • 检查您是否在模拟器中配置了邮件客户端,并在真实设备中尝试。
  • 确实如此。谢谢。
  • @nicael 不知道这是如何/为什么发生的,但我可以告诉你这不是我。当 SO 的整个目标都在提供帮助时,我认为没有理由这样做。
  • 好的,抱歉打扰了!
【解决方案2】:

我实际上使用了依赖服务,以便我可以更好地控制我可以发送到邮件客户端的内容。

首先我创建了一个接口供依赖服务使用,称为 IEmailService。

public interface IEmailService
{
    void CreateEmail(List<string> emailAddresses, List<string> ccs, string subject, string body, string htmlBody);
}

我的 Android 依赖服务如下所示:

[assembly: Xamarin.Forms.Dependency(typeof(EmailService))]
namespace Droid.Services
{
    public class EmailService : IEmailService
    {
         public void CreateEmail(List<string> emailAddresses, List<string> ccs, string subject, string body, string htmlBody)
        {
            var email = new Intent(Android.Content.Intent.ActionSend);

            if (emailAddresses?.Count > 0)
            {
                email.PutExtra(Android.Content.Intent.ExtraEmail, emailAddresses.ToArray());
            }

            if (ccs?.Count > 0)
            {
                email.PutExtra(Android.Content.Intent.ExtraCc, ccs.ToArray());
            }

            email.PutExtra (Android.Content.Intent.ExtraSubject, subject);

            email.PutExtra (Android.Content.Intent.ExtraText, body);

            email.PutExtra (Android.Content.Intent.ExtraHtmlText, htmlBody);



            email.SetType ("message/rfc822");

            MainActivity.SharedInstance.StartActivity(email);

        }
    }
}

对于 iOS:

[assembly: Xamarin.Forms.Dependency(typeof(EmailService))]
namespace iOS.Services
{
    public class EmailService : NSObject, IEmailService, IMFMailComposeViewControllerDelegate
    {


        public void CreateEmail(List<string> emailAddresses, List<string> ccs, string subject, string body, string htmlBody)
        {
            var vc = new MFMailComposeViewController();
            vc.MailComposeDelegate = this;

            if(emailAddresses?.Count > 0)
            {
                vc.SetToRecipients(emailAddresses.ToArray());
            }

            if(ccs?.Count > 0)
            {
                vc.SetCcRecipients(ccs.ToArray());
            }

            vc.SetSubject(subject);
            vc.SetMessageBody(htmlBody, true);
            vc.Finished += (sender, e) =>
            {
                vc.DismissModalViewController(true);
            };



           UIApplication.SharedApplication.Windows[0].
               RootViewController.PresentViewController(vc, true, null);

        }


    }
}

然后我可以在我的代码中调用它:

DependencyService.Get<IEmailService>().CreateEmail(recipients, ccs, subject, body, bodyHtml);

这将在每个平台上打开邮件客户端,并可选择填充收件人、主题和正文字段。

希望对你有帮助。

【讨论】:

  • 这可能行得通,但对于我目前的技能水平来说,这太高级了。我决定接受一个更简单的答案。还是谢谢你。
  • 这是电子邮件依赖服务的优秀入门代码。
  • 你好@Jacob Joz 我知道这是一篇旧帖子,但我正在尝试实施这个解决方案,但我在 android 上遇到了错误:“MainActivity.SharedInstance.StartActivity(email);”什么是共享实例?我想念什么?请指教。
【解决方案3】:

您可以使用存在于Xamarin.Essentials 中的Launcher.OpenAsync(uri)。 OpenUri 从 version 4.3.0. uri = $"mailto:{address}?subject={emailSubject}&amp;body={body content}"; 起已过时

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多