解决“指定的字符串不符合主题所需的格式”问题。

77

我有一个类可以发送邮件(MailMessage),但出现以下错误:

"指定的字符串不符合主题所需的格式。"

是否有方便的方法来清理字符串,或者我必须自己编写代码?

4个回答

132

我个人没有尝试过,但根据这个链接所述,你只需要:

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

或者等价物。

MailMessage类在内部会通过以下代码检查邮件主题:

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

目前唯一的限制是存在CRLF


4
谢谢您的回复。但是我必须说,微软为什么不能直接说明换行符不被允许呢? - Gerard ONeill
2
你知道文档编写很困难;-) 不允许使用CRLF的原因很可能是,CRLF在消息格式中具有非常特殊的用途(请参见RFC5322),他们不想自动更改用户数据,而是失败并让用户手动更改(如上所示)。 - Christian.K
2
进一步说明:subject = subject.Replace(Environment.NewLine, " "); - Nae
1
@Nae,根据MailMessage的源代码,正确的方法是替换\r\n字符。你的解决方案只在某些情况下有效... - Mladen B.

9

此外,还有一个168个字符的限制,所以您也应该检查一下。

更新:抱歉,这是完全胡说八道 :) 在我的情况下可能是换行符。


2
有没有相关的文档可以提供链接? - mlhDev
我不这么认为,我们只是通过试错找到了答案。我可能错了,欢迎你自己尝试并发布结果。 - mike nelson
听起来不错,我只是好奇你是怎么得出答案的(而且这个值很奇怪)。已经+1了-解决方案就是解决方案 :) - mlhDev
@mikenelson - 我想知道为什么有这样一个小的限制。想象一下,如果在SSIS(一种ETL工具)中使用它,你的包可能会因为这个限制而失败。 - Steam
我已经测试了超过900个字符,它可以正常工作。 - Agile Jedi

4

针对VB.NET

subject = subject.Replace(vbNewLine, "")

3
我假设 subject = subject.Replace(vbCr, " ").Replace(vbLf, " ") 的意思是将字符串变量subject中的回车(vbCr)和换行(vbLf)替换为空格(" ")。 - JNF

1
我知道这个问题已经有了答案,但是它的解决方法如下:
首先,你需要截取主题,然后考虑主题的最大长度(电子邮件主题长度限制是什么?):
subject = subject.Trim();
subject = subject.Substring(0, Math.Min(subject.Length, 78));

这将删除开头和结尾的任何换行符或空格。然后使用Substring来限制主题长度。

2
长度超过78个字符在这里不是问题,\r\n的存在是一个问题,但也很高兴得到这个答案。 - Spikolynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接