I tried to reproduce your '4 iteration' problem on my Zope 2.9.2 installation, but even by removing the 'return' statement I still got 2 loop iterations (and 2 emails).
I have never written a python script that did not have a 'return' statement. I don't know if it is mandatory or not. I usually use python scripts as subroutines/functions and I always have a return statement (even if it is a bare return - ie. the return statement does not send back any data).
As Andreas suggested, if you want to track this down you are going to have to use a debugger like pdb.
I have test the script on my local windows python version with an print statement, and it works fine - everytime - so its only on zope. i cant use pdb on zope“s python script i think?