【问题标题】:Does the Win 10 UWP EmailMessage API support having an HTML body?Win 10 UWP EmailMessage API 是否支持 HTML 正文?
【发布时间】:2015-11-18 19:55:39
【问题描述】:

我已尝试使用以下代码从通用 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);
    }
);

【问题讨论】:

  • 写入流后可能需要重新设置搜索指针。
  • 是的 - 我试过了 - 但不幸的是添加了 memStream->Seek(0); (在 EmailManager::ShowComposeNewEmailAsync(email); 当然调用之前)没有效果。

标签: html email windows-runtime c++-cx uwp


【解决方案1】:

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

使用EmailManager.ShowComposeNewEmailAsync是不可能的

关于使用SetBodyStreamEmailMessageBodyKind.Html,我们有这个from MSDN forum:

目前,EmailMessageBodyKind.Html 不适用于创建新的 HTML电子邮件,没有其他方法可以解决,我已经检查过 内部资源,此 API 用于填充来自 应用服务器并将电子邮件信息保存到本地文件夹中。

问题是:EmailManager.ShowComposeNewEmailAsync 使用mailto 发送消息,如some other question already answered here 所述:

RFC 2368 的第 2 节说 body 字段应该在 text/plain 格式,所以你不能做 HTML。

但是,即使您使用纯文本,一些现代邮件也可能 无论如何,客户端会将生成的链接呈现为可点击的链接, 不过。

话虽如此,您依赖邮件客户端为您呈现 HTML。
我已经使用 Windows 10 邮件客户端、Gmail 和 Outlook(两者都在 Web 浏览器上)对此进行了测试,但它们都未能在邮件正文上呈现简单的 HTML &lt;b&gt; 标记,而是将其显示为纯文本。

现在,对于替代方案(来自that same MSDN forum thread):

请注意,如果我使用 ShareDataContract (DataTransferManager),我是 能够在请求中设置 HTML,它将出现在电子邮件中 如果用户选择通过邮件共享,则为正文。不过我想 跳过共享 UI 并直接使用 撰写电子邮件 收件人已填充、HTML 正文和图像附件。

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

DataTransferManager 成功格式化了 HTML 消息。这是您的示例代码的外观小示例,改编自 from 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. 您不能事先指定邮件收件人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2020-07-30
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多