我想解析在规范中正式定义的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*(?!.*\;.*)(.+))?$