0

我想解析在规范中正式定义的RFC822(SMTP) “已接收”行的元素,例如:

原子 = 1*

[...]

收到=“收到”“:”;每个继电器一个
                       [“来自”域] ; 发送主机
                       [“按”域] ; 接收主机
                       [“通过”原子];物理路径
                      *("with" 原子) ; 链接/邮件协议
                       [“id”味精-id];接收方消息 ID
                       ["for" 地址规范] ; 初始形式
                       “;” 约会时间 ; 收到时间

[...]

msg-id = "" ; 唯一消息 ID

[...]

addr-spec = 本地部分“@”域;全球地址

等用于域、日期时间等。

这是一个真实的例子:

收到:来自 ll-194.132.162.89.kv.sovam.net.ua (ll-194.132.162.89.kv.sovam.net.ua [83.170.243.194] (可能是伪造的)) by raq2073.uk2.net (8.10. 2/8.10.2) 与 <johnsmithsvt@matts.co.uk> 的 ESMTP id 为 lASHDDE10765;格林威治标准时间 2007 年 11 月 28 日星期三 17:13:13

正则表达式是捕获接收行部分的好策略吗?

我意识到许多 SMTP 服务器没有正确格式化接收到的行(在现实生活中)。

否则,有没有人知道 Java 中有一个做得很好的库?

编辑这是一个小提琴,显示了一个我已经敲了一段时间的正则表达式和测试,这似乎有效。

Received:\s+(?:from\s+(.+?))?(?:\(qmail (.+?)\))?(?:\s+by\s+(.+?))?(?:\\s+via\s+(.+?))?(?:\s+with\s+(.+?))?(?:\;?\s+id\s+(.+?))?(?:\s+for\s+(.+?))?(?:;\s*(?!.*\;.*)(.+))?$
4

1 回答 1

1

选择实际上取决于您想要实现的目标。

为了捕获接收器行的特定部分(例如“给我发件人部分”),正则表达式非常棒。

如果您需要一个成熟的语法分析器,那么仅靠正则表达式是不够的。特别是 addr-spec 有很多特殊情况,以至于正则表达式无法正确处理每一个(解释)。正则表达式不是解析器。

上次我需要一个实际的解析器时,我使用JavaCC编写了自己的解析器。如果您对语法和解析了解一两件事,我只会建议您沿着这条路走下去。

于 2012-04-28T23:43:27.583 回答