This problem with sending campaign e-mails was driving me nuts for a while. E-mails would get in the outgoing queue, then get marked as being processed, but they would never actually get sent. It was as if it crashed before sending the e-mail. I turned up logging by editing log4php.properties but nothing jumped out at me. From inside SugarCRM I could send tests or click “Send Queued Campaign Emails” and it would work. Only when it calls cron.php with php-cgi would it not work.
The breakthrough finally came when I thought about the fact that on Debian PHP for Apache, Apache2 and PHP CGI use different config files. These files are at /etc/php4/(apache|apache2|cgi)/php.ini. I compared two with diff -u and noticed there was a difference in the amount of memory that the script can use. After increasing it to 96mb it started working fine.