South Africa took an unbeatable 2-0 lead in the three-match series with a more convincing display than they did in winning the first match by five wickets in Kimberley on Friday.
Zimbabwe were dismissed for a mediocre 152 in 49.4 overs, to which South Africa replied with 156 for four in 27.4 overs.
''We got the rust out the other day in Kimberley, and the boys put in a good performance,'' Kallis said.
''We have lots of work to do from here, but it's a pleasing result,'' he told reporters.
Kallis said the South Africans had aimed to reach the target in ''as close to 25 overs as possible''.
POOLOCK DENIED Shaun Pollock needed just two more wickets to become the fifth player and the first South African to take 350 wickets in One-day Internationals but he only managed to take one for 28.
Zimbabwe dawdled to their sub-par total after winning the toss and choosing to bat on a slow pitch that held few terrors for batsmen.
The visitors showed almost no aggression throughout their innings, which cost them dearly as they had little to show for their efforts when their last five wickets tumbled for 32.
Zimbabwe's only partnership of substance was the 47 shared by Justice Chibhabha and Elton Chigumbura for the sixth wicket.
Chibhabha's patient 38, which he scored off 98 deliveries, and Chigumbura's 30 were Zimbabwe's top scores.
Loots Bosman, who hit two sixes in his 38, and debutant Alviro Petersen, who scored 20, put South Africa on course for victory with a second-wicket stand of 53.
JP Duminy, with 31 not out, and Justin Kemp, who made an unbeaten 28, took South Africa home with an unbroken partnership of 47.
The match was originally scheduled to be played on Sunday but was postponed until Monday when rain washed out play.
The last match in the series will be played in Potchefstroom on Wednesday.