POP3 клиент quoted-printable декодирование - C#
Формулировка задачи:
Никто не знает? Ну ладно. А как перекодировать из Quoted Printable в нормальный вид?
Я использовал следующую конструкцию:
Вызывал и записывал в файл так:
А в файле с вложением отобразилось вот так:
Почему не декодировалось? Облазил все, что можно((( Подскажите, что делать - сроки поджимают.
public static string GetDecodeString(string mimeString)
{
var regex = new Regex(@"=\?(?<charset>.*?)\?(?<encoding>[qQbB])\?(?<value>.*?)\?=");
var encodedString = mimeString;
var decodedString = string.Empty;
while (encodedString.Length > 0)
{
var match = regex.Match(encodedString);
if (match.Success)
{
// If the match isn't at the start of the string, copy the initial few chars to the output
decodedString += encodedString.Substring(0, match.Index);
var charset = match.Groups["charset"].Value;
var encoding = match.Groups["encoding"].Value.ToUpper();
var value = match.Groups["value"].Value;
if (encoding.Equals("B"))
{
// Encoded value is Base-64
var bytes = Convert.FromBase64String(value);
decodedString += Encoding.GetEncoding(charset).GetString(bytes);
}
else if (encoding.Equals("Q"))
{
// Encoded value is Quoted-Printable
// Parse looking for =XX where XX is hexadecimal
var regx = new Regex("(\\=([0-9A-F][0-9A-F]))", RegexOptions.IgnoreCase);
decodedString += regx.Replace(value, new MatchEvaluator(delegate(Match m)
{
byte[] bytes = new byte[m.Value.Length / 3];
for (int i = 0; i < bytes.Length; i++)
{
string hex = m.Value.Substring(i * 3 + 1, 2);
int iHex = Convert.ToInt32(hex, 16);
bytes[i] = Convert.ToByte(iHex);
}
return Encoding.GetEncoding(charset).GetString(bytes);
}));
decodedString = decodedString.Replace('_', ' ');
}
else
{
// Encoded value not known, return original string
// (Match should not be successful in this case, so this code may never get hit)
decodedString += encodedString;
break;
}
// Trim off up to and including the match, then we'll loop and try matching again.
encodedString = encodedString.Substring(match.Index + match.Length + 1);
}
else
{
// No match, not encoded, return original string
decodedString += encodedString;
break;
}
}
return decodedString;
}using (StreamReader reader = new StreamReader(@"C:\" + filename+".txt"))
{
string str = RegexDecode.DecodeEncodedWordValue(reader.ReadToEnd());
string filenameDecode = @"TempMessageFileDecode" + i.ToString();
pop3.SaveToFile(str, @"C:\", filenameDecode);
}Return-Path: <test@domain.local>
Received: from st41nb ([192.168.191.248])
by [192.168.191.248] (Courier Mail Server 2.10) with ESMTP id 00500001
for <csti@domain.local>; Mon, 15 Aug 2011 13:10:47 +0400
From: "Ilyasov" <test@domain.local>
To: <csti@domain.local>
Subject: FW: Калуга_газ_без расхода
Date: Mon, 15 Aug 2011 13:10:47 +0400
Message-ID: <000001cc5b2b$3867a660$a936f320$@local>
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_NextPart_000_0001_01CC5B4C.BF794660"
X-Mailer: Microsoft Office Outlook 12.0
Thread-Index: AcxbEHnrAGcNB+GZTWKq+UW7nFwCZAAGreLw
Content-Language: ru
This is a multi-part message in MIME format.
------=_NextPart_000_0001_01CC5B4C.BF794660
Content-Type: multipart/alternative;
boundary="----=_NextPart_001_0002_01CC5B4C.BF794660"
------=_NextPart_001_0002_01CC5B4C.BF794660
Content-Type: text/plain;
charset="koi8-r"
Content-Transfer-Encoding: quoted-printable
=20
=20
From: removed@mail.ru [mailto:removed@mail.ru]=20
Sent: Monday, August 15, 2011 9:59 AM
To: removed@mail.ru
Subject: =EB=C1=CC=D5=C7=C1_=C7=C1=DA_=C2=C5=DA =D2=C1=D3=C8=CF=C4=C1
=20
=20
------=_NextPart_001_0002_01CC5B4C.BF794660
Content-Type: text/html;
charset="koi8-r"
Content-Transfer-Encoding: quoted-printable
<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
charset=3Dkoi8-r">
<html xmlns:v=3D"urn:schemas-microsoft-com:vml" =
xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" =
xmlns=3D"http://www.w3.org/TR/REC-html40"><head><meta name=3DGenerator =
content=3D"Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:#1F497D;}
..MsoChpDefault
{mso-style-type:export-only;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]--></head><body lang=3DRU link=3Dblue =
vlink=3Dpurple><div class=3DWordSection1><p class=3DMsoNormal><span =
style=3D'color:#1F497D'><o:p> </o:p></span></p><p =
class=3DMsoNormal><span =
style=3D'color:#1F497D'><o:p> </o:p></span></p><div =
style=3D'border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm =
0cm 0cm'><p class=3DMsoNormal><b><span =
style=3D'font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span>=
</b><span style=3D'font-size:10.0pt;font-family:"Tahoma","sans-serif"'> =
removed@mail.ru [mailto:removed@mail.ru] =
<br><b>Sent:</b> Monday, August 15, 2011 9:59 AM<br><b>To:</b> =
removed@mail.ru<br><b>Subject:</b> =
=EB=C1=CC=D5=C7=C1_=C7=C1=DA_=C2=C5=DA =
=D2=C1=D3=C8=CF=C4=C1<o:p></o:p></span></p></div><p =
class=3DMsoNormal><o:p> </o:p></p><p =
class=3DMsoNormal><o:p> </o:p></p></div></body></html>
------=_NextPart_001_0002_01CC5B4C.BF794660--
------=_NextPart_000_0001_01CC5B4C.BF794660
Content-Type: application/octet-stream;
name="310244_51401.110815"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="310244_51401.110815"
CP866_404
//51401:1108:310244:15:4::++
(20):::::::2479::::2479::
(2000003)::02 5211:706:20:::2479::::2479::
=3D=3D
##15.08.2011
##
##=C2=E5=F0=F1=E8=FF ARM_Maker - 4.4.8
##
##
##
------=_NextPart_000_0001_01CC5B4C.BF794660
Content-Type: application/octet-stream;
name="310244_51401.110811"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="310244_51401.110811"
CP866_404
//51401:1108:310244:11:4::++
(20):::::::2479::::2479::
(2000003)::02 5211:706:20:::2479::::2479::
=3D=3D
##15.08.2011
##
##=C2=E5=F0=F1=E8=FF ARM_Maker - 4.4.8
##
##
##
------=_NextPart_000_0001_01CC5B4C.BF794660
Content-Type: application/octet-stream;
name="310244_51401.110812"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="310244_51401.110812"
CP866_404
//51401:1108:310244:12:4::++
(20):::::::2479::::2479::
(2000003)::02 5211:706:20:::2479::::2479::
=3D=3D
##15.08.2011
##
##=C2=E5=F0=F1=E8=FF ARM_Maker - 4.4.8
##
##
##
------=_NextPart_000_0001_01CC5B4C.BF794660
Content-Type: application/octet-stream;
name="310244_51401.110813"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="310244_51401.110813"
CP866_404
//51401:1108:310244:13:4::++
(20):::::::2479::::2479::
(2000003)::02 5211:706:20:::2479::::2479::
=3D=3D
##15.08.2011
##
##=C2=E5=F0=F1=E8=FF ARM_Maker - 4.4.8
##
##
##
------=_NextPart_000_0001_01CC5B4C.BF794660
Content-Type: application/octet-stream;
name="310244_51401.110814"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="310244_51401.110814"
CP866_404
//51401:1108:310244:14:4::++
(20):::::::2479::::2479::
(2000003)::02 5211:706:20:::2479::::2479::
=3D=3D
##15.08.2011
##
##=C2=E5=F0=F1=E8=FF ARM_Maker - 4.4.8
##
##
##
------=_NextPart_000_0001_01CC5B4C.BF794660--Решение задачи: «POP3 клиент quoted-printable декодирование»
textual
Листинг программы
Attachment attachment = Attachment.CreateAttachmentFromString("", "=?utf-8?Q?=D0=9F=D0=B0=D0=BA=D0=B5=D1=82=5F=D0=BE=D1=82=D1=87=D0=B5=D1=82=D0=BD=D0=BE=D1=81=D1=82?=");
Console.WriteLine(attachment.Name);