如何通过DASL规则筛选特定日期收到的邮件
DASL筛选指定日期接收邮件的正确写法
原有代码存在两个核心问题:
urn:schemas:httpmail:datereceived是日期时间类型的MAPI属性,使用LIKE做字符串模糊匹配时会触发隐式类型转换,受系统区域格式、时区、Outlook版本影响,匹配结果不可靠,绝大多数场景下会漏匹配或匹配不到内容。- 两个
datereceived条件用AND连接逻辑错误:该写法要求邮件接收时间同时匹配目标日期、目标日期+1天两个字符串值,不存在能满足该条件的邮件。
筛选指定日期接收邮件的正确逻辑是:匹配接收时间大于等于目标日期零点,小于目标日期次日零点的所有邮件,对应VB实现代码如下:
' 预处理时间边界:取目标日期零点、目标日期次日零点 Dim dateStart As Date, dateEnd As Date dateStart = DateValue(received_date) dateEnd = DateAdd("d", 1, dateStart) ' 构造DASL筛选字符串,日期统一用mm/dd/yyyy hh:mm:ss格式规避区域格式兼容问题 filterstring = "@SQL=""urn:schemas:httpmail:subject"" LIKE '%" & Replace(subject, "'", "''") & "%'" & _ " AND ""urn:schemas:httpmail:datereceived"" >= '" & Format(dateStart, "mm/dd/yyyy hh:mm:ss") & "'" & _ " AND ""urn:schemas:httpmail:datereceived"" < '" & Format(dateEnd, "mm/dd/yyyy hh:mm:ss") & "'"
额外注意事项:
- 主题匹配部分加入
Replace(subject, "'", "''")是为了转义主题内容中可能存在的单引号,避免单引号导致筛选语句语法报错。 - 如果需要规避本地时区和邮件存储UTC时间的偏移误差,可以将本地时间转为UTC后再拼接筛选语句,把时间格式化部分替换为
Format(Session.PropertyAccessor.LocalTimeToUTC(dateStart), "mm/dd/yyyy hh:mm:ss")、Format(Session.PropertyAccessor.LocalTimeToUTC(dateEnd), "mm/dd/yyyy hh:mm:ss")即可。
内容的提问来源于stack exchange,提问作者potato_for_life
相关产品推荐
相关产品推荐

