2015-08-25 12 views
6

Próbowałem następujący kod, aby wysłać wiadomość e-mail z aplikacji Universal Windows Platform. Działa dobrze, gdy używam EmailMessageBodyKind :: PlainText. Jednak, jak wskazano w poniższym kodzie, wydaje się, że EmailMessageBodyKind :: Html uruchamia klienta poczty e-mail bez zawartości. Czy ktoś wie, co jeszcze musi być ustawiony, aby uzyskać to do pracy - dokumentacja jest rozrzedzony 8 (Czy interfejs API Win 10 UWP EmailMessage obsługuje treść 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

Może trzeba ponownie ustawić wskaźnik wyszukiwania po napisaniu do strumienia. –

+0

Tak - próbowałem tego - ale niestety dodawałem memStream-> Seek (0); (przed programem EmailManager :: ShowComposeNewEmailAsync (e-mail), wywołanie kursu) nie ma żadnego efektu. – Kookei

Odpowiedz

3

Cóż, mam złe wieści dla ciebie

To nie jest możliwe, aby to zrobić. stosując EmailManager.ShowComposeNewEmailAsync

Odnośnie korzystania SetBodyStream z EmailMessageBodyKind.Html, mamy ten from MSDN forum:

Obecnie program EmailMessageBodyKind.Html nie będzie działał w celu utworzenia nowej wiadomości e-mail w formacie HTML i nie ma innej możliwości obejścia tego problemu. Sprawdziłem wewnętrzny zasób, który został sprawdzony przez . Ten interfejs API służy do zapełniania wiadomości z serwera aplikacji i zapisz wiadomość e-mail w folderze lokalnym.

Chodzi o to: EmailManager.ShowComposeNewEmailAsync wykorzystuje mailto aby wysłać wiadomość i, jak stwierdzono w some other question already answered here:

Sekcja 2 RFC 2368 mówi, że pole ciało ma być w text/plain formacie więc nie możesz zrobić HTML.

Jednak nawet jeśli używasz zwykłego tekstu, możliwe jest, że niektórzy nowocześni klienci pocztowi będą renderować wynikowy odnośnik jako klikalny link, .

Mówiąc to, polegasz na kliencie pocztowym, aby renderować ten HTML.
Przetestowałem to za pomocą klienta poczty systemu Windows 10, Gmaila i programu Outlook (zarówno późniejszego w przeglądarce internetowej), a wszystkie z nich nie renderowały prostego znacznika HTML <b> w treści wiadomości, pokazując go jako zwykły tekst.

Teraz dla alternatyw (z that same MSDN forum thread):

Należy pamiętać, że w przypadku korzystania z ShareDataContract (DataTransferManager), jestem stanie ustawić HTML we wniosku i pojawi się w e-mailu treść, jeśli użytkownik zdecyduje się udostępnić za pośrednictwem poczty. Jednak chciałbym pomijać interfejs udostępniania i przejść bezpośrednio do komponowania wiadomości e-mail z już wypełnionym odbiorcą, treścią HTML i załącznikami do obrazów.

Jedną z alternatyw jest utrzymywać ciało HTML do pliku, a następnie dołączyć że plik jako dodatkowego zajęcia, jednak, że nie jest idealny

DataTransferManager powodzeniem sformatowane wiadomości w formacie HTML. Oto mała próbka tego, jak Twój przykładowy kod będzie wyglądać, dostosowany 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); 
} 

ograniczeń tego podejścia są:

  1. Nie można zmusić użytkownika, aby zaznaczyć wiadomość jako dzielenie opcja
  2. Nie można wcześniej określić adresata wiadomości e-mail.
Powiązane problemy