diff --git a/obox-tests/obox-user-delete-dangling/test.d/common.sh b/obox-tests/obox-user-delete-dangling/test.d/common.sh
index 98452a1aa..63f6a3dbf 100644
--- a/obox-tests/obox-user-delete-dangling/test.d/common.sh
+++ b/obox-tests/obox-user-delete-dangling/test.d/common.sh
@@ -29,6 +29,18 @@ dangling_delete_from_storage() {
 	done
 }
 
+# Like stderr_expect_multi, but first drops the stderr lines that don't match
+# any of the given regexps. "doveadm obox user delete" logs a variable number
+# of per-folder recovery lines when it resyncs lost folders, so only the
+# deterministic summary lines can be matched exactly.
+stderr_expect_at_least_multi() {
+	local re pat
+	for re in "$@"; do pat="${pat:+$pat|}$re"; done
+	egrep -a "$pat" $TEST_STDERR >$TEST_STDERR.tmp || true
+	mv $TEST_STDERR.tmp $TEST_STDERR
+	stderr_expect_multi "$@"
+}
+
 # Run "doveadm obox user delete" for the user $1 and assert that it removes
 # every dict pointer and every object-storage blob of the user. The command's
 # log output is left in $TEST_STDERR for the caller to check.
