WordPress.org

Make WordPress Core

Ticket #4338: 4338.diff

File 4338.diff, 10.3 KB (added by rob1n, 11 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