2015-03-13 37 views
6

Mamy dziwny problem z Outlookiem, który ostatnio ma wpływ na niektórych użytkowników.Program Outlook ReportItem.Body zwracający niepoprawne kodowanie dla niektórych użytkowników

Jeśli niektórzy użytkownicy zautomatyzują klienta Outlook do przeglądania odbić/ReportItems w udostępnionej skrzynce odbiorczej, zamiast zwracania czystego tekstu wiadomości, jak wskazuje dokumentacja, otrzymujemy ciąg znaków Unicode, który został zanalizowany jako UTF- 8 ciągów - więc wygląda jak chiński.

Teraz mogę ominąć to z pewnym kodem, ale dodatkowym problemem jest to, że ta zmiana występuje również w programie Outlook dla wszystkich użytkowników z dostępem do tej skrzynki. Sama wiadomość wyświetlana w programie Outlook wygląda jak chińska - oryginalny HTML Unicode jest analizowany jako UTF-8.

Wygląda na to, że może to być znany problem, ale chciałem sprawdzić, czy mogę tu uzyskać jakieś porady.

Jesteśmy przy użyciu zwykłych metod, aby uzyskać dostęp do pozycji raportu:

For Counter as Integer = Inbox.Items.Count To 1 Step -1 
    Dim Report As Outlook.ReportItem = Inbox.Items(Counter) 
    Dim Body As String = Report.Body 

Ostatni wiersz jest gdzie uzyskać tekst garbaled. W VBA próbuje przeanalizować go jako ASCII i zwraca duży blok "?" podczas gdy w .Net zwraca wartość parsowaną jako UTF-8 i otrzymujemy znaki, które wyglądają jak chińskie. W obu przypadkach oryginalny element raportu w skrzynce odbiorczej zaczyna wyświetlać się jako znaki chińskie i nadal robi to dla wszystkich użytkowników tej skrzynki odbiorczej.

Wszelkie pomysły?

AKTUALIZACJA: Chciałem udostępnić aktualizację, ponieważ wygląda na to, że kilka osób nadal ją widzi.

Chcę szybko podkreślić, że problem kodowania jest tu dobrze omawiany, a dostęp do treści wiadomości za pośrednictwem kodu jest ograniczony i dość łatwy. Jednak numer, problem z kodowaniem nadal istnieje w kliencie Outlook i nigdy nie został rozwiązany, a ten problem był moim powodzeniem. Musi występować jakiś błąd w właściwości .Body, który atakuje kodowanie oryginalnego obiektu wiadomości na serwerze Exchange. Powodzenia dla każdego, kto potrzebuje rozwiązać ten konkretny problem.

AKTUALIZUJ PONOWNIE: Odpowiedź i bardziej szczegółowy opis problemu zostały zamieszczone poniżej i wybrane jako odpowiedź.

Odpowiedz

3

Tak, wystąpił problem z ReportItem.Właściwość ciała w modelu obiektowym programu Outlook (obecna w programie Outlook 2013 i 2016) - można to zobaczyć w artykule: OutlookSpy: wybierz wiadomość o niedostarczeniu, kliknij przycisk Element, wybierz właściwość Ciało - będzie ona zniekształcona. Co gorsza, po zetknięciu elementu raportu z OOM, Outlook wyświetli te same śmieci w okienku podglądu.

Tekst raportu jest przechowywany w różnych właściwościach odbiorcy MAPI (kliknij przycisk Wiadomości w OutlookSpy i przejdź do zakładki GetRecipientTable). Problem polega na tym, że obiekt ReportItem nie eksponuje kolekcji Odbiorcy. Rozwiązaniem jest albo użyć rozszerzonego interfejsu MAPI (C++ lub Delphi) lub Redemption (dowolny język) - jego ReportItem nieruchomość .ReportText nie ma tego problemu:

set oItem = Application.ActiveExplorer.Selection(1) 
set oSession = CreateObject("Redemption.RDOSession") 
oSession.MAPIOBJECT = Application.Session.MAPIOBJECT 
set rItem = oSession.GetRDOObjectFromOutlookObject(oItem) 
MsgBox rItem.ReportText 
+0

Nice. Chociaż rozwiązanie może nie być praktyczne dla wszystkich, jest to najbardziej szczegółowe wyjaśnienie problemu, który już widziałem. A ponieważ jest to praca nad wadą, nie sądzę, że można oczekiwać, że będzie dobrze działać we wszystkich przypadkach. Dziękujemy za dodanie nowych informacji! – MattB

0

Czy jesteś pewien, że wywołanie Inbox.Items (Counter) zwraca instancję klasy ReportItem? Czy miałeś okazję sprawdzić właściwość MessageClass?

Najprawdopodobniej próbujesz rzucić instancję klasy MailItem w klasę ReportItem. Czy tak jest?

Również sugeruję użycie dowolnej przeglądarki właściwości o niskim poziomie, takiej jak MFCMAPI lub OutlookSpy do obserwowania właściwości w środowisku wykonawczym. Czy widzisz tam "chiński" charactere?

+0

Przykład I podane powyżej są nieco uproszczone, ale jestem za pomocą refleksji, aby sprawdzić typ elementu w odpowiednim kodzie. W tym przypadku kod został skonfigurowany do działania w skrzynce odbiorczej zawierającej tylko 1 element raportu. Przepraszam, jeśli to spowodowało jakiekolwiek zamieszanie. Zastanawiam się nad przejściem do usługi Exchange Web Service. Trzymaliśmy się od tego z daleka, ponieważ nie należymy do IT i obawiają się o nas, że wbijamy się w ich systemy. – MattB

+0

Ponadto, dla jasności, chiński jest tak naprawdę tylko błędem parsowania. Pobierz strumień Unicode i przeanalizuj go jako UTF-8, a zobaczysz, co mam na myśli. Chwyć dowolny dowolny dokument w języku HTML z angielskim i pobierz bajty w formacie Unicode i przeanalizuj jako UTF-8. Zobaczysz coś, co wygląda "chińsko". Właśnie to widzimy zarówno w naszej aplikacji, jak i podczas oglądania elementu raportu po uruchomieniu kodu. – MattB

7

Po prostu zdarzyło się to w mojej funkcji VBA w Outlooku, która przetwarza odbicia od e-maili dla zamówień i zaznacza te zamówienia jako wymagające uwagi. Oryginalny adres e-mail w programie Outlook wygląda dobrze, ale gdy próbuję go przetworzyć, znaki zmieniają się na chiński i raport. Po prostu wyświetla znaki zapytania.

Znalazłem, używając StrConv do konwersji na Unicode, mogłem uzyskać prawidłową zawartość ciała do przetwarzania.

Dim strBody as String 
strBody = StrConv(Report.Body, vbUnicode) 
+2

To jest również to, co odkryłem, że z jakiegoś powodu unicode wyświetla się jako UTF8. Mój problem pozostaje jednak. Możemy uzyskać dostęp do wiadomości programowo, ale nadal musimy mieć możliwość wyświetlania wiadomości w skrzynce odbiorczej w czytelny dla człowieka sposób, więc to, co robię, jest czymś, co nie spowoduje rozpoczęcia problemu. – MattB

+0

Oto ekwiwalent C#, którego użyłem: System.Text.Encoding.UTF8.GetString (new UnicodeEncoding(). GetBytes (report.Body)) –

+0

StrConv (vbUnicode) nie istnieje w .NET. Oto odpowiednik, którego użyłem: 'Funkcja UnsquishString (ByVal zgnieciony jako ciąg) jako ciąg Dim len Jako Double = str. Długość * 2.0 Dim b (len - 1) Jako bajt System.Buffer.BlockCopy (str.ToCharArray (), 0, b, 0, b.Length) Powrót System.Text.Encoding.GetEncoding (1252) .GetString (b) End Function' – Brain2000