Provides a clean and simple way to configure the WordPress-bundled PHPMailer library, allowing you to quickly get started sending mail through a local or cloud based service of your choice
WP PHPMailer provides a clean and simple way to configure the WordPress-bundled PHPMailer library, allowing you to quickly get started sending mail through a local or cloud based service of your choice.
Although WordPress bundles the PHPMailer library which allow you sending mail through a local or cloud based service of your choice, different cloud based service requires different configuration.
Worse still, most services provide multiple ways for setting them up. For instance: which SendGrid SMTP port provides the highest level of security, 25
, 587
, 2525
or 465
?
WP PHPMailer uses the WordPress-bundled PHPMailer library:
WP PHPMailer believes in convention over configuration, we pick the best configuration for each service:
SMTPAuth
, SMTPSecure
, etc
WP PHPMailer believes a plugin should "do one thing and do it well":
Pick one driver and define its required constants in wp-config.php
.
define('WP_PHPMAILER_DRIVER', 'mailhog');
define('WP_PHPMAILER_DRIVER', 'mailtrap');
define('MAILTRAP_USERNAME', 'your-mailtrap-username');
define('MAILTRAP_PASSWORD', 'your-mailtrap-password');
define('WP_PHPMAILER_DRIVER', 'sendgrid');
define('SENDGRID_API_KEY', 'your-sendgrid-api-key');
// Optional. Useful if you have email authentication configurated.
define('SENDGRID_FROM_ADDRESS', '[email protected]');
define('SENDGRID_FROM_NAME', 'John Doe');
define('SENDGRID_FROM_AUTO', true);
class MyCustomDriver implements DriverInterface
{
public static function makeConfig(ConstantRepository $constantRepo): ConfigInterface
{
$config = new Config();
$config->set('auth', true);
$config->set('host', 'smtp.custom.test');
$config->set('port', 587);
$config->set('protocol', 'tls');
$config->set(
'username',
$constantRepo->getRequired('MY_CUSTOM_USERNAME')
);
$config->set(
'password',
$constantRepo->getRequired('MY_CUSTOM_PASSWORD')
);
$config->set(
'fromAddress',
$constantRepo->get('MY_CUSTOM_FROM_ADDRESS')
);
$config->set(
'fromName',
$constantRepo->get('MY_CUSTOM_FROM_NAME')
);
$config->set(
'fromAuto',
$constantRepo->get('MY_CUSTOM_FROM_AUTO')
);
return $config;
}
}
add_filter('wp_phpmailer_drivers', function (array $drivers): array {
$drivers['my-custom-driver'] = MyCustomDriver::class;
return $drivers;
});
// wp-config.php
define('WP_PHPMAILER_DRIVER', 'my-custom-driver');
define('MY_CUSTOM_USERNAME', 'xxx');
define('MY_CUSTOM_PASSWORD', 'xxx');
// Optional.
define('MY_CUSTOM_FROM_ADDRESS', 'xxx');
define('MY_CUSTOM_FROM_NAME', 'xxx');
define('MY_CUSTOM_FROM_AUTO', true);
wp_phpmailer_driver
$driver = (string) apply_filters('wp_phpmailer_driver', string $wpPhpmailerDriver))
Filters the WP_PHPMAILER_DRIVER
constant.
Parameters:
WP_PHPMAILER_DRIVER
constantwp_phpmailer_drivers
$drivers = (array) apply_filters('wp_phpmailer_drivers', array $drivers)
Filters the available drivers array.
Parameters:
Example:
add_filter('wp_phpmailer_drivers', function (array $drivers): array {
$drivers['my-custom-driver'] = MyCustomDriver::class;
return $drivers;
});
wp_phpmailer_config_mappings
$mappings = (array) apply_filters('wp_phpmailer_config_mappings', array $mapings)
Filters the whitelisted PHPMailer configuration (property names) array. 'fromAddress', 'fromName', 'fromAuto' are special. Do not add them in mappings!
Parameters:
Example:
add_filter('wp_phpmailer_config_mappings', function (array $mappings): array {
$mappings['xxx'] = 'yyy';
return $mappings;
});
// The above filter results in:
add_action( 'phpmailer_init', function (PHPMailer $phpmailer) {
// $this->config comes from `DriverInterface::makeConfig`.
$phpmailer->xxx = $this->config->get('yyy');
});
composer require itinerisltd/wp-phpmailer
wp plugin install wp-phpmailer
Download from https://wordpress.org/plugins/wp-phpmailer
Then, install wp-phpmailer.zip
as usual.
# Make sure you use the same PHP version as remote servers.
# Building inside docker images is recommended.
php -v
# Checkout source code
git clone https://github.com/ItinerisLtd/wp-phpmailer.git
cd wp-phpmailer
git checkout <the-tag-or-the-branch-or-the-commit>
# Build the zip file
composer release:build
Then, install release/wp-phpmailer.zip
as usual.
NotFoundException
- Driver 'xxx' not found, acceptable values are: aaa, bbb, ccc
Reason: Driver is not found or not defined.
Troubleshooting:
WP_PHPMAILER_DRIVER
is correctwp_phpmailer_driver
is functioning correctlyThere is no settings page.
All configurations are done by PHP constants and WordPress filters.
No.
We have seen countless vulnerabilities related to user inputs. Mail settings don't change often and should be configured by a developer. Therefore, WP PHPMailer decided to use PHP constants instead of storing options in WordPress database.
However, if you must, you can use filters to override this behavior.
This plugin reuse the PHPMailer class bundled with WordPress core.
Thus, you have to keep WordPress core up to date to receive security patches.
No.
While you can make your own non-SMTP drivers, all default drivers are using SMTP. Pull requests are welcomed.
Never! This plugin will only work on actively supported PHP versions.
Don't use it on end of life or security fixes only PHP versions.
Thanks! Glad you like it. It's important to let my boss knows somebody is using this project. Please consider:
composer test
composer phpstan:analyse
composer style:check
Pull requests without tests will not be accepted!
Please provide feedback! We want to make this library useful in as many projects as possible. Please submit an issue and point out what you do and don't like, or fork the project and make suggestions. No issue is too small.
If you discover any security related issues, please email [email protected] instead of using the issue tracker.
WP PHPMailer is a Itineris Limited project created by Tang Rufus.
Special thanks to Brandon whose WP SMTP inspired this project.
Full list of contributors can be found here.
WP PHPMailer is released under the MIT License.