web/wp-mail.php
branchwordpress
changeset 109 03b0d1493584
child 132 4d4862461b8d
equal deleted inserted replaced
-1:000000000000 109:03b0d1493584
       
     1 <?php
       
     2 /**
       
     3  * Gets the email message from the user's mailbox to add as
       
     4  * a WordPress post. Mailbox connection information must be
       
     5  * configured under Settings > Writing
       
     6  *
       
     7  * @package WordPress
       
     8  */
       
     9 
       
    10 /** Make sure that the WordPress bootstrap has run before continuing. */
       
    11 require(dirname(__FILE__) . '/wp-load.php');
       
    12 
       
    13 /** Get the POP3 class with which to access the mailbox. */
       
    14 require_once( ABSPATH . WPINC . '/class-pop3.php' );
       
    15 
       
    16 $time_difference = get_option('gmt_offset') * 3600;
       
    17 
       
    18 $phone_delim = '::';
       
    19 
       
    20 $pop3 = new POP3();
       
    21 
       
    22 if ( ! $pop3->connect(get_option('mailserver_url'), get_option('mailserver_port') ) ||
       
    23 	! $pop3->user(get_option('mailserver_login')) ||
       
    24 	( ! $count = $pop3->pass(get_option('mailserver_pass')) ) ) {
       
    25 		$pop3->quit();
       
    26 		wp_die( ( 0 === $count ) ? __('There doesn&#8217;t seem to be any new mail.') : esc_html($pop3->ERROR) );
       
    27 }
       
    28 
       
    29 for ( $i = 1; $i <= $count; $i++ ) {
       
    30 
       
    31 	$message = $pop3->get($i);
       
    32 
       
    33 	$bodysignal = false;
       
    34 	$boundary = '';
       
    35 	$charset = '';
       
    36 	$content = '';
       
    37 	$content_type = '';
       
    38 	$content_transfer_encoding = '';
       
    39 	$post_author = 1;
       
    40 	$author_found = false;
       
    41 	$dmonths = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
       
    42 	foreach ($message as $line) {
       
    43 		// body signal
       
    44 		if ( strlen($line) < 3 )
       
    45 			$bodysignal = true;
       
    46 		if ( $bodysignal ) {
       
    47 			$content .= $line;
       
    48 		} else {
       
    49 			if ( preg_match('/Content-Type: /i', $line) ) {
       
    50 				$content_type = trim($line);
       
    51 				$content_type = substr($content_type, 14, strlen($content_type) - 14);
       
    52 				$content_type = explode(';', $content_type);
       
    53 				if ( ! empty( $content_type[1] ) ) {
       
    54 					$charset = explode('=', $content_type[1]);
       
    55 					$charset = ( ! empty( $charset[1] ) ) ? trim($charset[1]) : '';
       
    56 				}
       
    57 				$content_type = $content_type[0];
       
    58 			}
       
    59 			if ( preg_match('/Content-Transfer-Encoding: /i', $line) ) {
       
    60 				$content_transfer_encoding = trim($line);
       
    61 				$content_transfer_encoding = substr($content_transfer_encoding, 27, strlen($content_transfer_encoding) - 27);
       
    62 				$content_transfer_encoding = explode(';', $content_transfer_encoding);
       
    63 				$content_transfer_encoding = $content_transfer_encoding[0];
       
    64 			}
       
    65 			if ( ( $content_type == 'multipart/alternative' ) && ( false !== strpos($line, 'boundary="') ) && ( '' == $boundary ) ) {
       
    66 				$boundary = trim($line);
       
    67 				$boundary = explode('"', $boundary);
       
    68 				$boundary = $boundary[1];
       
    69 			}
       
    70 			if (preg_match('/Subject: /i', $line)) {
       
    71 				$subject = trim($line);
       
    72 				$subject = substr($subject, 9, strlen($subject) - 9);
       
    73 				// Captures any text in the subject before $phone_delim as the subject
       
    74 				if ( function_exists('iconv_mime_decode') ) {
       
    75 					$subject = iconv_mime_decode($subject, 2, get_option('blog_charset'));
       
    76 				} else {
       
    77 					$subject = wp_iso_descrambler($subject);
       
    78 				}
       
    79 				$subject = explode($phone_delim, $subject);
       
    80 				$subject = $subject[0];
       
    81 			}
       
    82 
       
    83 			// Set the author using the email address (From or Reply-To, the last used)
       
    84 			// otherwise use the site admin
       
    85 			if ( preg_match('/(From|Reply-To): /', $line) )  {
       
    86 				if ( preg_match('|[a-z0-9_.-]+@[a-z0-9_.-]+(?!.*<)|i', $line, $matches) )
       
    87 					$author = $matches[0];
       
    88 				else
       
    89 					$author = trim($line);
       
    90 				$author = sanitize_email($author);
       
    91 				if ( is_email($author) ) {
       
    92 					echo '<p>' . sprintf(__('Author is %s'), $author) . '</p>';
       
    93 					$userdata = get_user_by_email($author);
       
    94 					if ( empty($userdata) ) {
       
    95 						$author_found = false;
       
    96 					} else {
       
    97 						$post_author = $userdata->ID;
       
    98 						$author_found = true;
       
    99 					}
       
   100 				} else {
       
   101 					$author_found = false;
       
   102 				}
       
   103 			}
       
   104 
       
   105 			if (preg_match('/Date: /i', $line)) { // of the form '20 Mar 2002 20:32:37'
       
   106 				$ddate = trim($line);
       
   107 				$ddate = str_replace('Date: ', '', $ddate);
       
   108 				if (strpos($ddate, ',')) {
       
   109 					$ddate = trim(substr($ddate, strpos($ddate, ',') + 1, strlen($ddate)));
       
   110 				}
       
   111 				$date_arr = explode(' ', $ddate);
       
   112 				$date_time = explode(':', $date_arr[3]);
       
   113 
       
   114 				$ddate_H = $date_time[0];
       
   115 				$ddate_i = $date_time[1];
       
   116 				$ddate_s = $date_time[2];
       
   117 
       
   118 				$ddate_m = $date_arr[1];
       
   119 				$ddate_d = $date_arr[0];
       
   120 				$ddate_Y = $date_arr[2];
       
   121 				for ( $j = 0; $j < 12; $j++ ) {
       
   122 					if ( $ddate_m == $dmonths[$j] ) {
       
   123 						$ddate_m = $j+1;
       
   124 					}
       
   125 				}
       
   126 
       
   127 				$time_zn = intval($date_arr[4]) * 36;
       
   128 				$ddate_U = gmmktime($ddate_H, $ddate_i, $ddate_s, $ddate_m, $ddate_d, $ddate_Y);
       
   129 				$ddate_U = $ddate_U - $time_zn;
       
   130 				$post_date = gmdate('Y-m-d H:i:s', $ddate_U + $time_difference);
       
   131 				$post_date_gmt = gmdate('Y-m-d H:i:s', $ddate_U);
       
   132 			}
       
   133 		}
       
   134 	}
       
   135 
       
   136 	// Set $post_status based on $author_found and on author's publish_posts capability
       
   137 	if ( $author_found ) {
       
   138 		$user = new WP_User($post_author);
       
   139 		$post_status = ( $user->has_cap('publish_posts') ) ? 'publish' : 'pending';
       
   140 	} else {
       
   141 		// Author not found in DB, set status to pending.  Author already set to admin.
       
   142 		$post_status = 'pending';
       
   143 	}
       
   144 
       
   145 	$subject = trim($subject);
       
   146 
       
   147 	if ( $content_type == 'multipart/alternative' ) {
       
   148 		$content = explode('--'.$boundary, $content);
       
   149 		$content = $content[2];
       
   150 		// match case-insensitive content-transfer-encoding
       
   151 		if ( preg_match( '/Content-Transfer-Encoding: quoted-printable/i', $content, $delim) ) {
       
   152 			$content = explode($delim[0], $content);
       
   153 			$content = $content[1];
       
   154 		}
       
   155 		$content = strip_tags($content, '<img><p><br><i><b><u><em><strong><strike><font><span><div>');
       
   156 	}
       
   157 	$content = trim($content);
       
   158 
       
   159 	//Give Post-By-Email extending plugins full access to the content
       
   160 	//Either the raw content or the content of the last quoted-printable section
       
   161 	$content = apply_filters('wp_mail_original_content', $content);
       
   162 
       
   163 	if ( false !== stripos($content_transfer_encoding, "quoted-printable") ) {
       
   164 		$content = quoted_printable_decode($content);
       
   165 	}
       
   166 
       
   167 	if ( function_exists('iconv') && ! empty( $charset ) ) {
       
   168 		$content = iconv($charset, get_option('blog_charset'), $content);
       
   169 	}
       
   170 
       
   171 	// Captures any text in the body after $phone_delim as the body
       
   172 	$content = explode($phone_delim, $content);
       
   173 	$content = empty( $content[1] ) ? $content[0] : $content[1];
       
   174 
       
   175 	$content = trim($content);
       
   176 
       
   177 	$post_content = apply_filters('phone_content', $content);
       
   178 
       
   179 	$post_title = xmlrpc_getposttitle($content);
       
   180 
       
   181 	if ($post_title == '') $post_title = $subject;
       
   182 
       
   183 	$post_category = array(get_option('default_email_category'));
       
   184 
       
   185 	$post_data = compact('post_content','post_title','post_date','post_date_gmt','post_author','post_category', 'post_status');
       
   186 	$post_data = add_magic_quotes($post_data);
       
   187 
       
   188 	$post_ID = wp_insert_post($post_data);
       
   189 	if ( is_wp_error( $post_ID ) )
       
   190 		echo "\n" . $post_ID->get_error_message();
       
   191 
       
   192 	// We couldn't post, for whatever reason. Better move forward to the next email.
       
   193 	if ( empty( $post_ID ) )
       
   194 		continue;
       
   195 
       
   196 	do_action('publish_phone', $post_ID);
       
   197 
       
   198 	echo "\n<p>" . sprintf(__('<strong>Author:</strong> %s'), esc_html($post_author)) . '</p>';
       
   199 	echo "\n<p>" . sprintf(__('<strong>Posted title:</strong> %s'), esc_html($post_title)) . '</p>';
       
   200 
       
   201 	if(!$pop3->delete($i)) {
       
   202 		echo '<p>' . sprintf(__('Oops: %s'), esc_html($pop3->ERROR)) . '</p>';
       
   203 		$pop3->reset();
       
   204 		exit;
       
   205 	} else {
       
   206 		echo '<p>' . sprintf(__('Mission complete.  Message <strong>%s</strong> deleted.'), $i) . '</p>';
       
   207 	}
       
   208 
       
   209 }
       
   210 
       
   211 $pop3->quit();
       
   212 
       
   213 ?>