# Deliver Site Emails With SparkPost

> Delivers all WordPress emails through SparkPost's Transmissions API instead of PHP mail or SMTP, for dependable delivery and SparkPost's event reporting.

- Type: PHP
- Runs: Run everywhere
- Category: [Email](https://wpide.com/library/category/email/)
- Tags: email, sparkpost, api
- Author: WPIDE Team
- Installs: 0
- Updated: 2026-10-28
- Page: https://wpide.com/library/email-send-via-sparkpost/

## Code

```php
add_filter( 'pre_wp_mail', function ( $return, $atts ) {
    if ( null !== $return || ! defined( 'WPIDE_SPARKPOST_KEY' ) || ! WPIDE_SPARKPOST_KEY || ! empty( $atts['attachments'] ) ) {
        return $return;
    }

    $split = function ( $value ) {
        $value = trim( (string) $value );
        return preg_match( '/^(.*)<([^>]+)>$/', $value, $m ) ? array( 'name' => trim( $m[1], " \"'" ), 'email' => trim( $m[2] ) ) : array( 'name' => '', 'email' => $value );
    };

    $lines = is_array( $atts['headers'] ) ? $atts['headers'] : explode( "\n", str_replace( "\r\n", "\n", (string) $atts['headers'] ) );
    $h     = array( 'from' => '', 'reply-to' => array(), 'cc' => array(), 'bcc' => array(), 'content-type' => '' );
    foreach ( $lines as $line ) {
        if ( false === strpos( (string) $line, ':' ) ) {
            continue;
        }
        list( $name, $value ) = array_map( 'trim', explode( ':', $line, 2 ) );
        $name = strtolower( $name );
        if ( in_array( $name, array( 'reply-to', 'cc', 'bcc' ), true ) ) {
            $h[ $name ] = array_merge( $h[ $name ], array_filter( array_map( 'trim', explode( ',', $value ) ) ) );
        } elseif ( isset( $h[ $name ] ) ) {
            $h[ $name ] = $value;
        }
    }

    $to      = is_array( $atts['to'] ) ? $atts['to'] : explode( ',', (string) $atts['to'] );
    $is_html = false !== stripos( $h['content-type'], 'text/html' ) || 'text/html' === apply_filters( 'wp_mail_content_type', 'text/plain' );
    $from    = $h['from'] ? $split( $h['from'] ) : array( 'name' => apply_filters( 'wp_mail_from_name', 'WordPress' ), 'email' => apply_filters( 'wp_mail_from', get_option( 'admin_email' ) ) );

    $recipients = array();
    foreach ( array_merge( array_filter( array_map( 'trim', $to ) ), $h['cc'], $h['bcc'] ) as $recipient ) {
        $recipients[] = array( 'address' => array( 'email' => $split( $recipient )['email'] ) );
    }

    $content = array( 'from' => array( 'email' => $from['email'], 'name' => $from['name'] ), 'subject' => (string) $atts['subject'] );
    $content[ $is_html ? 'html' : 'text' ] = (string) $atts['message'];
    if ( $h['reply-to'] ) {
        $content['reply_to'] = $h['reply-to'][0];
    }
    if ( $h['cc'] ) {
        $content['headers'] = array( 'CC' => implode( ',', $h['cc'] ) );
    }

    $host     = defined( 'WPIDE_SPARKPOST_EU' ) && WPIDE_SPARKPOST_EU ? 'api.eu.sparkpost.com' : 'api.sparkpost.com';
    $response = wp_remote_post( 'https://' . $host . '/api/v1/transmissions', array(
        'timeout' => 15,
        'headers' => array( 'Authorization' => WPIDE_SPARKPOST_KEY, 'Content-Type' => 'application/json' ),
        'body'    => wp_json_encode( array( 'recipients' => $recipients, 'content' => $content ) ),
    ) );

    $code = (int) wp_remote_retrieve_response_code( $response );
    if ( $code >= 200 && $code < 300 ) {
        do_action( 'wp_mail_succeeded', $atts );
        return true;
    }

    $message = is_wp_error( $response ) ? $response->get_error_message() : 'SparkPost returned HTTP ' . $code . ': ' . wp_remote_retrieve_body( $response );
    do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $message, $atts ) );

    return false;
}, 10, 2 );
```

## Notes

Define WPIDE_SPARKPOST_KEY (plus WPIDE_SPARKPOST_EU as true for EU accounts) in wp-config.php and verify the sending domain; emails with attachments fall back to the normal mailer.

## How to use it

Install the free WPIDE plugin (https://wordpress.org/plugins/wpide/), find "Deliver Site Emails With SparkPost" in its snippet library and add it in one click; or create a new PHP snippet in WPIDE (or any code snippets plugin) and paste the code above. More snippets: https://wpide.com/library/
