Created
September 20, 2015 19:21
-
-
Save jbrinley/58e66bf5f09e590a29ab to your computer and use it in GitHub Desktop.
Send all WP emails to text files in the uploads directory
This file contains hidden or 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 | |
/* | |
Plugin Name: Mail to Text | |
Description: Sends all WP emails to text files in the uploads directory | |
*/ | |
if ( !function_exists( 'wp_mail' ) ) : | |
/** | |
* 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 protected]>' 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. | |
* @return bool Whether the email contents were sent successfully. | |
*/ | |
function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) { | |
static $increment = 0; | |
// 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( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', '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']; | |
} | |
// 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': | |
$bracket_pos = strpos( $content, '<' ); | |
if ( $bracket_pos !== false ) { | |
// Text before the bracketed email is the "From" name. | |
if ( $bracket_pos > 0 ) { | |
$from_name = substr( $content, 0, $bracket_pos - 1 ); | |
$from_name = str_replace( '"', '', $from_name ); | |
$from_name = trim( $from_name ); | |
} | |
$from_email = substr( $content, $bracket_pos + 1 ); | |
$from_email = str_replace( '>', '', $from_email ); | |
$from_email = trim( $from_email ); | |
// Avoid setting an empty $from_email. | |
} elseif ( '' !== trim( $content ) ) { | |
$from_email = trim( $content ); | |
} | |
break; | |
case 'content-type': | |
if ( strpos( $content, ';' ) !== false ) { | |
list( $type, $charset_content ) = explode( ';', $content ); | |
$content_type = trim( $type ); | |
if ( false !== stripos( $charset_content, 'charset=' ) ) { | |
$charset = trim( str_replace( array( 'charset=', '"' ), '', $charset_content ) ); | |
} elseif ( false !== stripos( $charset_content, 'boundary=' ) ) { | |
$boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset_content ) ); | |
$charset = ''; | |
} | |
// Avoid setting an empty $content_type. | |
} elseif ( '' !== trim( $content ) ) { | |
$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; | |
} | |
} | |
} | |
} | |
// 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 | |
* https://core.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. | |
*/ | |
$from_email = 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. | |
*/ | |
$from_name = apply_filters( 'wp_mail_from_name', $from_name ); | |
// Set destination addresses | |
if ( !is_array( $to ) ) { | |
$to = explode( ',', $to ); | |
} | |
// $from_email | |
// $from_name | |
// $to | |
// $subject | |
// $message | |
// $cc | |
// $bcc | |
$upload_dir = wp_upload_dir(); | |
$mail_dir = trailingslashit( $upload_dir['basedir'] ) . 'emails/'; | |
wp_mkdir_p( $mail_dir ); | |
$timestamp = date( 'Ymd.His'); | |
$filename = $timestamp . '.' . $increment++ . '.txt'; | |
$file = new SplFileObject( $mail_dir . $filename, 'w' ); | |
$file->fwrite( sprintf( "Subject: %s\n", $subject ) ); | |
$file->fwrite( sprintf( "From: %s <%s>\n", $from_name, $from_email ) ); | |
$file->fwrite( sprintf( "To: %s\n", implode(', ', $to ) ) ); | |
if ( !empty( $cc ) ) { | |
$file->fwrite( sprintf( "Cc: %s\n", implode(', ', $cc ) ) ); | |
} | |
if ( !empty( $bcc ) ) { | |
$file->fwrite( sprintf( "Bcc: %s\n", implode(', ', $bcc ) ) ); | |
} | |
foreach( $headers as $key => $value ) { | |
$file->fwrite( sprintf( "%s: %s\n", $key, $value ) ); | |
} | |
$file->fwrite( sprintf( "\n\n%s\n", $message ) ); | |
$file = null; | |
} | |
endif; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment