WordPress.org

Make WordPress Core

Ticket #4338: 4338.diff

File 4338.diff, 10.3 KB (added by rob1n, 8 years ago)
  • wp-mail.php

     
    11<?php 
    2 require(dirname(__FILE__) . '/wp-config.php'); 
    32 
    4 require_once(ABSPATH.WPINC.'/class-pop3.php'); 
     3require_once dirname( __FILE__ ) . '/wp-config.php'; 
     4require_once ABSPATH . WPINC . '/class-pop3.php'; 
    55 
    6 error_reporting(2037); 
     6if ( get_option( 'mailserver_url' ) == 'mail.example.org' || get_option( 'mailserver_login' ) == 'login@example.com' ) { 
     7        wp_die( __( 'Please set up the email options in the administration before accessing this file.' ) ); 
     8} 
    79 
    8 $time_difference = get_option('gmt_offset') * 3600; 
    9  
    10 $phone_delim = '::'; 
    11  
    1210$pop3 = new POP3(); 
    1311 
    14 if (!$pop3->connect(get_option('mailserver_url'), get_option('mailserver_port'))) 
    15         wp_die($pop3->ERROR); 
     12if ( !$pop3->connect( get_option( 'mailserver_url' ), get_option( 'mailserver_port' ) ) ) { 
     13        wp_die( __( 'Could not connect to the mail server. Please check your settings and try again.' ) ); 
     14} 
    1615 
    17 $count = $pop3->login(get_option('mailserver_login'), get_option('mailserver_pass')); 
    18 if (0 == $count) wp_die(__('There doesn&#8217;t seem to be any new mail.')); 
     16$count = (int) $pop3->login( get_option( 'mailserver_login' ), get_option( 'mailserver_pass' ) ); 
    1917 
     18if ( $count <= 0 ) { 
     19        wp_die( __( 'There doesn&#8217;t seem to be any new mail.' ) ); 
     20} 
    2021 
    21 for ($i=1; $i <= $count; $i++) : 
     22$dmonths = array( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ); 
     23$time_difference = intval( get_option( 'gmt_offset' ) ) * 3600; 
    2224 
    23         $message = $pop3->get($i); 
    24  
     25for ( $_i = 1; $_i <= $count; $_i++ ) { 
     26        $message = $pop3->get( $_i ); 
     27         
    2528        $content = ''; 
    2629        $content_type = ''; 
    27         $content_transfer_encoding = ''; 
     30        $content_tranfer_encoding = ''; 
    2831        $boundary = ''; 
    29         $bodysignal = 0; 
    30         $dmonths = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); 
    31         foreach ($message as $line) : 
    32                 if (strlen($line) < 3) $bodysignal = 1; 
    33  
    34                 if ($bodysignal) { 
     32         
     33        $bodysignal = false; 
     34         
     35        foreach ( $message as $line ) { 
     36                if ( strlen( $line ) < 3 ) { 
     37                        $bodysignal = true; 
     38                        continue; 
     39                } 
     40                 
     41                if ( $bodysignal ) { 
    3542                        $content .= $line; 
    36                 } else { 
    37                         if (preg_match('/Content-Type: /i', $line)) { 
    38                                 $content_type = trim($line); 
    39                                 $content_type = substr($content_type, 14, strlen($content_type)-14); 
    40                                 $content_type = explode(';', $content_type); 
    41                                 $content_type = $content_type[0]; 
    42                         } 
    43                         if (preg_match('/Content-Transfer-Encoding: /i', $line)) { 
    44                                 $content_transfer_encoding = trim($line); 
    45                                 $content_transfer_encoding = substr($content_transfer_encoding, 27, strlen($content_transfer_encoding)-14); 
    46                                 $content_transfer_encoding = explode(';', $content_transfer_encoding); 
    47                                 $content_transfer_encoding = $content_transfer_encoding[0]; 
    48                         } 
    49                         if (($content_type == 'multipart/alternative') && (preg_match('/boundary="/', $line)) && ($boundary == '')) { 
    50                                 $boundary = trim($line); 
    51                                 $boundary = explode('"', $boundary); 
    52                                 $boundary = $boundary[1]; 
    53                         } 
    54                         if (preg_match('/Subject: /i', $line)) { 
    55                                 $subject = trim($line); 
    56                                 $subject = substr($subject, 9, strlen($subject)-9); 
    57                                 $subject = wp_iso_descrambler($subject); 
    58                                 // Captures any text in the subject before $phone_delim as the subject 
    59                                 $subject = explode($phone_delim, $subject); 
    60                                 $subject = $subject[0]; 
    61                         } 
    62  
    63                         // Set the author using the email address (To or Reply-To, the last used) 
    64                         // otherwise use the site admin 
    65                         if (preg_match('/From: /', $line) | preg_match('/Reply-To: /', $line))  { 
    66                                 $author=trim($line); 
    67                         if ( ereg("([a-zA-Z0-9\_\-\.]+@[\a-zA-z0-9\_\-\.]+)", $author , $regs) ) { 
    68                                 $author = $regs[1]; 
    69                                 echo "Author = {$author} <p>"; 
    70                                 $author = $wpdb->escape($author); 
    71                                 $result = $wpdb->get_row("SELECT ID FROM $wpdb->users WHERE user_email='$author' LIMIT 1"); 
    72                                 if (!$result) 
    73                                         $post_author = 1; 
    74                                 else 
     43                        continue; 
     44                } 
     45                 
     46                if ( strtolower( substr( $line, 0, 14 ) ) == 'content-type: ' ) { 
     47                        $content_type = trim( $line ); 
     48                        list( $content_type, ) = explode( ';', substr( $content_type, 14 ), 2 ); 
     49                } 
     50                 
     51                elseif ( strtolower( substr( $line, 0, 27 ) ) == 'content-transfer-encoding: ' ) { 
     52                        $content_transfer_encoding = trim( $line ); 
     53                        list( $content_transfer_encoding, ) = explode( ';', substr( $content_transfer_encoding, 27 ), 2 ); 
     54                } 
     55                 
     56                elseif ( $content_type == 'multipart/alternative' && ( strpos( $line, 'boundary="' ) !== false && $boundary == '' ) ) { 
     57                        $boundary = trim( $line ); 
     58                        list( , $boundary ) = explode( '"', $boundary ); 
     59                } 
     60                 
     61                elseif ( strtolower( substr( $line, 0, 9 ) ) == 'subject: ' ) { 
     62                        $subject = trim( $line ); 
     63                        list( $subject, ) = explode( '::', wp_iso_descrambler( substr( $subject, 9 ) ), 2 ); 
     64                } 
     65                 
     66                elseif ( strtolower( substr( $line, 0, 6 ) ) == 'from: ' || strtolower( substr( $line, 0, 10 ) ) == 'reply-to: ' ) { 
     67                        $author = trim( $line ); 
     68                         
     69                        if ( eregi( '([a-z0-9\_\-\.]+@[a-z0-9\_\-\.]+)', $author, $regs ) ) { 
     70                                $author = $wpdb->escape( $regs[1] ); 
     71                                 
     72                                if ( $result = $wpdb->get_row( "SELECT ID FROM $wpdb->users WHERE user_email = '$author' LIMIT 1" ) ) { 
    7573                                        $post_author = $result->ID; 
    76                         } else 
     74                                } else { 
     75                                        $post_author = 1; 
     76                                } 
     77                        } else { 
    7778                                $post_author = 1; 
    7879                        } 
    79  
    80                         if (preg_match('/Date: /i', $line)) { // of the form '20 Mar 2002 20:32:37' 
    81                                 $ddate = trim($line); 
    82                                 $ddate = str_replace('Date: ', '', $ddate); 
    83                                 if (strpos($ddate, ',')) { 
    84                                         $ddate = trim(substr($ddate, strpos($ddate, ',')+1, strlen($ddate))); 
    85                                 } 
    86                                 $date_arr = explode(' ', $ddate); 
    87                                 $date_time = explode(':', $date_arr[3]); 
    88  
    89                                 $ddate_H = $date_time[0]; 
    90                                 $ddate_i = $date_time[1]; 
    91                                 $ddate_s = $date_time[2]; 
    92  
    93                                 $ddate_m = $date_arr[1]; 
    94                                 $ddate_d = $date_arr[0]; 
    95                                 $ddate_Y = $date_arr[2]; 
    96                                 for ($j=0; $j<12; $j++) { 
    97                                         if ($ddate_m == $dmonths[$j]) { 
    98                                                 $ddate_m = $j+1; 
    99                                         } 
    100                                 } 
    101  
    102                                 $time_zn = intval($date_arr[4]) * 36; 
    103                                 $ddate_U = gmmktime($ddate_H, $ddate_i, $ddate_s, $ddate_m, $ddate_d, $ddate_Y); 
    104                                 $ddate_U = $ddate_U - $time_zn; 
    105                                 $post_date = gmdate('Y-m-d H:i:s', $ddate_U + $time_difference); 
    106                                 $post_date_gmt = gmdate('Y-m-d H:i:s', $ddate_U); 
     80                } 
     81                 
     82                elseif ( strtolower( substr( $line, 0, 6 ) ) == 'date: ' ) { 
     83                        $date = trim( preg_replace( '/date: /i', '', $line ) ); // Use regex because str_ireplace is PHP 5-only. 
     84                         
     85                        if ( strpos( $date, ',' ) !== false ) { 
     86                                $date = trim( substr( $date, strpos( $date, ',' ) +1 ) ); 
    10787                        } 
     88                         
     89                        list( $day, $month, $year, $time, $offset ) = explode( ' ', $date ); 
     90                        list( $hour, $minute, $second ) = explode( ':', $time ); 
     91                         
     92                        if ( ( $_k = array_search( $month, $dmonths ) ) !== false ) { 
     93                                $month = $_k + 1; 
     94                        } else { 
     95                                $month = (int) date( 'n' ); 
     96                        } 
     97                         
     98                        $timestamp_gmt = gmmktime( $hour, $minute, $second, $month, $day, $year ) - ( intval( $offset ) * 36 ); 
     99                         
     100                        $post_date = gmdate( 'Y-m-d H:i:s', $timestamp_gmt + $time_difference ); 
     101                        $post_date_gmt = gmdate( 'Y-m-d H:i:s', $timestamp_gmt ); 
    108102                } 
    109         endforeach; 
    110  
    111         $subject = trim(str_replace(get_option('subjectprefix'), '', $subject)); 
    112  
    113         if ($content_type == 'multipart/alternative') { 
    114                 $content = explode('--'.$boundary, $content); 
    115                 $content = $content[2]; 
    116                 $content = explode('Content-Transfer-Encoding: quoted-printable', $content); 
    117                 $content = strip_tags($content[1], '<img><p><br><i><b><u><em><strong><strike><font><span><div>'); 
    118103        } 
    119         $content = trim($content); 
    120104         
    121         if (stripos($content_transfer_encoding, "quoted-printable") !== false) { 
    122                 $content = quoted_printable_decode($content); 
     105        if ( $content_type == 'multipart/alternative' ) { 
     106                list( , , $content ) = explode( '--' . $boundary, $content ); 
     107                list( , $content ) = explode( 'Content-Transfer-Encoding: quoted-printable', $content ); 
    123108        } 
    124  
    125         // Captures any text in the body after $phone_delim as the body 
    126         $content = explode($phone_delim, $content); 
    127         $content[1] ? $content = $content[1] : $content = $content[0]; 
    128  
    129         echo "<p><b>Content-type:</b> $content_type, <b>Content-Transfer-Encoding:</b> $content_transfer_encoding, <b>boundary:</b> $boundary</p>\n"; 
    130         echo "<p><b>Raw content:</b><br /><pre>".$content.'</pre></p>'; 
    131  
    132         $content = trim($content); 
    133  
    134         $post_content = apply_filters('phone_content', $content); 
    135  
    136         $post_title = xmlrpc_getposttitle($content); 
    137  
    138         if ($post_title == '') $post_title = $subject; 
    139  
    140         if (empty($post_categories)) $post_categories[] = get_option('default_email_category'); 
    141  
    142         $post_category = $post_categories; 
    143  
    144         // or maybe we should leave the choice to email drafts? propose a way 
     109         
     110        $content = trim( $content ); 
     111         
     112        if ( stripos( $content_transfer_encoding, 'quoted-printable' ) !== false ) { 
     113                $content = quoted_printable_decode( $content ); 
     114        } 
     115         
     116        $content = (array) explode( '::', $content ); 
     117         
     118        if ( $content[1] ) { 
     119                $content = $content[1]; 
     120        } else { 
     121                $content = $content[0]; 
     122        } 
     123         
     124        $post_content = trim( $content ); 
     125         
     126        $post_title = xmlrpc_getposttitle( $content ); 
     127         
     128        if ( $post_title == '' ) { 
     129                $post_title = $subject; 
     130        } 
     131         
     132        $post_category = array( get_option( 'default_email_category' ) ); 
     133         
    145134        $post_status = 'publish'; 
    146  
    147         $post_data = compact('post_content','post_title','post_date','post_date_gmt','post_author','post_category', 'post_status'); 
    148         $post_data = add_magic_quotes($post_data); 
    149  
    150         $post_ID = wp_insert_post($post_data); 
    151  
    152         if (!$post_ID) { 
    153                 // we couldn't post, for whatever reason. better move forward to the next email 
     135         
     136        $postdata = compact( 'post_content', 'post_title', 'post_category', 'post_author', 'post_date', 'post_date_gmt', 'post_status' ); 
     137        $post_ID = wp_insert_post( $postdata ); 
     138         
     139        if ( !$post_ID ) { 
    154140                continue; 
    155141        } 
    156  
    157         do_action('publish_phone', $post_ID); 
    158  
    159         echo "\n<p><b>Author:</b> $post_author</p>"; 
    160         echo "\n<p><b>Posted title:</b> $post_title<br />"; 
    161         echo "\n<b>Posted content:</b><br /><pre>".$content.'</pre></p>'; 
    162  
    163         if(!$pop3->delete($i)) { 
    164                 echo '<p>Oops '.$pop3->ERROR.'</p></div>'; 
     142         
     143        do_action( 'publish_phone', $post_ID ); 
     144         
     145        if ( !$pop3->delete( $_i ) ) { 
    165146                $pop3->reset(); 
    166                 exit; 
    167         } else { 
    168                 echo "<p>Mission complete, message <strong>$i</strong> deleted.</p>"; 
     147                 
     148                wp_die( __( 'Could not delete email from server.' ) ); 
    169149        } 
     150} 
    170151 
    171 endfor; 
    172  
    173152$pop3->quit(); 
    174153 
    175 ?> 
     154wp_die( __( 'Successfully completed.' ) ); 
     155 
     156?> 
     157 No newline at end of file