Автоматичне очищення програми Outlook розривається на рядку та накручується формат електронної пошти


119

Я надсилаю електронний лист за допомогою dotnet Framework. Ось шаблон, який я використовую для створення повідомлення:

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%

Коли повідомлення надходить у перспективу, програма Outlook повідомляє мені "Додаткові розриви рядків у цьому повідомленні були видалені". І повідомлення відображається так:

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

Зверніть увагу, як Outlook неправильно видаляє необхідні розриви рядків після імені, EECoverageAmount тощо ...

Для одержувачів електронної пошти важливо отримати правильно відформатований електронний лист, і я повинен припустити, що деякі з них використовують прогноз 2003 року. Я також не можу припустити, що вони будуть знати достатньо, щоб вимкнути функцію автоматичного очищення, щоб повідомлення було форматоване належним чином.

Я переглядав ці повідомлення в інших поштових клієнтах, і вони відображаються правильно

ще трохи інформації:

  • Я використовую UTF-8 BodyEncoding (msg.BodyEncoding = System.Text.Encoding.UTF8)
  • Msg.Body читається з закодованого текстового файлу UTF-8, і кожен рядок закінчується символом crlf.

Питання: Як змінити формат повідомлення, щоб уникнути цієї проблеми?


12
Хоча обидві висококваліфіковані відповіді нижче правильні, див. Цю відповідь для переліку всіх правил.
Бобсон


5
Чому ця «особливість» навіть існує?
chiliNUT

1
Спробуйте нові рядки Windows: \r\n. Це працювало для мене.
kevinarpe

Відповіді:


97

Почніть кожен рядок з 2 пробілів, і зовнішній вигляд буде "накручений" на збереження форматування.

Тож зміни

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%

до

  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

Ось стаття, яку я знайшов, досліджуючи цю проблему, яка заглиблюється трохи більше, ніж моя відповідь.


6
Ось зручний Regex для того, щоб розібратися в цьому:Regex.Replace(messageBody, @"^(?!\s\s)", " ", RegexOptions.Multiline);
Вілфред Кнівель

2
Гаразд, у цьому регулярному виразі є два пробіли, але цей HTML-код відображає лише один!
Вільфред Кнівель

Для електронних листів, що генеруються кодом, це найкраще рішення.
Сальвадор Валенсія,

129

Ви також можете вставити символ вкладки в кінці рядка (безпосередньо перед CR LF). Цей додатковий пробіл буде в кінці рядка і, отже, не буде видно користувачеві. Ви можете скористатися цим, щоб вставити пробіли зліва. Зауважте, що одного простору недостатньо (хоча, можливо, кілька пробілів допоможуть, я не знаю.)


14
Regex.Replace(messageBody, @"(?<!\t)((?<!\r)(?=\n)|(?=\r\n))", "\t", RegexOptions.Multiline)
Вільфред Кнівель

Ідеальне рішення для електронних листів, що надсилаються з Trac користувачам Outlook.
sfarbota

1
+1 Я повинен був використовувати 3 пробіли замість вкладки, але в основному це виправлення працювало для мене: Regex.Replace (messageBody, @ "(? <! \ T) ((? <! \ R) (? = \ N) | (? = \ r \ n)) "," ", RegexOptions.Multiline)
Ryan VandenHeuvel

підтверджено! Тут регулярно виражається як фрагмент php: $ re = '/ (? <! \ T) ((? <! \ R) (? = \ N) | (? = \ R \ n)) / m'; $ subst = ""; $ MailText = preg_replace ($ re, $ subst, $ MailText);
C4pt4inC4nn4bis

Працює для Outlook, але розбиває текстові повідомлення на поштовому клієнті samsungs fpr смартфони :(
C4pt4inC4nn4bis

26

Ця відповідь стосується того, як "відключити" функцію від клієнта Outlook.

  • Перейдіть до Інструменти -> "Параметри ..."
  • На вкладці "Налаштування" натисніть "Параметри електронної пошти ..."
  • Зніміть прапорець "Видалити зайві розриви рядків у звичайних текстових повідомленнях".
  • Натисніть ОК

FYI: Я використовую Outlook 2007


3
Мені також ця функція не подобається. Крім усього іншого, це призводить до порушення коду в електронних листах і відмови перевірок підписів PGP.
Брайан Рейтер

7
А в Outlook 2010 це: Файл> Параметри> Пошта> Прокрутіть униз до розділу "Формат повідомлення"> Скасуйте прапорець "Видалити зайві розриви рядків у звичайних текстових повідомленнях".
Пітер Форд

2
Це рішення на стороні клієнта. Набагато краще було б надійним методом запобігти Outlook робити це на стороні сервера, тобто форматувати пошту таким чином, щоб не заважати іншим клієнтам (адже ви не знаєте, який поштовий клієнт буде використовувати одержувач).
Тобіас

7
Дякую - і тепер будь ласка, направляйте наші приймачі розсилок на 100 000+, щоб це зробити
Muleskinner

4

Мені завжди пощастило відформатувати електронні листи як HTML. У вас все ще може виникнути проблема з кінцевим користувачем про необхідність встановити клієнту дозвіл на HTML-формат, але вони, як правило, більше знайомі з цим, оскільки так багато електронних листів надходить у форматі html. Ви також маєте трохи більше роботи над своїм кінцем, додаючи HTML-теги, але кінцевий результат набагато більш керований.

@ephemient також пропонує: надсилати як HTML, так і відкритий текст. Хороші клієнти покажуть останнє, Outlook покаже перше, всі радіють (крім програміста, якому належить зробити більше роботи).


2
Надіслати як HTML, так і простий текст. Хороші клієнти покажуть останнє, Outlook покаже перше, всі радіють (крім програміста, якому належить зробити більше роботи).
ефемія

BTW, s / http / html / g у вашій відповіді.
ефемія

4

Додавання "\ t \ r \ n" (\ t для TAB) замість "\ r \ n" працювало для мене в Outlook 2010.


Я "вирішив" це, використовуючи "\r\n "(два пробіли, без вкладки) після нового рядка як подібний хак. Працює в Outlook 2016. YMMV.
користувач2864740

1

Розширення відповіді Дуга Л , оскільки я думаю, що обмін HTML-повідомленнями є ще більш поширеним і прийнятим зараз, ніж у 2008 році, коли ця відповідь була розміщена. Ось невеликий фрагмент c #, який допоможе перетворити тіло та надіслати повідомлення у форматі 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

Я бачу таку ж проблему, коли створюю електронний електронний лист і читаю його за допомогою Outlook 2003 SP3. Здається, ви можете уникнути процесу видалення, дотримуючись довжину рядка менше 40 символів. Не завжди може бути практичним.


0

Помістіть текст у <pre>тегах, а формат очікує форматування та відображення тексту правильно.

Я визначив це в CSS, вбудованому в HTML Body, як:

CSS:

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

Я визначив сімейство шрифтів для встановлення шрифту.

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
Я вважаю, що оригінальне запитання стосується електронних листів прямого тексту, а не HTML. Ви намагаєтесь змішати HTML як рішення.
Кріс Петерс

0

Автоматичне прибирання - це функція світогляду, яка усуває зайві розриви ліній. Запобігти це можна двома способами.

  • Перший спосіб - додати принаймні 2 додаткові пробіли перед рядками під час надсилання електронної пошти через код. Ви можете додавати ці додаткові пробіли лише до тих рядків, які Outlook автоматично видаляє.

  • Другий спосіб - змінити налаштування прогнозу, що не дозволить видалити додаткові розриви рядків.

введіть тут опис зображення

введіть тут опис зображення


-1

Мій текст містить "\ r \ n", але Outlook 2010 не відображає розрив рядка. Створіть жетони рядків, розділених на '\ r \ n', та конвертні маркери за допомогою тегів абзацу HTML. Формат моєї електронної пошти - HTML. Я створюю HTML Body для своєї електронної пошти в наведеному нижче коді.

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

Змініть закінчення лінії з crlf на cr або lf.

Я підозрюю, що у верхній частині електронної пошти використовується лише cr (або lf), а Outlook очікує, що решта електронної пошти буде дотримуватися того самого формату.


Я спробував змінити лінійний термінатор на CR. Це не спрацювало. Потім я спробував змінити його на НЧ. Це теж не спрацювало.
Ахехо

1
Сумнівні. У Outlook є дуже сумнівна функція, яка намагається перетворити пошту із розривом жорстких рядків у текстовий текст. Не дивно, що часто трапляється це неправильно, як у цьому випадку.
Даніель Кассіді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.