Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Проблема c System.Net.Mail.MailAddress


Автор: Pankon 18.5.2006, 12:44
VS 2005

При создании e-mail адреса "name.user.@host.com" (с ТОЧКОЙ в конце) появляется исключение - "Строка не является допустимым е-маил адресом", хотя многие маил сервера поддерживают такие адреса....

Что делать? 


 

Автор: ivashkanet 18.5.2006, 13:40
Pankon, так захотели разработчики фрэймворка  smile 
ИМХО, такой адрес не соответствует стандартам.
Нужно либо искать уже готовый класс (поддерживающий такие адреса), либо писать новый (reflector тебе в руки).  smile  

Автор: Pankon 18.5.2006, 14:15
Цитата(ivashkanet @  18.5.2006,  13:40 Найти цитируемый пост)
так захотели разработчики фрэймворка

А что же делать пользователям(с пользователями), которые уже имеют такие адреса smile 



Цитата(ivashkanet @  18.5.2006,  13:40 Найти цитируемый пост)
Нужно либо искать уже готовый класс 

На сколько я понимаю, сообщение генерирует SMTP-сервер....
 

Автор: ivashkanet 18.5.2006, 14:24
Цитата(Pankon @  18.5.2006,  14:15 Найти цитируемый пост)
На сколько я понимаю, сообщение генерирует SMTP-сервер....

Нет, сообщение генерирует сам класс.
У меня не стоит SMTP-сервера, да и студия явно указывает на момент создания класса (запуска конструктора) с неправильными параметрами.
P.S. Поразбирай, на досуге, процесс создания MailAddrss-а:
Код

public MailAddress(string address, string displayName, Encoding displayNameEncoding)
{
      if (address == null)
      {
            throw new ArgumentNullException("address");
      }
      if (address == string.Empty)
      {
            throw new ArgumentException(SR.GetString("net_emptystringcall", new object[] { "address" }), "address");
      }
      this.displayNameEncoding = displayNameEncoding;
      this.displayName = displayName;
      this.ParseValue(address);
      if ((this.displayName != null) && (this.displayName != string.Empty))
      {
            if ((this.displayName[0] == '"') && (this.displayName[this.displayName.Length - 1] == '"'))
            {
                  this.displayName = this.displayName.Substring(1, this.displayName.Length - 2);
            }
            this.displayName = this.displayName.Trim();
      }
      if ((this.displayName != null) && (this.displayName.Length > 0))
      {
            if (!MimeBasePart.IsAscii(this.displayName, false) || (this.displayNameEncoding != null))
            {
                  if (this.displayNameEncoding == null)
                  {
                        this.displayNameEncoding = Encoding.GetEncoding("utf-8");
                  }
                  this.encodedDisplayName = MimeBasePart.EncodeHeaderValue(this.displayName, this.displayNameEncoding, MimeBasePart.ShouldUseBase64Encoding(displayNameEncoding));
                  StringBuilder builder1 = new StringBuilder();
                  int num1 = 0;
                  MailBnfHelper.ReadQuotedString(this.encodedDisplayName, ref num1, builder1, true);
                  this.encodedDisplayName = builder1.ToString();
            }
            else
            {
                  this.encodedDisplayName = this.displayName;
            }
      }
}

Код

private void ParseValue(string address)
{
      string text1 = null;
      int num1 = address.IndexOf('"');
      if (num1 > 0)
      {
            throw new FormatException(SR.GetString("MailAddressInvalidFormat"));
      }
      if (num1 == 0)
      {
            num1 = address.IndexOf('"', 1);
            if (num1 < 0)
            {
                  throw new FormatException(SR.GetString("MailAddressInvalidFormat"));
            }
            text1 = address.Substring(1, num1 - 1);
            if (address.Length == (num1 + 1))
            {
                  throw new FormatException(SR.GetString("MailAddressInvalidFormat"));
            }
            address = address.Substring(num1 + 1);
      }
      if (text1 == null)
      {
            num1 = address.IndexOf('<');
            if (num1 > 0)
            {
                  text1 = address.Substring(0, num1);
                  address = address.Substring(num1);
            }
      }
      if (this.displayName == null)
      {
            this.displayName = text1;
      }
      num1 = 0;
      address = MailBnfHelper.ReadMailAddress(address, ref num1, out this.encodedDisplayName);
      this.GetParts(address);
}

Код

private void GetParts(string address)
{
      if (address != null)
      {
            int num1 = address.IndexOf('@');
            if (num1 < 0)
            {
                  throw new FormatException(SR.GetString("MailAddressInvalidFormat"));
            }
            this.userName = address.Substring(0, num1);
            this.host = address.Substring(num1 + 1);
      }
}

..... 
 

Автор: Pankon 18.5.2006, 14:57
Цитата(Pankon @  18.5.2006,  14:15 Найти цитируемый пост)
сообщение генерирует SMTP-сервер


действительно это не так ...

Добавлено @ 15:04 
Цитата(ivashkanet @  18.5.2006,  14:24 Найти цитируемый пост)
Поразбирай, на досуге, 
 что это даст?
Фирма переходит на .NET и постоянно сталкивается с проблемами. 
И проблема c System.Net.Mail.MailAddress опять показывает скорополительность решения..., 
что же делать если клиенты имеют такие адреса?...  Материть  MS?












 smile 
 

Автор: Ch0bits 18.5.2006, 16:08
На крайний случай можно написать свою реализацию SMTP, для хорошего программиста это не проблема.
Припоминаю что даже видел такие решения на codeproject.com 

Автор: Pankon 18.5.2006, 16:46
Тогда и всю студию...

...и Framework в придачу...





 

Автор: Ch0bits 18.5.2006, 19:51
Pankon
Не надо, их уже переписали. dotNET -> Mono; VS -> #Develop  smile  

Автор: Pankon 19.5.2006, 10:19
Попробывал старые:
CDONTS.NewMail
и
CDO.Message

Ошибки при исполнении нет, но получатель все равно ничего не получает, 
а вот на адрес отправителя приходит сообщение, что произошло неудачное отправление. smile 
   

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)