Re: Как работать с SMTP/MIME
От: SCS  
Дата: 26.09.03 14:06
Оценка: 1 (1)
Здравствуйте, 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);
}
SCS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.