Как работать с SMTP/MIME
От: ShulapovMax Россия http://HrExpress.ru/
Дата: 26.09.03 13:20
Оценка:
нашел сырцы работы с smtp под .net, всё нормально работает но возникла другая проблема — с русскими символами, в subject, body и т.п.
Помогите плиз! нужно разобраться в формате mime (encoding & charset) и в общем русификацией сообщения smtp
очень желательно под .net, потому что уже
Одинаковые ошибки необязательно делать каждый раз, достаточно сделать одну, а затем обращаться к ней по мере необходимости из любого места программы.
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
Re[2]: Как работать с SMTP/MIME
От: ShulapovMax Россия http://HrExpress.ru/
Дата: 29.09.03 08:24
Оценка:
Здравствуйте, SCS, Вы писали:


SCS>посмотри кодировку RFC 2047

SCS>из одного моего проекта (разбор поля subject)

Спасибо за помощь, с subject ом разобрался, теперь копаюсь в теле
пытаюсь сделать что-то более-менее универсальное (text|inlineattach|attach)

самое фиговое, что не могу найти rfc на русском, по английски много времени уходит на перевод (понять смысл) — ведь документ то большой, пока найдешь нужный кусок...
Одинаковые ошибки необязательно делать каждый раз, достаточно сделать одну, а затем обращаться к ней по мере необходимости из любого места программы.
Re[3]: Как работать с SMTP/MIME
От: 245_Monah  
Дата: 26.08.05 10:43
Оценка:
Здравствуйте, ShulapovMax, Вы писали:

SM>Здравствуйте, SCS, Вы писали:



SCS>>посмотри кодировку RFC 2047

SCS>>из одного моего проекта (разбор поля subject)

SM>Спасибо за помощь, с subject ом разобрался, теперь копаюсь в теле

SM>пытаюсь сделать что-то более-менее универсальное (text|inlineattach|attach)

SM>самое фиговое, что не могу найти rfc на русском, по английски много времени уходит на перевод (понять смысл) — ведь документ то большой, пока найдешь нужный кусок...

SM>
Слушай, у тебя такая проблема была, декодировать тело не получается, эта сволота ESMTP помимо начальной Outlook-ой кодировки еще кодит в теле непонятно что, если нашел ответ подскажи, ПЛЗ, заранее спасибо!!!
Re[4]: Как работать с SMTP/MIME
От: Max404.NET Россия http://HrExpress.ru/
Дата: 26.08.05 11:16
Оценка:
Здравствуйте, 245_Monah, Вы писали:

_M>Слушай, у тебя такая проблема была, декодировать тело не получается, эта сволота ESMTP помимо начальной Outlook-ой кодировки еще кодит в теле непонятно что, если нашел ответ подскажи, ПЛЗ, заранее спасибо!!!



так меня задолбало копаться в сыром тексте... я сделал обертку над MAPI и этим удовлетворился
Одинаковые ошибки необязательно делать каждый раз, достаточно сделать одну, а затем обращаться к ней по мере необходимости из любого места программы.
Re[5]: Как работать с SMTP/MIME
От: 245_Monah  
Дата: 26.08.05 13:58
Оценка:
Здравствуйте, Max404.NET, Вы писали:

MN>Здравствуйте, 245_Monah, Вы писали:


MN>так меня задолбало копаться в сыром тексте... я сделал обертку над MAPI и этим удовлетворился

Отправить у меня проблем нет, у меня проблема, то что на сервер приходит от Outlook-a нормальное SMTP приложение, потом какого то х..., сервер дописывает ему ESMTP, при этом он портит исходное тело MIME мессаги, то есть он не трогает заголовки, а именно портит тело, если есть какие то предложения, пиши, бо мне уже крышу прет, блин!!!
Re[6]: Как работать с SMTP/MIME
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.08.05 11:16
Оценка:
Здравствуйте, 245_Monah, Вы писали:
MN>>так меня задолбало копаться в сыром тексте... я сделал обертку над MAPI и этим удовлетворился
_M>Отправить у меня проблем нет, у меня проблема, то что на сервер приходит от Outlook-a нормальное SMTP приложение, потом какого то х..., сервер дописывает ему ESMTP, при этом он портит исходное тело MIME мессаги, то есть он не трогает заголовки, а именно портит тело, если есть какие то предложения, пиши, бо мне уже крышу прет, блин!!!
Из моего опыта следует, что 95% мистики в нашей работе — результат банальной невнимательности. То компиляешь одну программу, а запускаешь другую, то лишний раз в дебаггере к свойству обратишься — а оно на состояние влияет, или опечатка типа унаследованный метод ToLeft вызывает у base.ToRight(), то еще что.
Поэтому постарайся исключить все-все посторонние факторы. Очень рекомендую выспаться перед серьезной отладкой — иначе можно вообще с глузда съехать.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.