Last active
August 29, 2015 14:17
-
-
Save avioli/03e32ff37e806d3fc409 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Send an email to WEBMASTER_EMAIL and allow for file and/or inline attachments. | |
* | |
* IMPORTANT: define('WEBMASTER_EMAIL', ...); | |
* | |
* Uses an altered version of wp_mail(), taken from WordPress4/wp-includes/pluggable.php. | |
* | |
* Usage: | |
* @ionata_mail(array( | |
* 'subject' => 'Error with XML response', | |
* 'body' => 'Find XML request/response files attached.', | |
* 'attachments' => array( | |
* array( | |
* 'filename' => 'xml_request.xml', | |
* 'body' => $xml_request, | |
* ), | |
* array( | |
* 'filename' => 'xml_response.xml', | |
* 'body' => $xml_response, | |
* ) | |
* ) | |
* )); | |
* | |
* Note: | |
* By default the email will be sent 'from' => "[Site name] <wordpress@[domain.tld]>". | |
* It is advisable to leave the 'to' value as is. | |
*/ | |
function ionata_mail( $args = array() ) { | |
$webmaster_email = ''; | |
if ( empty($args['to']) ) { | |
if ( defined('WEBMASTER_EMAIL') ) { | |
$webmaster_email = WEBMASTER_EMAIL; | |
} else { | |
return; | |
} | |
} | |
$defaults = array( | |
'site_name' => get_option( 'blogname' ), | |
'from' => null, | |
'to' => $webmaster_email, | |
'subject' => 'Generic Error', | |
'body' => '', | |
'attachments' => null, | |
); | |
$args = array_merge( $defaults, $args ); | |
extract( $args, EXTR_SKIP ); | |
$headers = array(); | |
if ( $from === null ) { | |
// Get the site domain and get rid of www. | |
$servername = strtolower( $_SERVER['SERVER_NAME'] ); | |
if ( substr( $servername, 0, 4 ) == 'www.' ) { | |
$servername = substr( $servername, 4 ); | |
} | |
$wp_email = 'wordpress@' . $servername; | |
$from = sprintf( '%s <%s>', $site_name, $wp_email ); | |
} else if ( ! empty( $site_name ) ) { | |
$subject = trim( sprintf( '[%s] %s', $site_name, $subject ) ); | |
} | |
if ( ! empty( $from ) ) { | |
$headers[] = 'From: ' . $from; | |
} | |
$file_attachments = array(); | |
$string_attachments = array(); | |
if ( is_array( $attachments ) ) { | |
foreach ( $attachments as $att ) { | |
if ( is_array( $att ) && isset( $att['body'] ) && ! empty( $att['filename'] ) ) { | |
// a string attachment | |
$string_attachments[] = array( | |
$att['body'], | |
$att['filename'], | |
); | |
} else if ( is_string( $att ) ) { | |
// a file | |
$file_attachments[] = $att; | |
} | |
} | |
} | |
@ionata_wp_mail( $to, $subject, $body, $headers, $file_attachments, $string_attachments ); | |
} | |
/** | |
* Send mail, similar to PHP's mail | |
* | |
* A true return value does not automatically mean that the user received the | |
* email successfully. It just only means that the method used was able to | |
* process the request without any errors. | |
* | |
* Using the two 'wp_mail_from' and 'wp_mail_from_name' hooks allow from | |
* creating a from address like 'Name <email@address.com>' when both are set. If | |
* just 'wp_mail_from' is set, then just the email address will be used with no | |
* name. | |
* | |
* The default content type is 'text/plain' which does not allow using HTML. | |
* However, you can set the content type of the email by using the | |
* 'wp_mail_content_type' filter. | |
* | |
* The default charset is based on the charset used on the blog. The charset can | |
* be set using the 'wp_mail_charset' filter. | |
* | |
* @since 1.2.1 | |
* | |
* @uses PHPMailer | |
* | |
* @param string|array $to Array or comma-separated list of email addresses to send message. | |
* @param string $subject Email subject | |
* @param string $message Message contents | |
* @param string|array $headers Optional. Additional headers. | |
* @param string|array $attachments Optional. Files to attach. | |
* @param array $string_attachments Optional. Array of array('filename'=>'','body'=>'') of inline attachments. | |
* @return bool Whether the email contents were sent successfully. | |
*/ | |
function ionata_wp_mail( $to, $subject, $message, $headers = '', $attachments = array(), $string_attachments = array() ) { | |
// Compact the input, apply the filters, and extract them back out | |
/** | |
* Filter the wp_mail() arguments. | |
* | |
* @since 2.2.0 | |
* | |
* @param array $args A compacted array of wp_mail() arguments, including the "to" email, | |
* subject, message, headers, and attachments values. | |
*/ | |
$atts = apply_filters( 'ionata_wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments', 'string_attachments' ) ); | |
if ( isset( $atts['to'] ) ) { | |
$to = $atts['to']; | |
} | |
if ( isset( $atts['subject'] ) ) { | |
$subject = $atts['subject']; | |
} | |
if ( isset( $atts['message'] ) ) { | |
$message = $atts['message']; | |
} | |
if ( isset( $atts['headers'] ) ) { | |
$headers = $atts['headers']; | |
} | |
if ( isset( $atts['attachments'] ) ) { | |
$attachments = $atts['attachments']; | |
} | |
if ( isset( $atts['string_attachments'] ) ) { | |
$string_attachments = $atts['string_attachments']; | |
} | |
if ( ! is_array( $attachments ) ) { | |
$attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) ); | |
} | |
if ( ! is_array( $string_attachments ) ) { | |
$string_attachments = array(); | |
} | |
global $phpmailer; | |
// (Re)create it, if it's gone missing | |
if ( !is_object( $phpmailer ) || !is_a( $phpmailer, 'PHPMailer' ) ) { | |
require_once ABSPATH . WPINC . '/class-phpmailer.php'; | |
require_once ABSPATH . WPINC . '/class-smtp.php'; | |
$phpmailer = new PHPMailer( true ); | |
} | |
// Headers | |
if ( empty( $headers ) ) { | |
$headers = array(); | |
} else { | |
if ( !is_array( $headers ) ) { | |
// Explode the headers out, so this function can take both | |
// string headers and an array of headers. | |
$tempheaders = explode( "\n", str_replace( "\r\n", "\n", $headers ) ); | |
} else { | |
$tempheaders = $headers; | |
} | |
$headers = array(); | |
$cc = array(); | |
$bcc = array(); | |
// If it's actually got contents | |
if ( !empty( $tempheaders ) ) { | |
// Iterate through the raw headers | |
foreach ( (array) $tempheaders as $header ) { | |
if ( strpos($header, ':') === false ) { | |
if ( false !== stripos( $header, 'boundary=' ) ) { | |
$parts = preg_split('/boundary=/i', trim( $header ) ); | |
$boundary = trim( str_replace( array( "'", '"' ), '', $parts[1] ) ); | |
} | |
continue; | |
} | |
// Explode them out | |
list( $name, $content ) = explode( ':', trim( $header ), 2 ); | |
// Cleanup crew | |
$name = trim( $name ); | |
$content = trim( $content ); | |
switch ( strtolower( $name ) ) { | |
// Mainly for legacy -- process a From: header if it's there | |
case 'from': | |
if ( strpos($content, '<' ) !== false ) { | |
// So... making my life hard again? | |
$from_name = substr( $content, 0, strpos( $content, '<' ) - 1 ); | |
$from_name = str_replace( '"', '', $from_name ); | |
$from_name = trim( $from_name ); | |
$from_email = substr( $content, strpos( $content, '<' ) + 1 ); | |
$from_email = str_replace( '>', '', $from_email ); | |
$from_email = trim( $from_email ); | |
} else { | |
$from_email = trim( $content ); | |
} | |
break; | |
case 'content-type': | |
if ( strpos( $content, ';' ) !== false ) { | |
list( $type, $charset ) = explode( ';', $content ); | |
$content_type = trim( $type ); | |
if ( false !== stripos( $charset, 'charset=' ) ) { | |
$charset = trim( str_replace( array( 'charset=', '"' ), '', $charset ) ); | |
} elseif ( false !== stripos( $charset, 'boundary=' ) ) { | |
$boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset ) ); | |
$charset = ''; | |
} | |
} else { | |
$content_type = trim( $content ); | |
} | |
break; | |
case 'cc': | |
$cc = array_merge( (array) $cc, explode( ',', $content ) ); | |
break; | |
case 'bcc': | |
$bcc = array_merge( (array) $bcc, explode( ',', $content ) ); | |
break; | |
default: | |
// Add it to our grand headers array | |
$headers[trim( $name )] = trim( $content ); | |
break; | |
} | |
} | |
} | |
} | |
// Empty out the values that may be set | |
$phpmailer->ClearAllRecipients(); | |
$phpmailer->ClearAttachments(); | |
$phpmailer->ClearCustomHeaders(); | |
$phpmailer->ClearReplyTos(); | |
// From email and name | |
// If we don't have a name from the input headers | |
if ( !isset( $from_name ) ) | |
$from_name = 'WordPress'; | |
/* If we don't have an email from the input headers default to wordpress@$sitename | |
* Some hosts will block outgoing mail from this address if it doesn't exist but | |
* there's no easy alternative. Defaulting to admin_email might appear to be another | |
* option but some hosts may refuse to relay mail from an unknown domain. See | |
* http://trac.wordpress.org/ticket/5007. | |
*/ | |
if ( !isset( $from_email ) ) { | |
// Get the site domain and get rid of www. | |
$sitename = strtolower( $_SERVER['SERVER_NAME'] ); | |
if ( substr( $sitename, 0, 4 ) == 'www.' ) { | |
$sitename = substr( $sitename, 4 ); | |
} | |
$from_email = 'wordpress@' . $sitename; | |
} | |
/** | |
* Filter the email address to send from. | |
* | |
* @since 2.2.0 | |
* | |
* @param string $from_email Email address to send from. | |
*/ | |
$phpmailer->From = apply_filters( 'wp_mail_from', $from_email ); | |
/** | |
* Filter the name to associate with the "from" email address. | |
* | |
* @since 2.3.0 | |
* | |
* @param string $from_name Name associated with the "from" email address. | |
*/ | |
$phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name ); | |
// Set destination addresses | |
if ( !is_array( $to ) ) | |
$to = explode( ',', $to ); | |
foreach ( (array) $to as $recipient ) { | |
try { | |
// Break $recipient into name and address parts if in the format "Foo <bar@baz.com>" | |
$recipient_name = ''; | |
if( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) { | |
if ( count( $matches ) == 3 ) { | |
$recipient_name = $matches[1]; | |
$recipient = $matches[2]; | |
} | |
} | |
$phpmailer->AddAddress( $recipient, $recipient_name); | |
} catch ( phpmailerException $e ) { | |
continue; | |
} | |
} | |
// Set mail's subject and body | |
$phpmailer->Subject = $subject; | |
$phpmailer->Body = $message; | |
// Add any CC and BCC recipients | |
if ( !empty( $cc ) ) { | |
foreach ( (array) $cc as $recipient ) { | |
try { | |
// Break $recipient into name and address parts if in the format "Foo <bar@baz.com>" | |
$recipient_name = ''; | |
if( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) { | |
if ( count( $matches ) == 3 ) { | |
$recipient_name = $matches[1]; | |
$recipient = $matches[2]; | |
} | |
} | |
$phpmailer->AddCc( $recipient, $recipient_name ); | |
} catch ( phpmailerException $e ) { | |
continue; | |
} | |
} | |
} | |
if ( !empty( $bcc ) ) { | |
foreach ( (array) $bcc as $recipient) { | |
try { | |
// Break $recipient into name and address parts if in the format "Foo <bar@baz.com>" | |
$recipient_name = ''; | |
if( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) { | |
if ( count( $matches ) == 3 ) { | |
$recipient_name = $matches[1]; | |
$recipient = $matches[2]; | |
} | |
} | |
$phpmailer->AddBcc( $recipient, $recipient_name ); | |
} catch ( phpmailerException $e ) { | |
continue; | |
} | |
} | |
} | |
// Set to use PHP's mail() | |
$phpmailer->IsMail(); | |
// Set Content-Type and charset | |
// If we don't have a content-type from the input headers | |
if ( !isset( $content_type ) ) | |
$content_type = 'text/plain'; | |
/** | |
* Filter the wp_mail() content type. | |
* | |
* @since 2.3.0 | |
* | |
* @param string $content_type Default wp_mail() content type. | |
*/ | |
$content_type = apply_filters( 'wp_mail_content_type', $content_type ); | |
$phpmailer->ContentType = $content_type; | |
// Set whether it's plaintext, depending on $content_type | |
if ( 'text/html' == $content_type ) | |
$phpmailer->IsHTML( true ); | |
// If we don't have a charset from the input headers | |
if ( !isset( $charset ) ) | |
$charset = get_bloginfo( 'charset' ); | |
// Set the content-type and charset | |
/** | |
* Filter the default wp_mail() charset. | |
* | |
* @since 2.3.0 | |
* | |
* @param string $charset Default email charset. | |
*/ | |
$phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset ); | |
// Set custom headers | |
if ( !empty( $headers ) ) { | |
foreach( (array) $headers as $name => $content ) { | |
$phpmailer->AddCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) ); | |
} | |
if ( false !== stripos( $content_type, 'multipart' ) && ! empty($boundary) ) | |
$phpmailer->AddCustomHeader( sprintf( "Content-Type: %s;\n\t boundary=\"%s\"", $content_type, $boundary ) ); | |
} | |
if ( !empty( $attachments ) ) { | |
foreach ( $attachments as $attachment ) { | |
try { | |
$phpmailer->AddAttachment($attachment); | |
} catch ( phpmailerException $e ) { | |
continue; | |
} | |
} | |
} | |
//added this. Martin Svetlik | |
if ( !empty( $string_attachments ) ) { | |
foreach ( $string_attachments as $str_attachment ) { | |
try { | |
$phpmailer->AddStringAttachment($str_attachment[0], $str_attachment[1]); | |
} catch ( phpmailerException $e ) { | |
continue; | |
} | |
} | |
} | |
//end | |
/** | |
* Fires after PHPMailer is initialized. | |
* | |
* @since 2.2.0 | |
* | |
* @param PHPMailer &$phpmailer The PHPMailer instance, passed by reference. | |
*/ | |
do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) ); | |
// Send! | |
try { | |
return $phpmailer->Send(); | |
} catch ( phpmailerException $e ) { | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment