Outlook limpando automaticamente minhas quebras de linha e bagunçando meu formato de e-mail

119

Estou enviando um e-mail usando o framework dotnet. Aqui está o modelo que estou usando para criar a mensagem:

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%

Quando as mensagens são recebidas no Outlook, o Outlook me diz "quebras de linha extras nesta mensagem foram removidas". E a mensagem é exibida assim:

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

Observe como o Outlook remove incorretamente as quebras de linha necessárias após o nome, EECoverageAmount, etc ...

É importante que os destinatários do e-mail obtenham um e-mail formatado corretamente e devo presumir que alguns deles usam o outlook 2003. Também não posso supor que eles saibam o suficiente para desligar o recurso autoclean e fazer com que a mensagem seja formatada corretamente.

Eu vi essas mensagens em outros clientes de e-mail e elas são exibidas corretamente

mais algumas informações:

  • Estou usando UTF-8 BodyEncoding (msg.BodyEncoding = System.Text.Encoding.UTF8)
  • O msg.Body está sendo lido de um arquivo de texto codificado em UTF-8 e cada linha é encerrada com um crlf.

Pergunta: Como mudo o formato da mensagem para evitar este problema?

Aheho
fonte
12
Embora as duas respostas altamente votadas abaixo estejam certas, veja esta resposta para uma lista de todas as regras.
Bobson
5
Por que esse "recurso" ainda existe?
chiliNUT
1
Tente novas linhas do Windows: \r\n. Funcionou para mim
kevinarpe

Respostas:

97

Comece cada linha com 2 espaços e o Outlook será "enganado" para manter sua formatação.

Então mude

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%

para

  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

Aqui está o artigo que encontrei ao pesquisar esse problema, que é um pouco mais aprofundado do que minha resposta.

Alex B
fonte
6
Aqui está um Regex útil para resolver isso:Regex.Replace(messageBody, @"^(?!\s\s)", " ", RegexOptions.Multiline);
Wilfred Knievel,
2
Ok, nessa regex existem dois espaços, mas sendo html está exibindo apenas um!
Wilfred Knievel,
Para e-mails de texto simples gerados por código, esta é a melhor solução.
Salvador Valencia
129

Você também pode inserir um caractere de tabulação no final da linha (logo antes do CR LF). Este espaço em branco extra estará no final da linha e, portanto, não visível para o usuário. Você pode preferir isso a inserir espaços à esquerda. Observe que um único espaço não é suficiente (embora talvez vários espaços ajudem, não sei.)

Jim Davis
fonte
14
Regex.Replace(messageBody, @"(?<!\t)((?<!\r)(?=\n)|(?=\r\n))", "\t", RegexOptions.Multiline)
Wilfred Knievel,
Solução perfeita para emails enviados do Trac para usuários do Outlook.
sfarbota
1
+1 Tive que usar 3 espaços em vez de uma guia, mas basicamente essa correção funcionou para mim: Regex.Replace (messageBody, @ "(? <! \ T) ((? <! \ R) (? = \ N) | (? = \ r \ n)) "," ", RegexOptions.Multiline)
Ryan VandenHeuvel
confirmado! Aqui regex como fragmento de php: $ re = '/ (? <! \ T) ((? <! \ R) (? = \ N) | (? = \ R \ n)) / m'; $ subst = ""; $ MailText = preg_replace ($ re, $ subst, $ MailText);
C4pt4inC4nn4bis
Funciona para Outlook, mas quebra e-mails de texto em smartphones fpr de cliente de e-mail samsungs :(
C4pt4inC4nn4bis
26

Esta resposta é sobre como "desabilitar" o recurso do Outlook Client.

  • Vá para Ferramentas -> "Opções ..."
  • Na guia "Preferências", clique em "Opções de e-mail ..."
  • Desmarque a caixa "Remover quebras de linha extras em mensagens de texto simples".
  • Clique em OK

Para sua informação: Estou usando o Outlook 2007

DHornpout
fonte
3
Eu também não gosto desse recurso. Entre outras coisas, faz com que o código nos e-mails seja quebrado e as verificações de assinatura PGP falhem.
Brian Reiter
7
E no Outlook 2010 é: Arquivo> Opções> Correio> Role para baixo até a seção "Formato de mensagem"> Desmarque a caixa "Remover quebras de linha extras em mensagens de texto simples".
Peter Ford
2
Esta é uma solução do lado do cliente. Muito melhor seria um método confiável para evitar que o Outlook faça isso no lado do servidor, ou seja, formatar o e-mail de uma forma que não perturbe outros clientes (porque você não sabe qual cliente de e-mail o destinatário usará).
Tobias
7
Obrigado - e agora, por favor, oriente nossos mais de 100.000 destinatários de boletins informativos para fazer isso
Muleskinner
4

Sempre tive mais sorte formatando e-mails como html. Você ainda pode ter o problema do usuário final de ter que configurar o cliente para permitir o formato html, mas eles geralmente estão mais familiarizados com isso, já que muitos e-mails vêm formatados em html. Você também tem um pouco mais de trabalho adicionando as tags html, mas o resultado final é muito mais controlável.

@ephemient também sugere: Envie como HTML e texto simples. Bons clientes mostrarão o último, o Outlook mostrará o primeiro, todos estão felizes (exceto o programador que tem que fazer mais trabalho).

Doug L.
fonte
2
Envie como HTML e texto simples. Bons clientes mostrarão o último, o Outlook mostrará o primeiro, todos estão felizes (exceto o programador que tem que fazer mais trabalho).
efemiente
BTW, s / http / html / g em sua resposta.
efemiente
4

Adicionar "\ t \ r \ n" (\ t para TAB) em vez de "\ r \ n" funcionou para mim no Outlook 2010.

Super Nova
fonte
Eu "resolvi" isso usando "\r\n "(dois espaços, sem tabulação) após a nova linha como um hack semelhante. Funciona no Outlook 2016. YMMV.
user2864740
1

Expandindo a resposta Doug L , já que acho que as mensagens HTML são ainda mais onipresentes e aceitas agora do que em 2008, quando essa resposta foi postada. Aqui está um pequeno snippet c # para ajudar a converter o corpo e enviar a mensagem no formato 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
fonte
0

Estou tendo o mesmo problema ao gerar um e-mail de texto sem formatação e, em seguida, lê-lo com o Outlook 2003 SP3. Parece que você pode evitar o processo de remoção mantendo o comprimento da linha abaixo de 40 caracteres. Nem sempre pode ser prático.


fonte
0

Coloque o texto em <pre> Tags e o Outlook irá formatar e exibir o texto corretamente.

Eu o defini em CSS inline no HTML Body como:

CSS:

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

Eu defini a família de fontes para ter um conjunto de fontes.

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
fonte
1
Acredito que a pergunta original se refere a e-mails em texto simples, não HTML. Você está tentando misturar HTML como solução.
Chris Peters
0

A limpeza automática é um recurso do Outlook que remove quebras de linha extras. Você pode evitá-lo de duas maneiras.

  • A primeira maneira é adicionar pelo menos 2 espaços extras antes das linhas ao enviar o e-mail por meio do código. Você pode adicionar esses espaços extras apenas antes das linhas que o Outlook remove automaticamente.

  • A segunda maneira é alterar a configuração do outlook, o que impedirá o outlook de remover quebras de linha extras.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Brijesh Kumar Tripathi
fonte
-1

Meu texto inclui '\ r \ n', mas o Outlook 2010 não processa a quebra de linha. Crie tokens de linhas delimitadas por '\ r \ n' e tokens de envelope por tags de parágrafo HTML. O formato do meu email é HTML. Estou gerando corpo em HTML para meu e-mail no código abaixo.

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
fonte
-6

Altere a terminação da linha de crlf para cr ou lf.

Suspeito que a parte superior do e-mail usa apenas cr (ou lf), e o Outlook espera que o restante do e-mail siga o mesmo formato.

seanyboy
fonte
Tentei mudar o terminador de linha para um CR. Isso não funcionou. Então tentei mudar para um LF. Isso também não funcionou.
Aheho
1
Duvidoso. O Outlook tem um recurso altamente duvidoso que tenta converter e-mails com quebras de linha rígidas em texto corrido. Não é novidade que isso frequentemente ocorre de maneira errada, como neste caso.
Daniel Cassidy