2015-08-25 14 views
6

Ho provato il seguente codice per inviare un'e-mail da un'app universale per piattaforma Windows. Funziona perfettamente quando uso EmailMessageBodyKind :: PlainText. Tuttavia, come indicato nel seguente codice, EmailMessageBodyKind :: Html sembra avviare il client di posta elettronica senza contenuto. Qualcuno sa che cosa deve essere impostato per ottenere questo al lavoro - la documentazione è scarsa 8 (L'API di Email Message UWP di Win 10 supporta un corpo 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

forse è necessario reimpostare il puntatore di ricerca dopo aver scritto nello stream. –

+0

Sì, l'avevo provato, ma sfortunatamente aggiungendo memStream-> Seek (0); (prima di EmailManager :: ShowComposeNewEmailAsync (email); call of course) non ha alcun effetto. – Kookei

risposta

3

Beh, ho una brutta notizia per voi

non è possibile farlo. utilizzando EmailManager.ShowComposeNewEmailAsync

Per quanto riguarda usando SetBodyStream con EmailMessageBodyKind.Html, abbiamo questa from MSDN forum:

Attualmente, l'EmailMessageBodyKind.Html non funzionerà per creare una nuova e-mail HTML e non c'è altro modo per ovviare al problema, ho controllato la risorsa interna , questa API è utilizzata per popolare i messaggi dal server delle app e salva il messaggio di posta elettronica nella cartella locale.

La cosa è: EmailManager.ShowComposeNewEmailAsync utilizza mailto per inviare il messaggio e, come indicato in some other question already answered here:

sezione 2 del RFC 2368 dice che il campo corpo dovrebbe essere in formato testo/plain, quindi non puoi fare HTML.

Tuttavia, anche se si utilizza un testo normale, è possibile che alcuni client di posta moderna visualizzino comunque il collegamento risultante come collegamento selezionabile, .

Detto questo, ti stai affidando al client di posta per renderlo HTML.
L'ho provato utilizzando Windows 10 Mail Client, Gmail e Outlook (entrambi i successivi su un browser Web) e tutti non sono riusciti a rendere un semplice tag HTML <b> sul corpo della posta, mostrandolo come testo normale.

Ora, per le alternative (da that same MSDN forum thread):

Si noti che se uso lo ShareDataContract (DataTransferManager), io sono in grado di impostare il codice HTML nella richiesta e apparirà nella e-mail corpo se l'utente sceglie di condividere via Mail. Tuttavia mi piacerebbe saltare l'interfaccia utente Condividi e andare direttamente con la composizione di un messaggio di posta elettronica con il destinatario già compilato, corpo HTML e allegati immagine.

Un'alternativa è quella di persistere il corpo HTML in un file e quindi includere che file come allegato aggiuntivo, tuttavia, che non è l'ideale

Il DataTransferManager formattata correttamente il messaggio HTML. Ecco un piccolo esempio di come il vostro codice di esempio sarà simile, adattato 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); 
} 

I limiti di questo approccio sono:

  1. Non si può obbligare l'utente a selezionare e-mail come la condivisione opzione
  2. Non è possibile specificare in precedenza il destinatario della posta.