Giter Club home page Giter Club logo

wp-phpmailer's Introduction

WP PHPMailer

CircleCI Packagist Version WordPress Plugin Rating PHP from Packagist WordPress Plugin: Tested WP Version Packagist Downloads WordPress Plugin Downloads GitHub License Hire Itineris Twitter Follow @itineris_ltd Twitter Follow @TangRufus

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.

Goal

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:

  • so you offload the responsibility of updating bundled libraries from plugin authors to WordPress core team and contributors
    • at the time of writing, the official SendGrid plugin's vendor folder hasn't been updated in 2.5 years

WP PHPMailer believes in convention over configuration, we pick the best configuration for each service:

  • so you don't waste time going through the documents
  • so you don't have to figure out which port and protocol to use
  • so you don't miss any security configuration, e.g: SMTPAuth, SMTPSecure, etc
  • so you only have to provide minimum information
    • take SendGrid for example, only SendGrid API key (with "Mail Send" permission only) is required

WP PHPMailer believes a plugin should "do one thing and do it well":

Usage

Pick one driver and define its required constants in wp-config.php.

Mailhog

define('WP_PHPMAILER_DRIVER', 'mailhog');

Mailtrap

define('WP_PHPMAILER_DRIVER', 'mailtrap');

define('MAILTRAP_USERNAME', 'your-mailtrap-username');
define('MAILTRAP_PASSWORD', 'your-mailtrap-password');

SendGrid

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);

Custom Driver

Step 1. Define Your Driver

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;
    }
}

Step 2. Register Your Driver

add_filter('wp_phpmailer_drivers', function (array $drivers): array {
    $drivers['my-custom-driver'] = MyCustomDriver::class;

    return $drivers;
});

Step 3. Define Constants

// 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);

Filters

wp_phpmailer_driver

$driver = (string) apply_filters('wp_phpmailer_driver', string $wpPhpmailerDriver))

Filters the WP_PHPMAILER_DRIVER constant.

Parameters:

  • $wpPhpmailerDriver
    • (string) the value of WP_PHPMAILER_DRIVER constant

wp_phpmailer_drivers

$drivers = (array) apply_filters('wp_phpmailer_drivers', array $drivers)

Filters the available drivers array.

Parameters:

  • $drivers
    • (array) the available drivers array

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:

  • $mapings
    • (array) the whitelisted PHPMailer configuration (property names)

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');
});

Minimum Requirements

  • PHP v7.2
  • WordPress v5.5

Installation

Composer (Recommended)

composer require itinerisltd/wp-phpmailer

wordpress.org (WP CLI)

wp plugin install wp-phpmailer

wordpress.org

Download from https://wordpress.org/plugins/wp-phpmailer Then, install wp-phpmailer.zip as usual.

Build from Source (Not Recommended)

# 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.

Common Errors

NotFoundException - Driver 'xxx' not found, acceptable values are: aaa, bbb, ccc

Reason: Driver is not found or not defined.

Troubleshooting:

  • Ensure PHP constant is WP_PHPMAILER_DRIVER is correct
  • Ensure filter wp_phpmailer_driver is functioning correctly

FAQ

Where is the settings page?

There is no settings page.

All configurations are done by PHP constants and WordPress filters.

Will you add a settings page?

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.

What PHPMailer version bundled?

This plugin reuse the PHPMailer class bundled with WordPress core.

Thus, you have to keep WordPress core up to date to receive security patches.

Is it a must to use SMTP?

No.

While you can make your own non-SMTP drivers, all default drivers are using SMTP. Pull requests are welcomed.

Will you add support for older PHP versions?

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.

It looks awesome. Where can I find more goodies like this?

Where can I give ⭐⭐⭐⭐⭐ reviews?

Thanks! Glad you like it. It's important to let my boss knows somebody is using this project. Please consider:

Testing

composer test
composer phpstan:analyse
composer style:check

Pull requests without tests will not be accepted!

Feedback

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.

Security

If you discover any security related issues, please email [email protected] instead of using the issue tracker.

Credits

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.

License

WP PHPMailer is released under the MIT License.

wp-phpmailer's People

Contributors

codepuncher avatar danlapteacru avatar dependabot-preview[bot] avatar dependabot[bot] avatar kodiakhq[bot] avatar ouun avatar pgrimaud avatar r00tsquared avatar tangrufus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wp-phpmailer's Issues

TypeError: Argument 1 passed to Itineris\WPPHPMailer\Plugin::Itineris\WPPHPMailer\{closure}() must be an ins...

Sentry Issue: redacted-6R

TypeError: Argument 1 passed to Itineris\WPPHPMailer\Plugin::Itineris\WPPHPMailer\{closure}() must be an instance of PHPMailer, instance of PHPMailer\PHPMailer\PHPMailer given, called in /www/redacted/public-08-mar-2019/releases/20200813091127/web/wp/wp-includes/class-wp-hook.php on line 287
  File "/www/redacted/public-08-mar-2019/releases/20200813091127/web/app/plugins/wp-phpmailer/src/Plugin.php", line 14, in Itineris\WPPHPMailer\Plugin::Itineris\WPPHPMailer\{closure}
    add_action('phpmailer_init', function (PHPMailer $mailer): void {
  File "/wp-includes/class-wp-hook.php", line 287, in WP_Hook::apply_filters
    $value = call_user_func_array( $the_['function'], $args );
  File "/wp-includes/class-wp-hook.php", line 311, in WP_Hook::do_action
    $this->apply_filters( '', $args );
  File "/wp-includes/plugin.php", line 544, in do_action_ref_array
    $wp_filter[ $tag ]->do_action( $args );
  File "/wp-includes/pluggable.php", line 494, in wp_mail
    do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );
...
(2 additional frame(s) were not displayed)

Dependabot can't resolve your PHP dependency files

Dependabot can't resolve your PHP dependency files.

As a result, Dependabot couldn't update your dependencies.

The error Dependabot encountered was:

Could not parse version constraint >= 8.1.x: Invalid version string "8.1.x"

If you think the above is an error on Dependabot's side please don't hesitate to get in touch - we'll do whatever we can to fix it.

You can mention @dependabot in the comments below to contact the Dependabot team.

PHP 8.x Support

Hi @tangrufus,
I use this package for nearly every project, it is so useful and easy to set-up.
However I am not sure whether you continue to update it. E.g. by adding PHP 8 as requirement in composer.json.
I also added a PR quite a while ago: #486

Kind regards,

Philipp

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.