Решение: «Указанная строка не в форме, требуемой для темы».

У меня есть класс, который отправляет электронное письмо (MailMessage), но я получаю следующую ошибку:

«Указанная строка не в форме, требуемой для темы».

Есть ли удобный метод денди для дезинфекции строк или мне нужно написать свои собственные?


person Matt    schedule 30.08.2011    source источник


Ответы (4)


Я лично не пробовал, но согласно this, вам нужно только:

subject = subject.Replace('\r', ' ').Replace('\n', ' ');

или что-то подобное.

Внутренне класс MailMessage будет проверять тему с помощью:

if (value != null && MailBnfHelper.HasCROrLF(value)) 
{
   throw new ArgumentException(SR.GetString(SR.MailSubjectInvalidFormat));
}

Таким образом, единственным ограничением (на данный момент) является наличие CR или LF.

person Christian.K    schedule 30.08.2011
comment
Спасибо тебе за это. Но должен сказать - есть ли причина, по которой Microsoft не могла просто сказать, что новые строки не разрешены? - person Gerard ONeill; 05.04.2017
comment
Вы знаете, что документация сложна ;-) Причина, по которой это не разрешено, скорее всего, заключается в том, что CRLF имеет очень специальные цели в формате сообщения (см. RFC5322), и они не хотели беспокоиться об автоматическом изменении данных пользователя, а скорее потерпели неудачу и позволили ему сделать это вручную (как показано выше). - person Christian.K; 05.04.2017
comment
Дополнительное примечание subject = subject.Replace(Environment.NewLine, " "); - person Nae; 20.02.2020
comment
@Nae, правильный способ (судя по исходному коду MailMessage) - заменить ОБЕИХ символов \r и \n. Ваше решение будет работать только в некоторых случаях ... - person Mladen B.; 26.02.2021

Также существует ограничение в 168 символов, так что вы тоже должны проверить это.

ОБНОВЛЕНИЕ: извините, это полная чушь :) В моем случае это был разрыв строки.

person mike nelson    schedule 26.09.2012
comment
Есть ли какая-либо документация по этому поводу? - person mlhDev; 16.08.2013
comment
Я так не думаю, мы просто разобрались методом проб и ошибок. Могу ошибаться, можете попробовать и выложить результат. - person mike nelson; 16.08.2013
comment
Звучит хорошо, мне просто было любопытно, как вы пришли к ответу (и при этом такое странное значение). Уже +1 - решение есть решение :) - person mlhDev; 16.08.2013
comment
@mikenelson - Интересно, почему есть такой маленький лимит. Представьте, что если это используется в SSIS (инструмент ETL), ваш пакет может просто выйти из строя из-за этого ограничения. - person Steam; 09.01.2014
comment
Я тестировал это с более чем 900 символами, и он отлично работает - person Agile Jedi; 01.12.2016

Для VB.NET

subject = subject.Replace(vbNewLine, "")
person Clarice Bouwer    schedule 23.11.2012
comment
Я предположил subject = subject.Replace(vbCr, " ").Replace(vbLf, " ") - person JNF; 16.01.2013

Я знаю, что на это уже был дан ответ, но это так:

Во-первых, вам нужно обрезать тему, а затем учесть максимальную длину темы (Что такое ограничение длины темы электронного письма?):

subject = subject.Trim();
subject = subject.Substring(0, Math.Min(subject.Length, 78));

Это удалит все новые строки или пустые места в начале и в конце. Затем Substring используется для ограничения длины темы.

person Weggo    schedule 13.10.2017
comment
Длина более 78 символов здесь не проблема, \ r \ n присутствует, но тоже приятно получить этот ответ. - person Spikolynn; 06.12.2019