来自标题的display-name的验证/格式

Iag*_*ago 8 smtp rfc rfc2822

我需要知道name-addr电子邮件中()字段的验证/格式规则是什么.在rfc解释了格式name-addr,但详细介绍了display-name.

像这样:

From: John Q. Public <JQP@bar.com>
Run Code Online (Sandbox Code Playgroud)

我想知道允许的字符和长度.我怎么知道它John Q. Public有有效字符?我应该只允许打印的US-ASCII字符吗?

我咨询了RFC 2822,但没有找到显示名称的具体格式

jst*_*ast 20

这是在您在问题中链接到的rfc中定义的(顺便说一下,本文档的较新版本是RFC 5322):

display-name    =       phrase
phrase          =       1*word / obs-phrase
word            =       atom / quoted-string
atom            =       [CFWS] 1*atext [CFWS]
atext           =       ALPHA / DIGIT / ; Any character except controls,
                        "!" / "#" /     ;  SP, and specials.
                        "$" / "%" /     ;  Used for atoms
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"
specials        =       "(" / ")" /     ; Special characters used in
                        "<" / ">" /     ;  other parts of the syntax
                        "[" / "]" /
                        ":" / ";" /
                        "@" / "\" /
                        "," / "." /
                        DQUOTE
Run Code Online (Sandbox Code Playgroud)

您必须在文档中稍微跳转一下才能找到每种令牌类型的定义,但它们都在那里.

获得定义后,您需要做的就是扫描您的名称字符串,看它是否只包含有效字符.

根据定义,a display-name是a phrase和a phrase是1或更多的word令牌(或者obs-word我现在将忽略以使这种解释更简单).

word令牌可以是一个atom或一个quoted-string.

在您的示例中,John Q. Public包含一个special字符".",该字符不能出现在atom令牌中.quoted-string令牌怎么样?好的,我们等着瞧...

quoted-string   =       [CFWS]
                        DQUOTE *([FWS] qcontent) [FWS] DQUOTE
                        [CFWS]
qcontent        =       qtext / quoted-pair
qtext           =       NO-WS-CTL /     ; Non white space controls
                        %d33 /          ; The rest of the US-ASCII
                        %d35-91 /       ;  characters not including "\"
                        %d93-126        ;  or the quote character
Run Code Online (Sandbox Code Playgroud)

基于此,我们可以告诉a "."在引用字符串中是允许的,所以...正确的格式display-name可以是以下任何一种:

From: "John Q. Public" <JQB@bar.com>
Run Code Online (Sandbox Code Playgroud)

要么

From: John "Q." Public <JQB@bar.com>
Run Code Online (Sandbox Code Playgroud)

要么

From: "John Q." Public <JQB@bar.com>
Run Code Online (Sandbox Code Playgroud)

要么

From: John "Q. Public" <JQB@bar.com>
Run Code Online (Sandbox Code Playgroud)

其中任何一个都可以.

  • 这是一个很棒的答案.感谢您花时间将其编译成一个简洁的定义! (4认同)