RegEx匹配“Received:by”电子邮件标题中的时间

时间:2012-05-21 17:34:36

标签: regex perl email time email-headers

在我的网站所在的共享主机上,我有一个电子邮件转发器,可以将短信作为短信发送到我的手机。然而,最近,它已经失控了。

我希望,使用cPanel中的"用户级别过滤" ,我可以设置一个基于RegEx的过滤器,只在几个小时之间将电子邮件转发到我的手机07:00:00和22:00:00

此过滤器将匹配以下电子邮件标头,该标头通常在邮件源中出现2-3行:

Received: by 99.99.99.99 with SMTP id XyXyXyXyXyXyXy;
        Tue, 15 May 2012 01:22:33

......这就是我希望它的工作方式:

Received: by (ANY IP) with (ANYTHING) id (ANYTHING);
        (Sun|Mon|Tue|Wed|Thu|Fri|Sat), (ANY DATE/MONTH/YEAR) (RegEx magic to match time?)

当匹配成功时(例如,如果时间在07:00:00到22:00:00之间),该消息将被发送到我的手机,否则它什么都不做。 (当然,这与RegEx本身无关。)

我是一个非常正则的表达式n00b,但设计了以下(非工作)RegEx,并且不知道我离它有多远或多远:

\bReceived: by (.*) with [a-Z] id (.*)(Sun|Mon|Tue|Weds|Thu|Fri|Sat),(.*)[0-2][2-7]:[0-2][0-9]:[0-2][0-9]\bsi

有任何想法,建议或创意解决方案吗?我的托管服务告诉我,cPanel中的RegEx需要采用PERL格式。

2 个答案:

答案 0 :(得分:0)

Eugene的正则表达式的修订版;

/\bReceived: by .*?;\s*(?:Sun|Mon|Tue|Weds|Thu|Fri|Sat),\s*\d+\s+\w+\s+\d+\s+(?:0[789]|1\d|2[01]):\d\d:\d\d\b/

此版本使用非捕获分组,并将可接受的时间限制为07:00:00到21:59:59。它假设时间格式有效 - 理论上它会通过10:99:99的时间,但我假设你不会看到那些。

答案 1 :(得分:-1)

修复了您使用http://gskinner.com/RegExr/工作的问题,但仍然很不理想。告诉你是否想进一步深入了解。

\bReceived: by (.*) with \w+ id (.*);\s*(Sun|Mon|Tue|Weds|Thu|Fri|Sat),\s*(\d+\s+\w+\s+\d+)\s+[0-2][0-9]:[0-5][0-9]:[0-5][0-9]\b