Win 10 UWP EmailMessage API是否支持HTML主体?

Koo*_*kei 6 html email windows-runtime c++-cx uwp

我尝试了以下代码从Universal Windows Platform应用程序发送电子邮件.当我使用EmailMessageBodyKind :: PlainText时,它工作正常.但是,如下面的代码所示,EmailMessageBodyKind :: Html似乎启动了没有内容的电子邮件客户端.有谁知道还需要设置什么才能使其工作 - 文档稀疏8(

using namespace Windows::Storage::Streams;
using namespace Windows::ApplicationModel::Email;
using namespace Windows::Security::Cryptography;
auto bin = CryptographicBuffer::ConvertStringToBinary(
    L"<html><body>this <b>is</b> text</body></html>",
    BinaryStringEncoding::Utf16LE);
auto memStream = ref new InMemoryRandomAccessStream();
concurrency::create_task(memStream->WriteAsync(bin)).then(
    [memStream](unsigned)
    {
        auto email = ref new EmailMessage();
        email->To->Append(ref new EmailRecipient(L"test@gmail.com"));
        email->Subject = L"Email Report";
        auto randomAccessStreamReference = RandomAccessStreamReference::CreateFromStream(memStream);
        email->SetBodyStream(EmailMessageBodyKind::Html, randomAccessStreamReference);
        EmailManager::ShowComposeNewEmailAsync(email);
    }
);
Run Code Online (Sandbox Code Playgroud)

Gab*_*nha 3

好吧,我有一些坏消息要告诉你。

使用以下方法无法做到这一点EmailManager.ShowComposeNewEmailAsync

关于使用SetBodyStreamwith EmailMessageBodyKind.Html,我们从 MSDN 论坛得到了这个:

目前,EmailMessageBodyKind.Html 无法创建新的 HTML 电子邮件,并且没有其他方法作为解决方法,我已经检查了内部资源,此 API 用于从应用程序服务器填充消息并保存电子邮件 -邮件消息到本地文件夹。

事情是:EmailManager.ShowComposeNewEmailAsync用于mailto发送消息,并且如此处已回答的其他一些问题所述:

RFC 2368第 2 节规定,正文字段应该采用文本/纯格式,因此不能使用 HTML。

然而,即使您使用纯文本,某些现代邮件客户端也可能会将生成的链接呈现为可点击的链接。

话虽这么说,您依赖邮件客户端来为您呈现该 HTML。我已经使用 Windows 10 邮件客户端、Gmail 和 Outlook(两者都在网络浏览器上)进行了测试,所有这些都无法在邮件正文上
呈现简单的 HTML 标签,而是将其显示为纯文本。<b>

现在,对于替代方案(来自同一个 MSDN 论坛线程):

请注意,如果我使用 ShareDataContract (DataTransferManager),我可以在请求中设置 HTML,并且如果用户选择通过邮件共享,它将显示在电子邮件正文中。不过,我想跳过共享 UI,直接撰写一封电子邮件,其中已填充收件人、HTML 正文和图像附件。

一种替代方法是将 HTML 正文保留到文件中,然后将该文件作为附加附件包含在内,但这并不理想

DataTransferManagerHTML 消息的格式已成功设置。以下是示例代码的一个小示例,改编自 MSDN

void YourView::ShareHtml()
{
    DataTransferManager^ dataTransferManager = DataTransferManager::GetForCurrentView();
    auto dataRequestedToken = dataTransferManager->DataRequested += 
        ref new TypedEventHandler<DataTransferManager^, DataRequestedEventArgs^>(
            this, &YourView::OnShareHtml);
    DataTransferManager::ShowShareUI();
}

void YourView::OnShareHtml(DataTransferManager^ sender, DataRequestedEventArgs^ e)
{
    DataRequest^ request = e->Request;
    request->Data->Properties->Title = "Email Report";

    String^ html = L"<html><body>this <b>is</b> text</body></html>";
    String^ htmlFormat = HtmlFormatHelper::CreateHtmlFormat(html);
    request->Data->SetHtmlFormat(htmlFormat);
}
Run Code Online (Sandbox Code Playgroud)

这种方法的局限性是:

  1. 您不能强迫用户选择电子邮件作为共享选项
  2. 您无法预先指定邮件收件人。