Здравствуйте, ShulapovMax, Вы писали:
SM>нашел сырцы работы с smtp под .net, всё нормально работает но возникла другая проблема — с русскими символами, в subject, body и т.п.
SM>Помогите плиз! нужно разобраться в формате mime (encoding & charset) и в общем русификацией сообщения smtp
SM>очень желательно под .net, потому что уже
посмотри кодировку RFC 2047
из одного моего проекта (разбор поля subject)
internal string ParseRfc2047(string val)
{ string[] sub;
byte[] buf;
Encoding code;
FromBase64Transform bt=null;
CryptoStream cs=null;
if(val==null || val==string.Empty) return(string.Empty);
// проверить, что это кодировка по RFC 2047:
if(val.Length<4 || !val.StartsWith("=?") || !val.EndsWith("?=")) return(val);
sub=val.Substring(2, val.Length-4).Split(new char[]{'?'}, 3);
if(sub.Length<3 || sub[0].Length<1 || sub[1].Length<1 || sub[2].Length<1) return(val);
try // проверить тип кодировки
{ code=Encoding.GetEncoding(sub[0].Trim());
using(MemoryStream ms=new MemoryStream())
{ switch(sub[1].Trim().ToUpper())
{ case "Q": // quoted-printable
for(int k=0; k<sub[2].Length; k++)
{ if(sub[2][k]=='=')
{ if((k+2)>=sub[2].Length) return(val);
ms.WriteByte(byte.Parse(sub[2].Substring(k+1, 2), NumberStyles.HexNumber));
k+=2;
}
else ms.WriteByte(Convert.ToByte(sub[2][k]));
}
ms.Position=0; buf=ms.ToArray();
return(code.GetString(buf));
case "B": // base64
bt=new FromBase64Transform();
cs=new CryptoStream(ms, bt, CryptoStreamMode.Write);
buf=Encoding.ASCII.GetBytes(sub[2]);
cs.Write(buf, 0, buf.Length); cs.Flush();
ms.Position=0; buf=ms.ToArray();
cs.Close(); cs=null;
return(code.GetString(buf));
default: return(val);
}
}
} catch(Exception ex){ Common.WriteLog("EM2023", "Неверная кодировка заголовка "+val, ex); }
return(val);
}