I had seen massive delays in delivery to Gmail when sending newsletters at my last $dayjob, and I had always assumed it was part of their spam filtering. For example, if it were me and I was getting thousands of nearly-identical emails sent to Gmail addresses, it seems like a good idea to let 1% of them through to see if end users mark them as spam or not. If they all get marked as spam, I don't need to let the rest through.
Likewise. I used a script to recurse over a long list of names, and putting in a small sleep() delay in-between emails ended up fixing the problem immediately.