Skip to content

Commit 37761ac

Browse files
Update parser to avoid encode body part two times and broke any 8bit chars.
1 parent 6c22b83 commit 37761ac

4 files changed

Lines changed: 189 additions & 2 deletions

File tree

Class Library/ActiveUp.Net.Common/Parser.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ namespace ActiveUp.Net.Mail
3434
#endif
3535
public static class Parser
3636
{
37-
private static Encoding defaultEncoding = Encoding.GetEncoding("iso-8859-1");
37+
private static Encoding defaultEncoding = Encoding.UTF8;
3838

3939
#region Methods
4040

@@ -179,7 +179,7 @@ private static void ParseSubParts(ref MimePart part, Message message)
179179
GC.WaitForPendingFinalizers();
180180

181181
parentPartBinary = tmp;
182-
parentPartUtf8Body = ToUtf8(parentPartBinary);
182+
parentPartUtf8Body = defaultEncoding.GetString(parentPartBinary);
183183
tmp = null;
184184

185185
if (!strpart.StartsWith("--") && !string.IsNullOrEmpty(strpart))

Class Library/ActiveUp.Net.Tests/ActiveUp.Net.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@
112112
<None Include="resource\content-transfer-encode-8bit.eml">
113113
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
114114
</None>
115+
<None Include="resource\content-transfer-encode-8bit-html-special-char.eml">
116+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
117+
</None>
115118
<None Include="resource\only_header_2.eml">
116119
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
117120
</None>

Class Library/ActiveUp.Net.Tests/Common/ParserTests.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,5 +270,20 @@ public void MustParseEmlContainingOnlyHeaders2()
270270
Assert.AreEqual(0, message.Attachments.Count);
271271
Assert.AreEqual(0, message.LeafMimeParts.Count);
272272
}
273+
274+
[Test(Description = "")]
275+
public void MustParse8BitEmlWithSpecialCharInHtmlBody()
276+
{
277+
var message = Parser.ParseMessageFromFile(_baseDir + "\\resource\\content-transfer-encode-8bit-html-special-char.eml");
278+
Assert.AreEqual("[email protected]", message.From.Email);
279+
Assert.AreEqual("[email protected]", message.MessageId);
280+
Assert.AreEqual("CLIENT - BRASIL Status: OPEN / RESOLVED #0917-000622", message.Subject);
281+
Assert.IsFalse(string.IsNullOrWhiteSpace(message.BodyText.Text));
282+
Assert.AreEqual("Para visualizar a mensagem, por favor, use um cliente de e-mail compatÃ\u0083­vel/configurado para ver mensagens HTML!\r\n\r\n", message.BodyText.Text);
283+
Assert.IsFalse(string.IsNullOrWhiteSpace(message.BodyHtml.Text));
284+
Assert.AreEqual("\r\n <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"> \r\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"pt\" lang=\"pt\"> \r\n <head> \r\n <title></title>\r\n <meta name=\"author\" content=\"suporte\" />\r\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset =iso-8859-1\" /> \r\n <style>\r\n .txt_padrao {font-family:Arial;font-size:12px}\r\n #bold {font-weight:bold;}\r\n </style>\r\n </head> \r\n <body leftmargin=\"5\" topmargin=\"5\" marginheight=\"0\" smarginwidth=\"0\">\r\n<br />\r\n Qualquer dúvida estou a disposição.<br />\r\n<br />\r\n Atenciosamente,<br />\r\n<br />\r\n<br />\r\n <br />\r\n <br />\r\n <br />\r\n <br />\r\n <br />\r\n <br />\r\n <br />\r\n<br />\r\n <br />\r\n <br />\r\n Ronald Santander<br />\r\n _________________________<br />\r\n<br />\r\n CLIENT<br />\r\n Consultor de Viagens <br />\r\n Tel.: + (55 11) 2222-4444 <br />\r\n Tel.: + (55 11) 3333-6666<br />\r\n <br />\r\n <br />\r\n<br />\r\n Outros telefones <br />\r\n<br />\r\n <br />\r\n <br />\r\n <br />\r\n <br />\r\n<br />\r\n ATENÃ\u0087Ã\u0083O! <br />\r\n<br />\r\n<br />\r\n<br />\r\n Prezado cliente, Seguindo a nova resolução do Regulador XXXXX, homologada em Abril/2016, e que impõe a emissão de certificado de seguro viagem individuais, tanto para viagem doméstica quanto internacional, as bandeiras American Express, Mastercard e Visa estão migrando o processo de emissão do certificado do seguro viagem, benefício incluso em suas soluções corporativas de pagamentos se utilizado pela sua empresa.<br />\r\n<br />\r\n<br />\r\n Todos os novos procedimentos de emissão do certificado do seguro viagem foram comunicados e disponibilizados aos gestores de viagens da sua empresa. Caso não tenha conhecimento do novo procedimento, se faz necessário verificar com o gestor responsável de sua empresa, pois a emissão do certificado é de total responsabilidade do viajante e requer acesso a ferramenta de emissão a cada viagem, por meio de login, senha e dados pessoais.<br />\r\n<br />\r\n<br />\r\n<br />\r\n INFORMAÃ\u0087Ã\u0095ES IMPORTANTES <br />\r\n<br />\r\n<br />\r\n <br />\r\n A garantia da reserva, do assento e da tarifa são a emissão do bilhete; <br />\r\n Tarifas sujeitas a alteração sem prévio aviso. <br />\r\n Atenção ao prazo de emissão das reservas; <br />\r\n Para alterações, cancelamentos ou reembolsos há incidência de multas e/ou diferenças tarifárias conforme regra do bilhete; <br />\r\n Multa por Churning: Segundo a política de reservas, poderá haver cobrança de multa em caso de solicitação/realização de sucessivas operações para o mesmo passageiro/ cia aérea/trecho. Esta cobrança, multa por Churning - Excessive or constant book/cancel activity , ocorre quando a cia aérea detecta o mesmo trecho aéreo ou parte dele solicitado a partir da segunda vez em datas idênticas ou próximas (até 5 dias antes ou depois para ida e/ou volta). As multas recebidas serão repassadas à empresa. <br />\r\n <br />\r\n<br />\r\n VIAGENS INTERNACIONAIS PARA BRASILEIROS <br />\r\n<br />\r\n<br />\r\n <br />\r\n Chegar no aeroporto com 3 horas de antecedência para o embarque; <br />\r\n Apresentar passaporte com validade mínima de 6 meses; <br />\r\n Para países que necessitam de visto, o mesmo deve estar válido no momento do embarque; <br />\r\n Para países que exigem vacina contra febre amarela, apresentar comprovante internacional com período de incubação de 10 dias; <br />\r\n Para maiores informações sobre vacinas necessárias ou indicadas para seu destino visite o site: http://www.anvisa.gov.br/viajante/ ; <br />\r\n Para viagens internacionais é necessário informar o Nome completo do passageiro (idêntico ao Passaporte), Data de nascimento, Número do passaporte, País de emissão do passaporte, Validade, Nacionalidade, País de residência, País de destino, Endereço no destino, Cidade, Estado, Cep. Endereço residencial, Cidade, Estado e Cep. Para inclusão das informações de segurança na reserva antes da emissão do bilhete; <br />\r\n <br />\r\n<br />\r\n VIAGENS NACIONAIS <br />\r\n<br />\r\n<br />\r\n <br />\r\n Chegar no aeroporto com 2 horas de antecedência para o embarque; <br />\r\n Apresentação obrigatória de um documento de identificação original com foto e atual para embarque; <br />\r\n Favor sempre informar o número de identidade, cartão de milhas e preferência de assento do passageiro no momento da reserva;</td>\r\n </tr>\r\n <tr><td colspan=\"2\" ><hr></td></tr><tr><td height=\"35\" align=\"left\" colspan=\"2\" ><table><tr><td><img src=\"./ico_visto.gif\" width=\"25\" height=\"25\" border=\"0\" alt=\"\"></td><td class=\"txt_padrao\" id=\"bold\" >Dados da Ação</td></tr></table></td></tr>\r\n <tr>\r\n <td class=\"txt_padrao\" align=\"right\" width=\"150\" >Forma de atendimento:</td>\r\n <td class=\"txt_padrao\" width=\"590\" >&nbsp;DESK MANAGER</td>\r\n </tr>\r\n \r\n <tr>\r\n <td class=\"txt_padrao\" align=\"right\">Causa:</td>\r\n <td class=\"txt_padrao\">&nbsp;ATUALIZAÃ\u0087Ã\u0083O</td>\r\n </tr>\r\n <tr><td colspan=\"2\" ><hr></td></tr>\r\n <tr>\r\n <td width=\"35\" height=\"35\" align=\"right\"><img src=\"./ico_visto.gif\" width=\"25\" height=\"25\" border=\"0\" alt=\"\"></td>\r\n <td width=\"740\" class=\"txt_padrao\" id=\"bold\"> Descrição da Ação:</td>\r\n </tr>\r\n </tr>\r\n <td>&nbsp;</td>\r\n <td class=\"txt_padrao\">Bom dia \r\n<br>\r\n<br>cadastrado atualizado cliente control xpto certifications<p>Atenciosamente,<br />DONALD L. THRUMP<br />[email protected]<br />Telefone: (11)5555-2222 <br /><img src=\"./159282496_logo_novo2.gif\" border=\"0\"></td>\r\n </tr>\r\n \r\n <tr><td colspan=\"2\"><hr></td></tr>\r\n \r\n </tr>\r\n <td>&nbsp;</td>\r\n <td class=\"txt_padrao\">\r\n Para visualizar o conteúdo da Ação, por favor acessar:<br>\r\n <a href=\"https://domain.deskserver.ms/?LoginPortal\">https://domain.deskserver.ms/?LoginPortal</a>\r\n </td>\r\n </tr>\r\n \r\n <tr>\r\n <td height=\"35\" align=\"right\"><img src=\"./ico_alert.gif\" width=\"25\" height=\"25\" border=\"0\" alt=\"\"></td>\r\n <td class=\"txt_padrao\" id=\"bold\"> Este e-mail é gerado automaticamente.</td>\r\n </tr>\r\n\r\n <tr><td colspan=\"2\" ><hr></td></tr>\r\n </table>\r\n\r\n </body> \r\n </html>\r\n \r\n\r\n\r\n", message.BodyHtml.Text);
285+
Assert.AreEqual(0, message.Attachments.Count);
286+
Assert.AreEqual(2, message.LeafMimeParts.Count);
287+
}
273288
}
274289
}
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
2+
d=optionalserver.onmicrosoft.com; s=selector1-hostway-travel;
3+
h=From:Date:Subject:Message-ID:Content-Type:MIME-Version;
4+
Authentication-Results: spf=none (sender IP is )
5+
smtp.mailfrom=[email protected];
6+
Received: from deskserver.ms (50.80.200.123) by
7+
GRUPR80MB1276.lamprd80.prod.com (10.164.107.99) with Microsoft SMTP
8+
Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id
9+
15.20.77.7; Wed, 27 Sep 2017 12:34:46 +0000
10+
Date: Wed, 27 Sep 2017 09:34:39 -0300
11+
Return-Path: [email protected]
12+
13+
From: Client support <[email protected]>
14+
Reply-to: Client support <[email protected]>
15+
Subject: CLIENT - BRASIL Status: OPEN / RESOLVED #0917-000622
16+
Message-ID: <[email protected]>
17+
X-Priority: 3
18+
X-Mailer: PHPMailer 5.1 (phpmailer.sourceforge.net)
19+
MIME-Version: 1.0
20+
Content-Type: multipart/alternative;
21+
boundary="b1_3a8c760555b716f3834fef3a2b05f160"
22+
23+
24+
--b1_3a8c760555b716f3834fef3a2b05f160
25+
Content-Type: text/plain; charset = "iso-8859-1"
26+
Content-Transfer-Encoding: 8bit
27+
28+
Para visualizar a mensagem, por favor, use um cliente de e-mail compatível/configurado para ver mensagens HTML!
29+
30+
31+
--b1_3a8c760555b716f3834fef3a2b05f160
32+
Content-Type: text/html; charset = "iso-8859-1"
33+
Content-Transfer-Encoding: 8bit
34+
35+
36+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
37+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt" lang="pt">
38+
<head>
39+
<title></title>
40+
<meta name="author" content="suporte" />
41+
<meta http-equiv="Content-Type" content="text/html; charset =iso-8859-1" />
42+
<style>
43+
.txt_padrao {font-family:Arial;font-size:12px}
44+
#bold {font-weight:bold;}
45+
</style>
46+
</head>
47+
<body leftmargin="5" topmargin="5" marginheight="0" smarginwidth="0">
48+
<br />
49+
Qualquer dúvida estou a disposição.<br />
50+
<br />
51+
Atenciosamente,<br />
52+
<br />
53+
<br />
54+
<br />
55+
<br />
56+
<br />
57+
<br />
58+
<br />
59+
<br />
60+
<br />
61+
<br />
62+
<br />
63+
<br />
64+
Ronald Santander<br />
65+
_________________________<br />
66+
<br />
67+
CLIENT<br />
68+
Consultor de Viagens <br />
69+
Tel.: + (55 11) 2222-4444 <br />
70+
Tel.: + (55 11) 3333-6666<br />
71+
<br />
72+
<br />
73+
<br />
74+
Outros telefones <br />
75+
<br />
76+
<br />
77+
<br />
78+
<br />
79+
<br />
80+
<br />
81+
ATENÇÃO! <br />
82+
<br />
83+
<br />
84+
<br />
85+
Prezado cliente, Seguindo a nova resolução do Regulador XXXXX, homologada em Abril/2016, e que impõe a emissão de certificado de seguro viagem individuais, tanto para viagem doméstica quanto internacional, as bandeiras American Express, Mastercard e Visa estão migrando o processo de emissão do certificado do seguro viagem, benefício incluso em suas soluções corporativas de pagamentos se utilizado pela sua empresa.<br />
86+
<br />
87+
<br />
88+
Todos os novos procedimentos de emissão do certificado do seguro viagem foram comunicados e disponibilizados aos gestores de viagens da sua empresa. Caso não tenha conhecimento do novo procedimento, se faz necessário verificar com o gestor responsável de sua empresa, pois a emissão do certificado é de total responsabilidade do viajante e requer acesso a ferramenta de emissão a cada viagem, por meio de login, senha e dados pessoais.<br />
89+
<br />
90+
<br />
91+
<br />
92+
INFORMAÇÕES IMPORTANTES <br />
93+
<br />
94+
<br />
95+
<br />
96+
A garantia da reserva, do assento e da tarifa são a emissão do bilhete; <br />
97+
Tarifas sujeitas a alteração sem prévio aviso. <br />
98+
Atenção ao prazo de emissão das reservas; <br />
99+
Para alterações, cancelamentos ou reembolsos há incidência de multas e/ou diferenças tarifárias conforme regra do bilhete; <br />
100+
Multa por Churning: Segundo a política de reservas, poderá haver cobrança de multa em caso de solicitação/realização de sucessivas operações para o mesmo passageiro/ cia aérea/trecho. Esta cobrança, multa por Churning - Excessive or constant book/cancel activity , ocorre quando a cia aérea detecta o mesmo trecho aéreo ou parte dele solicitado a partir da segunda vez em datas idênticas ou próximas (até 5 dias antes ou depois para ida e/ou volta). As multas recebidas serão repassadas à empresa. <br />
101+
<br />
102+
<br />
103+
VIAGENS INTERNACIONAIS PARA BRASILEIROS <br />
104+
<br />
105+
<br />
106+
<br />
107+
Chegar no aeroporto com 3 horas de antecedência para o embarque; <br />
108+
Apresentar passaporte com validade mínima de 6 meses; <br />
109+
Para países que necessitam de visto, o mesmo deve estar válido no momento do embarque; <br />
110+
Para países que exigem vacina contra febre amarela, apresentar comprovante internacional com período de incubação de 10 dias; <br />
111+
Para maiores informações sobre vacinas necessárias ou indicadas para seu destino visite o site: http://www.anvisa.gov.br/viajante/ ; <br />
112+
Para viagens internacionais é necessário informar o Nome completo do passageiro (idêntico ao Passaporte), Data de nascimento, Número do passaporte, País de emissão do passaporte, Validade, Nacionalidade, País de residência, País de destino, Endereço no destino, Cidade, Estado, Cep. Endereço residencial, Cidade, Estado e Cep. Para inclusão das informações de segurança na reserva antes da emissão do bilhete; <br />
113+
<br />
114+
<br />
115+
VIAGENS NACIONAIS <br />
116+
<br />
117+
<br />
118+
<br />
119+
Chegar no aeroporto com 2 horas de antecedência para o embarque; <br />
120+
Apresentação obrigatória de um documento de identificação original com foto e atual para embarque; <br />
121+
Favor sempre informar o número de identidade, cartão de milhas e preferência de assento do passageiro no momento da reserva;</td>
122+
</tr>
123+
<tr><td colspan="2" ><hr></td></tr><tr><td height="35" align="left" colspan="2" ><table><tr><td><img src="./ico_visto.gif" width="25" height="25" border="0" alt=""></td><td class="txt_padrao" id="bold" >Dados da Ação</td></tr></table></td></tr>
124+
<tr>
125+
<td class="txt_padrao" align="right" width="150" >Forma de atendimento:</td>
126+
<td class="txt_padrao" width="590" >&nbsp;DESK MANAGER</td>
127+
</tr>
128+
129+
<tr>
130+
<td class="txt_padrao" align="right">Causa:</td>
131+
<td class="txt_padrao">&nbsp;ATUALIZAÇÃO</td>
132+
</tr>
133+
<tr><td colspan="2" ><hr></td></tr>
134+
<tr>
135+
<td width="35" height="35" align="right"><img src="./ico_visto.gif" width="25" height="25" border="0" alt=""></td>
136+
<td width="740" class="txt_padrao" id="bold"> Descrição da Ação:</td>
137+
</tr>
138+
</tr>
139+
<td>&nbsp;</td>
140+
<td class="txt_padrao">Bom dia
141+
<br>
142+
<br>cadastrado atualizado cliente control xpto certifications<p>Atenciosamente,<br />DONALD L. THRUMP<br />[email protected]<br />Telefone: (11)5555-2222 <br /><img src="./159282496_logo_novo2.gif" border="0"></td>
143+
</tr>
144+
145+
<tr><td colspan="2"><hr></td></tr>
146+
147+
</tr>
148+
<td>&nbsp;</td>
149+
<td class="txt_padrao">
150+
Para visualizar o conteúdo da Ação, por favor acessar:<br>
151+
<a href="https://domain.deskserver.ms/?LoginPortal">https://domain.deskserver.ms/?LoginPortal</a>
152+
</td>
153+
</tr>
154+
155+
<tr>
156+
<td height="35" align="right"><img src="./ico_alert.gif" width="25" height="25" border="0" alt=""></td>
157+
<td class="txt_padrao" id="bold"> Este e-mail é gerado automaticamente.</td>
158+
</tr>
159+
160+
<tr><td colspan="2" ><hr></td></tr>
161+
</table>
162+
163+
</body>
164+
</html>
165+
166+
167+
168+
169+
--b1_3a8c760555b716f3834fef3a2b05f160--

0 commit comments

Comments
 (0)