Home
Softono
i

itinerisltd

Professional software vendor delivering innovative solutions on the Softono platform. Specialized in both open-source and proprietary software development.

Total Products
2

Software by itinerisltd

acf-gutenblocks
Open Source

acf-gutenblocks

# acf-gutenblocks [![Packagist Version](https://img.shields.io/packagist/v/itinerisltd/acf-gutenblocks.svg)](https://packagist.org/packages/itinerisltd/acf-gutenblocks) [![PHP from Packagist](https://img.shields.io/packagist/php-v/itinerisltd/acf-gutenblocks.svg)](https://packagist.org/packages/itinerisltd/acf-gutenblocks) [![Packagist Downloads](https://img.shields.io/packagist/dt/itinerisltd/acf-gutenblocks.svg)](https://packagist.org/packages/itinerisltd/acf-gutenblocks) [![GitHub License](https://img.shields.io/github/license/itinerisltd/acf-gutenblocks.svg)](https://github.com/ItinerisLtd/acf-gutenblocks/blob/master/LICENSE) [![Hire Itineris](https://img.shields.io/badge/Hire-Itineris-ff69b4.svg)](https://www.itineris.co.uk/contact/) Easily create Gutenberg Blocks with Advanced Custom Fields. <!-- START doctoc generated TOC please keep comment here to allow auto update --> <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> - [Minimum Requirements](#minimum-requirements) - [Installation](#installation) - [Usage](#usage) - [Block definition](#block-definition) - [Block constructors](#block-constructors) - [`AbstractBlock`](#abstractblock) - [`AbstractBladeBlock`](#abstractbladeblock) - [Template data](#template-data) - [Fields](#fields) - [Simple array](#simple-array) - [ACF Builder](#acf-builder) - [Filters](#filters) - [`acf_gutenblocks/blocks` - `(array $blocks)`](#acf_gutenblocksblocks---array-blocks) - [`acf_gutenblocks/get_initializables` - `(array $initializables)`](#acf_gutenblocksget_initializables---array-initializables) - [`acf_gutenblocks/render_block_frontend_path` - `(string $path, Block $block)`](#acf_gutenblocksrender_block_frontend_path---string-path-block-block) - [`acf_gutenblocks/render_block_html_output` - `(string $html, Block $block)`](#acf_gutenblocksrender_block_html_output---string-html-block-block) - [`acf_gutenblocks/default_icon` - `(string $icon)`](#acf_gutenblocksdefault_icon---string-icon) - [`acf_gutenblocks/block_settings` - `(array $settings, string $name)`](#acf_gutenblocksblock_settings---array-settings-string-name) - [FAQ](#faq) - [Can I use a different template rendering option?](#can-i-use-a-different-template-rendering-option) - [Do I need to adhere to any structure or standard?](#do-i-need-to-adhere-to-any-structure-or-standard) - [Why not load all Blocks from a given directory? It's much easier!](#why-not-load-all-blocks-from-a-given-directory-its-much-easier) - [My Blade template doesn't load.](#my-blade-template-doesnt-load) - [Author Information](#author-information) - [Feedback](#feedback) - [Change log](#change-log) - [License](#license) <!-- END doctoc generated TOC please keep comment here to allow auto update --> ## Minimum Requirements - [PHP](https://secure.php.net/manual/en/install.php) >= 8.1 - [WordPress](https://wordpress.org/download/) (preferrably [Bedrock](https://roots.io/bedrock/)) >= 5.0 - [Advanced Custom Fields](https://www.advancedcustomfields.com/) >= 5.8.0 ## Installation ```bash $ composer require itinerisltd/acf-gutenblocks ``` ## Usage 1. Activate the plugin 2. Create a directory to store your Blocks in your plugin or theme 3. Define your [Block](#block-definition) and frontend template ``` Blocks/ └── Testimonial/ ├── views/ │ └── frontend.php # Block template file └── Testimonial.php # Block constructor and controller ``` 4. Register your Block by appending the Block class name as a string to the `acf_gutenblocks/blocks` filter ```php use Fully\Qualified\Namespace\Testimonial; use App\Blocks\Banner; add_filter('acf_gutenblocks/blocks', function (array $blocks): array { $new_blocks = [ Testimonial::class, Banner::class, ]; return array_merge($blocks, $new_blocks); }); ``` ## Block definition Blocks are registered using PHP classes to provide a simple "Controller" to allow separation of logic and functionality from your template. This can really help to isolate and organise code that is intended only for that Block. To create a Block, you must extend your class from the available Block constructors and pass any valid [`acf_register_block()`](https://www.advancedcustomfields.com/resources/acf_register_block/) arguments to the parent constructor. Here can also define your controller methods for use within your template. ```php # Blocks/Testimonial/Testimonial.php <?php declare(strict_types=1); namespace App\Blocks\Testimonial; use Itineris\AcfGutenblocks\AbstractBlock; class Testimonial extends AbstractBlock { public function __construct() { parent::__construct([ 'title' => __('Testimonial', 'sage'), 'description' => __('Testimonial description', 'sage'), 'category' => 'formatting', 'post_types' => ['post', 'page'], // Other valid acf_register_block() settings ]); } /** * Make $items available to your template */ public function with(): array { return [ 'items' => (array) get_field('items'), ]; } } ``` ### Block constructors #### `AbstractBlock` Extend from this class to register a vanilla PHP template. #### `AbstractBladeBlock` If your project uses the [Sage](https://roots.io/sage) theme, you can take advantage of Blade templating by extending from this class (in future, [Sage](https://roots.io/sage) will be optional). The `isValid` method will look for `\App\template`. If you're in a Sage environment where that doesn't exist (i.e. Sage 10), you can use the `acf_gutenblocks/blade_engine_callable` filter to return a different callable. ```php add_filter('acf_gutenblocks/blade_engine_callable', function (string $callable): string { return '\Roots\view'; }); ``` ## Template data Your Block constructor class is available to your template via `$controller`. This allows you to create truly advanced Blocks by organising all of your functional code and logic into a place where you can take more advantage of an OOP approach. Additionally, the `with()` method lets you pass variables to your template. To create a variable for your template, create a key+value pair in the `with()` method: ```php public function with(): array { return [ 'items' => (array) get_field('items'), ]; } ``` Using `$items` in your template: ```php # Blocks/Testimonial/views/frontend.php <?php foreach ($items as $item) : ?> <p><?php echo $item['title']; ?></p> <?php endforeach; ?> ``` ## Fields You can define your ACF fields in your Block by returning an array of fields in the `registerFields` method. ### Simple array Read more [here](https://www.advancedcustomfields.com/resources/register-fields-via-php/#example). ```php protected function registerFields(): array { return [ // Any valid field settings ]; } ``` ### ACF Builder ```php protected function registerFields(): array { $testimonial = new FieldsBuilder('testimonial'); $testimonial ->setLocation('block', '==', 'acf/testimonial'); $testimonial ->addText('quote') ->addText('cite') ->addRepeater('list_items') ->addText('list_item') ->addTrueFalse('enabled', [ 'ui' => 1, 'default_value' => 1, ]) ->endRepeater(); return $testimonial->build(); } ``` ## Filters ### `acf_gutenblocks/blocks` - `(array $blocks)` The Block Loader. Use this to load and register your Block classes. ### `acf_gutenblocks/get_initializables` - `(array $initializables)` Called before looping Blocks and checking if they are valid to load. ### `acf_gutenblocks/render_block_frontend_path` - `(string $path, Block $block)` Used to change the frontend view path. ### `acf_gutenblocks/render_block_html_output` - `(string $html, Block $block)` For use with `AbstractBlock`. Allows manipulating the frontend view HTML after being included. ### `acf_gutenblocks/default_icon` - `(string $icon)` Used to change the default icon. ### `acf_gutenblocks/block_settings` - `(array $settings, string $name)` Change the ACF Block settings registered in the Block before initialising it. ## FAQ ### Can I use a different template rendering option? You could make a copy of `AbstractBlock`, rename it and define your own `renderBlockCallback` method. Just make sure your Block class extends from it. ### Do I need to adhere to any structure or standard? You can manage your Blocks any way you wish. This README will use our [preferred approach](#usage) of strict typing and the directory structure. ### Why not load all Blocks from a given directory? It's much easier! Using directory scanning options like `glob` and `DirectoryIterator` (or other Iterators) will have a performance impact within your application. There are many reasons for that, but the most simple ones are that they take arguments that must be read and dealt with before getting to the actual directory scanning. Manually loading your Blocks also means that you as a developer are more aware of what you are loading and can do things like conditional logic of loading your Blocks. ### My Blade template doesn't load. Check your PHP error logs and that your installation is [valid](https://github.com/ItinerisLtd/acf-gutenblocks/blob/fe06055e1d0c48c6c0837586042e1146d3d6a8a8/src/AbstractBladeBlock.php#L16-L19) for use with [Sage](https://roots.io/sage). ## Author Information [acf-gutenblocks](https://github.com/ItinerisLtd/acf-gutenblocks) is a [Itineris Limited](https://www.itineris.co.uk/) project created by [Lee Hanbury-Pickett](https://github.com/codepuncher). Shout out to [@nicoprat](https://github.com/nicooprat) with his [article](https://medium.com/nicooprat/acf-blocks-avec-gutenberg-et-sage-d8c20dab6270) which kickstarted this. Thanks to [@mmirus](https://github.com/mmirus/) for pointers and giving me the idea for this package. Full list of contributors can be found [here](https://github.com/ItinerisLtd/acf-gutenblocks/graphs/contributors). ## Feedback **Please provide feedback!** We want to make this library useful in as many projects as possible. Please submit an [issue](https://github.com/ItinerisLtd/acf-gutenblocks/issues/new) and point out what you do and don't like, or fork the project and make suggestions. **No issue is too small.** ## Change log Please see [CHANGELOG](./CHANGELOG.md) for more information on what has changed recently. ## License [acf-gutenblocks](https://github.com/ItinerisLtd/acf-gutenblocks) is released under the [MIT License](https://opensource.org/licenses/MIT).

Web Components & Widgets
83 Github Stars
wp-phpmailer
Open Source

wp-phpmailer

# WP PHPMailer [![CircleCI](https://circleci.com/gh/ItinerisLtd/wp-phpmailer.svg?style=svg)](https://circleci.com/gh/ItinerisLtd/wp-phpmailer) [![Packagist Version](https://img.shields.io/packagist/v/itinerisltd/wp-phpmailer.svg?label=release&style=flat-square)](https://packagist.org/packages/itinerisltd/wp-phpmailer) [![WordPress Plugin Rating](https://img.shields.io/wordpress/plugin/rating/wp-phpmailer?style=flat-square)](https://wordpress.org/plugins/wp-phpmailer) [![PHP from Packagist](https://img.shields.io/packagist/php-v/itinerisltd/wp-phpmailer.svg?style=flat-square)](https://packagist.org/packages/itinerisltd/wp-phpmailer) [![WordPress Plugin: Tested WP Version](https://img.shields.io/wordpress/plugin/tested/wp-phpmailer?style=flat-square)](https://wordpress.org/plugins/wp-phpmailer) [![Packagist Downloads](https://img.shields.io/packagist/dt/itinerisltd/wp-phpmailer.svg?label=packagist%20downloads&style=flat-square)](https://packagist.org/packages/itinerisltd/wp-phpmailer/stats) [![WordPress Plugin Downloads](https://img.shields.io/wordpress/plugin/dt/wp-phpmailer?label=wp.org%20downloads&style=flat-square)](https://wordpress.org/plugins/wp-phpmailer/advanced/) [![GitHub License](https://img.shields.io/github/license/itinerisltd/wp-phpmailer.svg?style=flat-square)](https://github.com/ItinerisLtd/wp-phpmailer/blob/master/LICENSE) [![Hire Itineris](https://img.shields.io/badge/Hire-Itineris-ff69b4.svg?style=flat-square)](https://www.itineris.co.uk/contact/) [![Twitter Follow @itineris_ltd](https://img.shields.io/twitter/follow/itineris_ltd?style=flat-square&color=1da1f2)](https://twitter.com/itineris_ltd) [![Twitter Follow @TangRufus](https://img.shields.io/twitter/follow/TangRufus?style=flat-square&color=1da1f2)](https://twitter.com/tangrufus) [WP PHPMailer](https://github.com/ItinerisLtd/wp-phpmailer) provides a clean and simple way to configure [the WordPress-bundled PHPMailer library](https://core.trac.wordpress.org/browser/trunk/src/wp-includes/class-phpmailer.php), allowing you to quickly get started sending mail through a local or cloud based service of your choice. <!-- START doctoc generated TOC please keep comment here to allow auto update --> <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> - [Goal](#goal) - [Usage](#usage) - [Mailhog](#mailhog) - [Mailtrap](#mailtrap) - [SendGrid](#sendgrid) - [Custom Driver](#custom-driver) - [Step 1. Define Your Driver](#step-1-define-your-driver) - [Step 2. Register Your Driver](#step-2-register-your-driver) - [Step 3. Define Constants](#step-3-define-constants) - [Filters](#filters) - [`wp_phpmailer_driver`](#wp_phpmailer_driver) - [`wp_phpmailer_drivers`](#wp_phpmailer_drivers) - [`wp_phpmailer_config_mappings`](#wp_phpmailer_config_mappings) - [Minimum Requirements](#minimum-requirements) - [Installation](#installation) - [Composer (Recommended)](#composer-recommended) - [wordpress.org (WP CLI)](#wordpressorg-wp-cli) - [wordpress.org](#wordpressorg) - [Build from Source (Not Recommended)](#build-from-source-not-recommended) - [Common Errors](#common-errors) - [`NotFoundException` - `Driver 'xxx' not found, acceptable values are: aaa, bbb, ccc`](#notfoundexception---driver-xxx-not-found-acceptable-values-are-aaa-bbb-ccc) - [FAQ](#faq) - [Where is the settings page?](#where-is-the-settings-page) - [Will you add a settings page?](#will-you-add-a-settings-page) - [What PHPMailer version bundled?](#what-phpmailer-version-bundled) - [Is it a must to use SMTP?](#is-it-a-must-to-use-smtp) - [Will you add support for older PHP versions?](#will-you-add-support-for-older-php-versions) - [It looks awesome. Where can I find more goodies like this?](#it-looks-awesome-where-can-i-find-more-goodies-like-this) - [Where can I give :star::star::star::star::star: reviews?](#where-can-i-give-starstarstarstarstar-reviews) - [Testing](#testing) - [Feedback](#feedback) - [Security](#security) - [Credits](#credits) - [License](#license) <!-- END doctoc generated TOC please keep comment here to allow auto update --> ## Goal Although WordPress bundles [the PHPMailer library](https://core.trac.wordpress.org/browser/trunk/src/wp-includes/class-phpmailer.php) 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](https://sendgrid.com/) SMTP port provides the highest level of security, `25`, `587`, `2525` or `465`? [WP PHPMailer](https://github.com/ItinerisLtd/wp-phpmailer) uses [the WordPress-bundled PHPMailer library](https://core.trac.wordpress.org/browser/trunk/src/wp-includes/class-phpmailer.php): - 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](https://github.com/sendgrid/wordpress/tree/master/vendor) hasn't been updated in 2.5 years [WP PHPMailer](https://github.com/ItinerisLtd/wp-phpmailer) believes in [convention over configuration](https://rubyonrails.org/doctrine/#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 * unlike [the official Mailgun plugin](https://wordpress.org/plugins/mailgun/), there is no "use secure SMTP" option because nobody should be using insecure options - 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](https://github.com/ItinerisLtd/wp-phpmailer) believes a plugin should ["do one thing and do it well"](https://en.wikipedia.org/wiki/Unix_philosophy#Do_One_Thing_and_Do_It_Well): - unlike [the official SendGrid plugin](https://wordpress.org/plugins/sendgrid-email-delivery-simplified/), [WP PHPMailer](https://github.com/ItinerisLtd/wp-phpmailer) doesn't include the subscription widget nor the stats dashboard ## Usage Pick one driver and define its required constants in `wp-config.php`. ### Mailhog ```php define('WP_PHPMAILER_DRIVER', 'mailhog'); ``` ### Mailtrap ```php define('WP_PHPMAILER_DRIVER', 'mailtrap'); define('MAILTRAP_USERNAME', 'your-mailtrap-username'); define('MAILTRAP_PASSWORD', 'your-mailtrap-password'); ``` ### SendGrid ```php 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 ```php 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 ```php add_filter('wp_phpmailer_drivers', function (array $drivers): array { $drivers['my-custom-driver'] = MyCustomDriver::class; return $drivers; }); ``` ### Step 3. Define Constants ```php // 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: ```php 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: ```php 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) ```bash composer require itinerisltd/wp-phpmailer ``` ### wordpress.org (WP CLI) ```bash wp plugin install wp-phpmailer ``` ### wordpress.org Download from https://wordpress.org/plugins/wp-phpmailer Then, install `wp-phpmailer.zip` [as usual](https://codex.wordpress.org/Managing_Plugins#Installing_Plugins). ### Build from Source (Not Recommended) ```bash # 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](https://codex.wordpress.org/Managing_Plugins#Installing_Plugins). ## 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](https://www.php.net/manual/en/language.constants.php) and [WordPress filters](#filters). ### Will you add a settings page? No. We have seen [countless](https://blog.sucuri.net/2019/03/0day-vulnerability-in-easy-wp-smtp-affects-thousands-of-sites.html) [vulnerabilities](https://www.pluginvulnerabilities.com/2016/04/04/when-full-disclosure-of-a-claimed-wordpress-plugin-vulnerability-leads-to-a-bigger-problem/) [related](https://www.wordfence.com/blog/2019/03/recent-social-warfare-vulnerability-allowed-remote-code-execution/) [to](https://www.wordfence.com/blog/2018/11/privilege-escalation-flaw-in-wp-gdpr-compliance-plugin-exploited-in-the-wild/) user inputs. Mail settings don't change often and should be configured by a developer. Therefore, [WP PHPMailer](https://github.com/ItinerisLtd/wp-phpmailer) decided to use PHP constants instead of storing options in WordPress database. However, if you must, you can use [filters](#filters) to override this behavior. ### What PHPMailer version bundled? This plugin reuse [the PHPMailer class bundled with WordPress core](https://core.trac.wordpress.org/browser/trunk/src/wp-includes/class-phpmailer.php). 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](https://secure.php.net/supported-versions.php). 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? - Articles on [Itineris' blog](https://www.itineris.co.uk/blog/) - More projects on [Itineris' GitHub profile](https://github.com/itinerisltd) - More plugins on [Itineris](https://profiles.wordpress.org/itinerisltd/#content-plugins) and [TangRufus](https://profiles.wordpress.org/tangrufus/#content-plugins) wp.org profiles - Follow [@itineris_ltd](https://twitter.com/itineris_ltd) and [@TangRufus](https://twitter.com/tangrufus) on Twitter - Hire [Itineris](https://www.itineris.co.uk/services/) to build your next awesome site ### Where can I give :star::star::star::star::star: reviews? Thanks! Glad you like it. It's important to let my boss knows somebody is using this project. Please consider: - leave a 5-star review on [wordpress.org](https://wordpress.org/support/plugin/wp-phpmailer/reviews/) - tweet something good with mentioning [@itineris_ltd](https://twitter.com/itineris_ltd) and [@TangRufus](https://twitter.com/tangrufus) - :star: star this [Github repo](https://github.com/ItinerisLtd/wp-phpmailer) - :eyes: watch this [Github repo](https://github.com/ItinerisLtd/wp-phpmailer) - write blog posts - submit [pull requests](https://github.com/ItinerisLtd/wp-phpmailer) - [hire Itineris](https://www.itineris.co.uk/services/) ## Testing ```sh-session 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](https://github.com/ItinerisLtd/wp-phpmailer/issues/new) 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]](mailto:[email protected]) instead of using the issue tracker. ## Credits [WP PHPMailer](https://github.com/ItinerisLtd/wp-phpmailer) is a [Itineris Limited](https://www.itineris.co.uk/) project created by [Tang Rufus](https://typist.tech). Special thanks to [Brandon](https://log1x.com/) whose [WP SMTP](https://github.com/Log1x/wp-smtp) inspired this project. Full list of contributors can be found [here](https://github.com/ItinerisLtd/wp-phpmailer/graphs/contributors). ## License [WP PHPMailer](https://github.com/ItinerisLtd/wp-phpmailer) is released under the [MIT License](https://opensource.org/licenses/MIT).

WordPress Themes & Plugins Email Servers
62 Github Stars