C # Parsing Email Messages

I am building a system for reading emails in C #. I have a problem with the analysis of the topic, a problem that, it seems to me, is related to the encoding.

The subject that I am reading is as follows: =?ISO-8859-1?Q?=E6=F8sd=E5f=F8sdf_sdfsdf?= , The source object sent is æøsdåføsdf sdfsdf (there are Norwegian characters there).

Any ideas how I can change the encoding or parse it correctly? So far, I have been trying to use C # code conversion methods to encode an object in utf8, but with no luck.

Here is one of the solutions I tried:

 Encoding iso = Encoding.GetEncoding("iso-8859-1"); Encoding utf = Encoding.UTF8; string decodedSubject = utf.GetString(Encoding.Convert(utf, iso, iso.GetBytes(m.Subject.Split('?')[3]))); 
+4
source share
2 answers

The encoding is called quoted for printing .

See the answers to this question.

Adapted from the accepted answer:

 public string DecodeQuotedPrintable(string value) { Attachment attachment = Attachment.CreateAttachmentFromString("", value); return attachment.Name; } 

When passing the string =?ISO-8859-1?Q?=E6=F8sd=E5f=F8sdf_sdfsdf?= ""Øsdåføsdf_sdfsdf" is returned.

+6
source
  public static string DecodeEncodedWordValue(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) { var hex = m.Groups[2].Value; var iHex = Convert.ToInt32(hex, 16); // Return the string in the charset defined var bytes = new byte[1]; bytes[0] = 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); } else { // No match, not encoded, return original string decodedString += encodedString; break; } } return decodedString; } 
+6
source

All Articles