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?

Aheho
źródło
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ź.

Alex B.
źródło
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).

Jim Davis
źródło
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

Doryb
źródło
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).

Doug L.
źródło
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.

supernowa
źródło
„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);
Ho Ho Ho
źródło
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.


źródło
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>
Christian Casutt
źródło
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

Brijesh Kumar Tripathi
źródło
-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();
     }
  }
Keyur Patel
źródło
-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.

seanyboy
źródło
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