Outlook automatycznie czyści podziały wierszy i psuje format e-maili


119

Wysyłam wiadomość e-mail za pomocą platformy dotnet. Oto szablon, którego używam do tworzenia wiadomości:

Date of Hire: %HireDate%
Annual Salary: %AnnualIncome%
Reason for Request: %ReasonForRequest%

Name of Voluntary Employee: %FirstName% %LastName%
Total Coverage Applied For:  %EECoverageAmount%
Guaranteed Coverage Portion: %GICoveragePortion%
Amount Subject to Medical Evident: %GIOverage%

Gdy wiadomość zostanie odebrana w programie Outlook, program Outlook wyświetli komunikat „Usunięto dodatkowe podziały wierszy z tej wiadomości”. A komunikat wyświetla się w ten sposób:

Date of Hire: 9/28/2001
Annual Salary: $100,000
Reason for Request: New Hire

Name of Voluntary Employee: Ronald Weasley Total Coverage Applied For:  $500,000 Guaranteed Coverage Portion: $300,000.00 Amount Subject to Medical Evident: $200,000

Zwróć uwagę, że program Outlook nieprawidłowo usuwa potrzebne podziały wierszy po nazwie, kwocie pokrycia EWG itp.

Ważne jest, aby odbiorcy wiadomości e-mail otrzymali prawidłowo sformatowaną wiadomość e-mail i muszę założyć, że niektórzy z nich używają programu Outlook 2003. Nie mogę również zakładać, że będą wiedzieć wystarczająco dużo, aby wyłączyć funkcję automatycznego czyszczenia, aby wiadomość została poprawnie sformatowana.

Widziałem te wiadomości w innych klientach poczty i wyświetlają się poprawnie

trochę więcej informacji:

  • Używam UTF-8 BodyEncoding (msg.BodyEncoding = System.Text.Encoding.UTF8)
  • Treść msg.Body jest odczytywana z pliku tekstowego zakodowanego w UTF-8, a każda linia jest zakończona crlf.

Pytanie: Jak zmienić format wiadomości, aby uniknąć tego problemu?


12
Chociaż obie bardzo pozytywne odpowiedzi poniżej są prawidłowe, zobacz tę odpowiedź, aby zapoznać się z listą wszystkich zasad.
— Bobson,


5
Dlaczego ta „funkcja” w ogóle istnieje?
— chiliNUT

1
Wypróbuj nowe linie Windows: \r\n. U mnie to zadziałało.
— kevinarpe

Odpowiedzi:


97

Rozpocznij każdy wiersz od 2 spacji, a program Outlook zostanie „oszukany” w celu zachowania formatowania.

Więc zmień

Date of Hire: %HireDate%
Annual Salary: %AnnualIncome%
Reason for Request: %ReasonForRequest%

Name of Voluntary Employee: %FirstName% %LastName%
Total Coverage Applied For:  %EECoverageAmount%
Guaranteed Coverage Portion: %GICoveragePortion%
Amount Subject to Medical Evident: %GIOverage%

do

  Date of Hire: %HireDate%
  Annual Salary: %AnnualIncome%
  Reason for Request: %ReasonForRequest%

  Name of Voluntary Employee: %FirstName% %LastName%
  Total Coverage Applied For:  %EECoverageAmount%
  Guaranteed Coverage Portion: %GICoveragePortion%
  Amount Subject to Medical Evident: %GIOverage%
^^ <--- Two extra spaces at the start of every line

Oto artykuł, który znalazłem podczas badania tego problemu, który jest nieco głębszy niż moja odpowiedź.


6
Oto przydatny Regex, aby to rozwiązać:Regex.Replace(messageBody, @"^(?!\s\s)", " ", RegexOptions.Multiline);
— Wilfred Knievel

2
Ok, w tym wyrażeniu regularnym są dwie spacje, ale ten html wyświetla tylko jedną!
— Wilfred Knievel,

W przypadku wiadomości e-mail zawierających zwykły tekst generowanych kodem jest to najlepsze rozwiązanie.
— Salvador Valencia

129

Możesz również wstawić znak tabulacji na końcu linii (tuż przed CR LF). Ta dodatkowa biała przestrzeń będzie znajdować się na końcu linii i dlatego nie będzie widoczna dla użytkownika. Może wolisz wstawiać spacje po lewej stronie. Zwróć uwagę, że pojedyncza spacja nie wystarczy (chociaż może pomogłoby wiele spacji, nie wiem).


14
Regex.Replace(messageBody, @"(?<!\t)((?<!\r)(?=\n)|(?=\r\n))", "\t", RegexOptions.Multiline)
— Wilfred Knievel,

Idealne rozwiązanie dla e-maili wysyłanych z Traca do użytkowników Outlooka.
— sfarbota

1
+1 Musiałem użyć 3 spacji zamiast tabulatora, ale w zasadzie ta poprawka zadziałała dla mnie: Regex.Replace (messageBody, @ "(? <! \ T) ((? <! \ R) (? = \ N) | (? = \ r \ n)) "," ", RegexOptions.Multiline)
— Ryan VandenHeuvel

Potwierdzony! Tutaj wyrażenie regularne jako fragment php: $ re = '/ (? <! \ T) ((? <! \ R) (? = \ N) | (? = \ R \ n)) / m'; $ subst = ""; $ MailText = preg_replace ($ re, $ subst, $ MailText);
— C4pt4inC4nn4bis

Działa w programie Outlook, ale przerywa wysyłanie wiadomości tekstowych na smartfonach fpr klienta poczty
— Samsung

26

W tej odpowiedzi opisano, jak „wyłączyć” tę funkcję w programie Outlook Client.

  • Przejdź do Narzędzia -> „Opcje ...”
  • Na karcie „Preferencje” kliknij „Opcje e-maili ...”
  • Odznacz pole „Usuń dodatkowe podziały wierszy w zwykłych wiadomościach tekstowych”.
  • Kliknij OK

Do Twojej wiadomości: Używam programu Outlook 2007


3
Ta funkcja też mi się nie podoba. Między innymi powoduje uszkodzenie kodu w wiadomościach e-mail i niepowodzenie sprawdzania podpisów PGP.
— Brian Reiter

7
W Outlooku 2010 jest to: Plik> Opcje> Poczta> Przewiń w dół do sekcji „Format wiadomości”> Odznacz pole „Usuń dodatkowe podziały wierszy w zwykłych wiadomościach tekstowych”.
— Peter Ford,

2
To jest rozwiązanie po stronie klienta. Znacznie lepsza byłaby niezawodna metoda, aby Outlook nie robił tego po stronie serwera, tj. Formatując pocztę w sposób, który nie przeszkadza innym klientom (ponieważ nie wiesz, którego klienta pocztowego będzie używał odbiorca).
— Tobias

7
Dzięki - a teraz poprowadź naszych
— ponad 100 000

4

Zawsze miałem większe szczęście podczas formatowania e-maili jako html. Nadal możesz mieć problem z użytkownikami końcowymi, którzy muszą ustawić klienta na zezwalanie na format html, ale zazwyczaj są oni bardziej zaznajomieni z tym, ponieważ tak wiele wiadomości e-mail jest w formacie HTML. Masz też trochę więcej pracy nad dodaniem tagów HTML, ale efekt końcowy jest znacznie bardziej kontrolowany.

@ephemient sugeruje również: Wyślij zarówno jako HTML, jak i zwykły tekst. Dobrzy klienci pokażą to drugie, Outlook pokaże pierwszego, wszyscy są zadowoleni (z wyjątkiem programisty, który musi wykonać więcej pracy).


2
Wyślij jako HTML i zwykły tekst. Dobrzy klienci pokażą to drugie, Outlook pokaże pierwszego, wszyscy są zadowoleni (z wyjątkiem programisty, który musi wykonać więcej pracy).
— ephemient

BTW, s / http / html / g w twojej odpowiedzi.
— ephemient

4

Dodanie „\ t \ r \ n” (\ t dla TAB) zamiast „\ r \ n” działało dla mnie w Outlooku 2010.


„Rozwiązałem” to używając "\r\n "(dwóch spacji, bez tabulatora) po nowej linii jako podobnego hacka. Działa w programie Outlook 2016. YMMV.
— user2864740

1

Rozszerzając odpowiedź Douga L. , ponieważ myślę, że wiadomości HTML są jeszcze bardziej wszechobecne i akceptowane teraz niż w 2008 r., Kiedy opublikowano tę odpowiedź. Oto mały fragment kodu języka C # ułatwiający konwersję treści i wysyłanie wiadomości w formacie HTML:

body = string.Format("<font face='calibri,arial,sans-serif'>{0}<font/>", body.Replace("\r\n", "<br>"));

using (var smtpClient = new SmtpClient() { Host = smtpHost })
using (var msg = new MailMessage(from, emailDistribution, subject, body) { IsBodyHtml = true })
     smtpClient.Send(msg);

0

Widzę ten sam problem podczas generowania wiadomości e-mail w postaci zwykłego tekstu, a następnie czytania jej w programie Outlook 2003 z dodatkiem SP3. Wygląda na to, że możesz uniknąć procesu usuwania, utrzymując długość linii poniżej 40 znaków. Nie zawsze może być praktyczne.


0

Umieść tekst w <pre>tagach, a program Outlook sformatuje i wyświetli tekst poprawnie.

zdefiniowałem to w CSS inline w HTML Body, na przykład:

CSS:

pre {
 font-family: Verdana, Geneva, sans-serif;
}

Zdefiniowałem rodzinę czcionek, aby ustawić czcionkę.

HTML:

<td width="70%"><pre>Entry Date/Time:       2013-09-19 17:06:25
Entered By:     Chris

worklog mania

____________________________________________________________________________________________________

Entry Date/Time:        2013-09-19 17:05:42
Entered By:     Chris

this is a new Worklog Entry</pre></td>

1
Uważam, że pierwotne pytanie dotyczy wiadomości e-mail w postaci zwykłego tekstu, a nie HTML. Próbujesz użyć HTML jako rozwiązania.
— Chris Peters

0

Automatyczne czyszczenie to funkcja programu Outlook, która usuwa dodatkowe przerwy w wierszach. Możesz temu zapobiec na dwa sposoby.

  • Pierwszym sposobem jest dodanie co najmniej 2 dodatkowych spacji przed wierszami podczas wysyłania wiadomości e-mail za pomocą kodu. Możesz dodać te dodatkowe spacje tylko przed tymi wierszami, które program Outlook automatycznie usuwa.

  • Drugim sposobem jest zmiana ustawienia perspektywy, która uniemożliwi programowi Outlook usuwanie dodatkowych podziałów wierszy.

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj


-1

Mój tekst zawiera „\ r \ n”, ale Outlook 2010 nie renderuje podziału wiersza. Utwórz tokeny wierszy rozdzielonych znakiem „\ r \ n” i znaczniki kopert za pomocą znaczników akapitu HTML. Format mojego e-maila to HTML. Generuję treść HTML dla mojego e-maila w poniższym kodzie.

string[] tokens = Regex.Split(objTickt.Description, "\r\n");
  if (tokens.Length > 0)
  {
     foreach (string line in tokens)
     {
         //htmlTW.WriteEncodedText(objTickt.Description.Replace("\r\n", "\n\n"));
         htmlTW.RenderBeginTag(HtmlTextWriterTag.P);
         htmlTW.WriteEncodedText(line);
         htmlTW.RenderEndTag();
     }
  }

-6

Zmień zakończenie linii z crlf na cr lub lf.

Podejrzewam, że w górnej części wiadomości e-mail znajduje się tylko cr (lub lf), a Outlook oczekuje, że reszta wiadomości będzie miała ten sam format.


Próbowałem zmienić terminator linii na CR. To nie zadziałało. Potem spróbowałem zmienić go na LF. To też nie zadziałało.
— Aheho

1
Wątpliwy. Outlook ma bardzo wątpliwą funkcję, która próbuje konwertować pocztę z twardymi podziałami linii na tekst ciągły. Nic dziwnego, że często robi to źle, jak w tym przypadku.
— Daniel Cassidy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.