2015-08-25 47 views
6

我已经尝试了以下代码从通用Windows平台应用发送电子邮件。当我使用EmailMessageBodyKind :: PlainText时它工作正常。但是,如下面的代码所示,EmailMessageBodyKind :: Html似乎启动没有内容的电子邮件客户端。有谁知道需要设置还有什么得到这个工作 - 该文件是稀疏8(Win 10 UWP EmailMessage API是否支持HTML体?

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"[email protected]")); 
     email->Subject = L"Email Report"; 
     auto randomAccessStreamReference = RandomAccessStreamReference::CreateFromStream(memStream); 
     email->SetBodyStream(EmailMessageBodyKind::Html, randomAccessStreamReference); 
     EmailManager::ShowComposeNewEmailAsync(email); 
    } 
); 
+0

也许你需要在写入流之后重新设置seek指针。 –

+0

是的 - 我曾试过 - 但不幸的是添加memStream-> Seek(0); (在EmailManager :: ShowComposeNewEmailAsync(电子邮件)之前;当然的调用)没有效果。 – Kookei

回答

3

嗯,我有一些坏消息要告诉你

这是不可能这样做的。使用EmailManager.ShowComposeNewEmailAsync

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

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

的事情是:EmailManager.ShowComposeNewEmailAsync使用mailto发送消息,并在some other question already answered here说:

RFC 2368 2说,体场应该是在 text/plain的格式,所以你不能做HTML。

但是,即使您使用纯文本,但某些现代邮件客户端可能会将生成的链接呈现为可点击链接,尽管如此,仍然可以使用 。

这就是说,你依靠邮件客户端来为你呈现HTML。
我已经使用Windows 10邮件客户端,Gmail和Outlook(以后在网络浏览器上)测试过这些,并且它们都未能在邮件正文上呈现简单的HTML <b>标签,而是将其显示为纯文本。

现在,对于替代品(从that same MSDN forum thread):

需要注意的是,如果我使用ShareDataContract(DataTransferManager),我 能够设置HTML的请求,它会出现在电子邮件 正文如果用户选择通过邮件共享。不过,我想 跳过共享用户界面,并直接与撰写电子邮件与 收件人已填充,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. 您不能预先指定邮件收件人。