Win 10的UWP邮件API是否支持HTML正文?

6

我尝试使用以下代码从通用Windows平台应用程序发送电子邮件。当我使用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);
    }
);

也许你需要在向流写入数据后重新设置查找指针。 - Chris Guzak
是的,我已经尝试过了,但不幸的是在调用EmailManager::ShowComposeNewEmailAsync(email)之前添加memStream->Seek(0);没有任何效果。 - Kookei
1个回答

3

很抱歉告诉您一个不好的消息。

使用EmailManager.ShowComposeNewEmailAsync无法实现此功能。

关于使用SetBodyStreamEmailMessageBodyKind.Html,我们在MSDN论坛中找到:

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

问题是:EmailManager.ShowComposeNewEmailAsync使用mailto发送消息,并且正如在其他问题中已经回答过的

RFC 2368第2节说明正文字段应为纯文本格式,因此无法使用HTML。

但即使使用纯文本,一些现代邮件客户端仍然可能将结果链接呈现为可点击的链接。

也就是说,您需要依赖邮件客户端来呈现HTML。
我已经在Windows 10 Mail客户端、Gmail和Outlook(后两者使用Web浏览器)上进行了测试,所有这些客户端都无法渲染电子邮件正文中一个简单的HTML <b>标签,而是将其显示为纯文本。

现在,有一些替代方案(来自相同的MSDN论坛帖子):

请注意,如果使用ShareDataContract(DataTransferManager),则可以在请求中设置HTML,并且如果用户选择通过电子邮件分享,则会在电子邮件正文中显示。但是,我想跳过共享UI,直接创建一个带有已填充收件人、HTML正文和图像附件的电子邮件。

一种替代方法是将HTML正文保存到文件中,然后将该文件作为其他附件包含在内,但这不是理想的方法。

DataTransferManager 成功格式化了 HTML 消息。 这是一个小样例,展示你的样例代码将会是什么样子。该样例代码改编自 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);
}

这种方法的局限性如下:
  1. 你无法强制用户选择电子邮件作为分享选项。
  2. 无法事先指定收件人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接