Send WordPress Email Through the Postmark API
Delivers all WordPress emails through Postmark's HTTP API instead of PHP mail or SMTP, for fast, reliable delivery on hosts that block outgoing mail ports.
Opens WPIDE on
Code
add_filter( 'pre_wp_mail', function ( $return, $atts ) {
if ( null !== $return || ! defined( 'WPIDE_POSTMARK_TOKEN' ) || ! WPIDE_POSTMARK_TOKEN || ! empty( $atts['attachments'] ) ) {
return $return;
}
$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;
}
}
$from = $h['from'] ? $h['from'] : sprintf( '%s <%s>', apply_filters( 'wp_mail_from_name', 'WordPress' ), apply_filters( 'wp_mail_from', get_option( 'admin_email' ) ) );
$is_html = false !== stripos( $h['content-type'], 'text/html' ) || 'text/html' === apply_filters( 'wp_mail_content_type', 'text/plain' );
$to = is_array( $atts['to'] ) ? $atts['to'] : explode( ',', (string) $atts['to'] );
$body = array(
'From' => $from,
'To' => implode( ',', array_map( 'trim', $to ) ),
'Subject' => (string) $atts['subject'],
'MessageStream' => 'outbound',
);
$body[ $is_html ? 'HtmlBody' : 'TextBody' ] = (string) $atts['message'];
if ( $h['cc'] ) {
$body['Cc'] = implode( ',', $h['cc'] );
}
if ( $h['bcc'] ) {
$body['Bcc'] = implode( ',', $h['bcc'] );
}
if ( $h['reply-to'] ) {
$body['ReplyTo'] = implode( ',', $h['reply-to'] );
}
$response = wp_remote_post( 'https://api.postmarkapp.com/email', array(
'timeout' => 15,
'headers' => array( 'Accept' => 'application/json', 'Content-Type' => 'application/json', 'X-Postmark-Server-Token' => WPIDE_POSTMARK_TOKEN ),
'body' => wp_json_encode( $body ),
) );
$code = (int) wp_remote_retrieve_response_code( $response );
if ( 200 === $code ) {
do_action( 'wp_mail_succeeded', $atts );
return true;
}
$message = is_wp_error( $response ) ? $response->get_error_message() : 'Postmark 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_POSTMARK_TOKEN (your server API token) in wp-config.php and send from a verified Postmark sender; emails with attachments fall back to the normal mailer.
How to add this snippet
- Install WPIDE on your WordPress site (it is free) and open Code Snippets.
- Use snippet above adds it from the library in one click. Or copy the code into a new snippet with the same code type.
- It is added inactive: review the code and settings, then switch it on.