Today I had to solve the problem, that my wordpress cron throws an exception like this when sending an email via wp_mail function inside a cron scheduled event function.
PHP Fatal error: Uncaught exception 'phpmailerException' with message 'Invalid address: (setFrom) wordpress@' in /var/www/clients/client2/web8/web/wp-base/wp-includes/class-phpmailer.php:1023 Stack trace: #0 /var/www/clients/client2/web8/web/wp-base/wp-includes/pluggable.php(352): PHPMailer->setFrom('wordpress@', 'WordPress', false) #1 /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/sheldon_misc/admin/class-sheldon_misc-admin.php(183): wp_mail('info@ask-sheldon.com....', 'Statusmailing i...', 'The cron for im...') #2 /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/sheldon_misc/admin/class-sheldon_misc-admin.php(143): Sheldon_Misc_Admin::sendStatusMail('ERROR', 0, 'Something went ...') #3 [internal function]: Sheldon_Misc_Admin->process_hourly_cron() #4 /var/www/clients/client2/web8/web/wp-base/wp-includes/class-wp-hook.php(298): call_user_func_array(Array, Array) #5 /var/www/clients/client2/web8/web/wp-base/wp-includes/class-wp-hook.php(323): WP_Hook->apply_filters('', Array) #6 /var/www/clients/cli in /var/www/clients/client2/web8/web/wp-base/wp-includes/class-phpmailer.php on line 1023
The wordpress cron was registered like that:
wp_schedule_event( time(), 'hourly', 'intolife_misc_hourly_cron_event' );
And the wordpress cron mechanism was triggered via Linux crontab:
*/15 * * * * php /var/www/clients/client2/web8/web/wp-base/wp-cron.php
Problem with wp_mail in wordpress cron
The problem was, that the PHP server variable $_SERVER[ ‘SERVER_NAME’ ]  isn’t available when executed via crontab, unix shell as well as wp-cli wrapper. That’s the reason why the phpmailer  didn’t get the hostname for the from parameter, which results in trying to send  mail with “wordpress@” as from value. And that’s the trigger for the exception mentioned above.
Solution for wp_mail in wordpress cron
The solution was relatively simple, after determining what the real reason was. I just had to pass the server variable to PHP inside the crontab call.
*/15 * * * * export SERVER_NAME="ask-sheldon.com" && php /var/www/clients/client2/web8/web/wp-base/wp-cron.php
The first part before the && sets the required environment variable. The second part stayed as it was and just calls the cron a usual.
Similar Problem
I had the same issue with wc-super-cache:
PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576 PHP Warning: strpos(): Empty needle in /var/www/clients/client2/web8/web/wp-base/wp-content/plugins/wp-super-cache/wp-cache-phase1.php on line 576
It was only a warning but hence I got all output via mail, it was really annoying. 😉
Once more I had to define an environment variable on my own:
*/15 * * * * export REQUEST_URI='/' && export SERVER_NAME="ask-sheldon.com" && php /var/www/clients/client2/web8/web/wp-base/wp-cron.php
As you can see, the missing environment variable was $_SERVER[ ‘REQUEST_URI’ ]Â Â in that case.