X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/wordpress.git/blobdiff_plain/022dfbbbe3215917d84708eb09acca93b21ae9e0..6c8f14c09105d0afa4c1574215c59b5021040e76:/wp-mail.php
diff --git a/wp-mail.php b/wp-mail.php
index 5fb178fa..5685b3ac 100644
--- a/wp-mail.php
+++ b/wp-mail.php
@@ -1,96 +1,144 @@
Writing
+ *
+ * @package WordPress
+ */
-require_once(ABSPATH.WPINC.'/class-pop3.php');
+/** Make sure that the WordPress bootstrap has run before continuing. */
+require(dirname(__FILE__) . '/wp-load.php');
-error_reporting(2037);
+if ( ! apply_filters( 'enable_post_by_email_configuration', true ) )
+ wp_die( __( 'This action has been disabled by the administrator.' ) );
-$time_difference = get_settings('gmt_offset') * 3600;
+/** Allow a plugin to do a complete takeover of Post by Email **/
+do_action('wp-mail.php');
+
+/** Get the POP3 class with which to access the mailbox. */
+require_once( ABSPATH . WPINC . '/class-pop3.php' );
+
+/** Only check at this interval for new messages. */
+if ( !defined('WP_MAIL_INTERVAL') )
+ define('WP_MAIL_INTERVAL', 300); // 5 minutes
+
+$last_checked = get_transient('mailserver_last_checked');
+
+if ( $last_checked )
+ wp_die(__('Slow down cowboy, no need to check for new mails so often!'));
+
+set_transient('mailserver_last_checked', true, WP_MAIL_INTERVAL);
+
+$time_difference = get_option('gmt_offset') * HOUR_IN_SECONDS;
$phone_delim = '::';
$pop3 = new POP3();
-if (!$pop3->connect(get_settings('mailserver_url'), get_settings('mailserver_port'))) :
- echo "Ooops $pop3->ERROR
\n";
- exit;
-endif;
+if ( !$pop3->connect( get_option('mailserver_url'), get_option('mailserver_port') ) || !$pop3->user( get_option('mailserver_login') ) )
+ wp_die( esc_html( $pop3->ERROR ) );
+
+$count = $pop3->pass( get_option('mailserver_pass') );
-$count = $pop3->login(get_settings('mailserver_login'), get_settings('mailserver_pass'));
-if (0 == $count) die(__('There doesn’t seem to be any new mail.'));
+if( false === $count )
+ wp_die( esc_html( $pop3->ERROR ) );
+if( 0 === $count ) {
+ $pop3->quit();
+ wp_die( __('There doesn’t seem to be any new mail.') );
+}
-for ($i=1; $i <= $count; $i++) :
+for ( $i = 1; $i <= $count; $i++ ) {
$message = $pop3->get($i);
+ $bodysignal = false;
+ $boundary = '';
+ $charset = '';
$content = '';
$content_type = '';
- $boundary = '';
- $bodysignal = 0;
- $dmonths = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
- 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
- foreach ($message as $line) :
- if (strlen($line) < 3) $bodysignal = 1;
-
- if ($bodysignal) {
+ $content_transfer_encoding = '';
+ $post_author = 1;
+ $author_found = false;
+ $dmonths = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
+ foreach ($message as $line) {
+ // body signal
+ if ( strlen($line) < 3 )
+ $bodysignal = true;
+ if ( $bodysignal ) {
$content .= $line;
} else {
- if (preg_match('/Content-Type: /i', $line)) {
+ if ( preg_match('/Content-Type: /i', $line) ) {
$content_type = trim($line);
- $content_type = substr($content_type, 14, strlen($content_type)-14);
+ $content_type = substr($content_type, 14, strlen($content_type) - 14);
$content_type = explode(';', $content_type);
+ if ( ! empty( $content_type[1] ) ) {
+ $charset = explode('=', $content_type[1]);
+ $charset = ( ! empty( $charset[1] ) ) ? trim($charset[1]) : '';
+ }
$content_type = $content_type[0];
}
- if (($content_type == 'multipart/alternative') && (preg_match('/boundary="/', $line)) && ($boundary == '')) {
+ if ( preg_match('/Content-Transfer-Encoding: /i', $line) ) {
+ $content_transfer_encoding = trim($line);
+ $content_transfer_encoding = substr($content_transfer_encoding, 27, strlen($content_transfer_encoding) - 27);
+ $content_transfer_encoding = explode(';', $content_transfer_encoding);
+ $content_transfer_encoding = $content_transfer_encoding[0];
+ }
+ if ( ( $content_type == 'multipart/alternative' ) && ( false !== strpos($line, 'boundary="') ) && ( '' == $boundary ) ) {
$boundary = trim($line);
$boundary = explode('"', $boundary);
$boundary = $boundary[1];
}
if (preg_match('/Subject: /i', $line)) {
$subject = trim($line);
- $subject = substr($subject, 9, strlen($subject)-9);
- $subject = wp_iso_descrambler($subject);
+ $subject = substr($subject, 9, strlen($subject) - 9);
// Captures any text in the subject before $phone_delim as the subject
+ if ( function_exists('iconv_mime_decode') ) {
+ $subject = iconv_mime_decode($subject, 2, get_option('blog_charset'));
+ } else {
+ $subject = wp_iso_descrambler($subject);
+ }
$subject = explode($phone_delim, $subject);
$subject = $subject[0];
}
- // Set the author using the email address (To or Reply-To, the last used)
+ // Set the author using the email address (From or Reply-To, the last used)
// otherwise use the site admin
- if (preg_match('/From: /', $line) | preg_match('/Reply-To: /', $line)) {
- $author=trim($line);
- if ( ereg("([a-zA-Z0-9\_\-\.]+@[\a-zA-z0-9\_\-\.]+)", $author , $regs) ) {
- $author = $regs[1];
- echo "Author = {$author}
"; - $author = $wpdb->escape($author); - $result = $wpdb->get_row("SELECT ID FROM $wpdb->users WHERE user_email='$author' LIMIT 1"); - if (!$result) - $post_author = 1; + if ( ! $author_found && preg_match( '/^(From|Reply-To): /', $line ) ) { + if ( preg_match('|[a-z0-9_.-]+@[a-z0-9_.-]+(?!.*<)|i', $line, $matches) ) + $author = $matches[0]; else - $post_author = $result->ID; - } else - $post_author = 1; + $author = trim($line); + $author = sanitize_email($author); + if ( is_email($author) ) { + echo '
' . sprintf(__('Author is %s'), $author) . '
'; + $userdata = get_user_by('email', $author); + if ( ! empty( $userdata ) ) { + $post_author = $userdata->ID; + $author_found = true; + } + } } if (preg_match('/Date: /i', $line)) { // of the form '20 Mar 2002 20:32:37' $ddate = trim($line); $ddate = str_replace('Date: ', '', $ddate); if (strpos($ddate, ',')) { - $ddate = trim(substr($ddate, strpos($ddate, ',')+1, strlen($ddate))); + $ddate = trim(substr($ddate, strpos($ddate, ',') + 1, strlen($ddate))); } $date_arr = explode(' ', $ddate); $date_time = explode(':', $date_arr[3]); - + $ddate_H = $date_time[0]; $ddate_i = $date_time[1]; $ddate_s = $date_time[2]; - + $ddate_m = $date_arr[1]; $ddate_d = $date_arr[0]; $ddate_Y = $date_arr[2]; - for ($j=0; $j<12; $j++) { - if ($ddate_m == $dmonths[$j]) { + for ( $j = 0; $j < 12; $j++ ) { + if ( $ddate_m == $dmonths[$j] ) { $ddate_m = $j+1; } } @@ -102,23 +150,46 @@ for ($i=1; $i <= $count; $i++) : $post_date_gmt = gmdate('Y-m-d H:i:s', $ddate_U); } } - endforeach; + } + + // Set $post_status based on $author_found and on author's publish_posts capability + if ( $author_found ) { + $user = new WP_User($post_author); + $post_status = ( $user->has_cap('publish_posts') ) ? 'publish' : 'pending'; + } else { + // Author not found in DB, set status to pending. Author already set to admin. + $post_status = 'pending'; + } - $subject = trim(str_replace(get_settings('subjectprefix'), '', $subject)); + $subject = trim($subject); - if ($content_type == 'multipart/alternative') { + if ( $content_type == 'multipart/alternative' ) { $content = explode('--'.$boundary, $content); $content = $content[2]; - $content = explode('Content-Transfer-Encoding: quoted-printable', $content); - $content = strip_tags($content[1], 'Content-type: $content_type, boundary: $boundary Raw content: Author: $post_author Posted title: $post_title " . sprintf(__('Author: %s'), esc_html($post_author)) . ' " . sprintf(__('Posted title: %s'), esc_html($post_title)) . ' Oops '.$pop3->ERROR.' ' . sprintf(__('Oops: %s'), esc_html($pop3->ERROR)) . ' Mission complete, message $i deleted. ' . sprintf(__('Mission complete. Message %s deleted.'), $i) . '".$content.'
';
+ $content = empty( $content[1] ) ? $content[0] : $content[1];
$content = trim($content);
@@ -128,39 +199,32 @@ for ($i=1; $i <= $count; $i++) :
if ($post_title == '') $post_title = $subject;
- if (empty($post_categories)) $post_categories[] = get_settings('default_email_category');
-
- $post_category = $post_categories;
-
- // or maybe we should leave the choice to email drafts? propose a way
- $post_status = 'publish';
+ $post_category = array(get_option('default_email_category'));
$post_data = compact('post_content','post_title','post_date','post_date_gmt','post_author','post_category', 'post_status');
$post_data = add_magic_quotes($post_data);
$post_ID = wp_insert_post($post_data);
+ if ( is_wp_error( $post_ID ) )
+ echo "\n" . $post_ID->get_error_message();
- if (!$post_ID) {
- // we couldn't post, for whatever reason. better move forward to the next email
+ // We couldn't post, for whatever reason. Better move forward to the next email.
+ if ( empty( $post_ID ) )
continue;
- }
do_action('publish_phone', $post_ID);
- echo "\n
";
- echo "\nPosted content:".$content.'
';
+ echo "\n