2015-08-25 46 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. 您不能預先指定郵件收件人。