Marius Cramer
2014-02-05 0d68e92162476cc6b9e4c17fcfd0ae06bc8538c4
Fixed:  FS#3318 - Check if there is a problem with bcc email addresses in email class
1 files modified
79 ■■■■■ changed files
interface/lib/classes/ispcmail.inc.php 79 ●●●●● patch | view | raw | blame | history
interface/lib/classes/ispcmail.inc.php
@@ -638,7 +638,72 @@
        return true;
    }
    private function _extract_names($data) {
        $senders = array();
        $data = stripslashes(preg_replace("'(\t|\r|\n)'", '', $data));
        if(trim($data) == '') return $senders;
        $armail = array();
        $counter = 0;  $inthechar = 0;
        $chartosplit = ',;'; $protectchar = '"'; $temp = '';
        $closed = 1;
        for($i = 0; $i < strlen($data); $i++) {
            $thischar = $data[$i];
            if($thischar == '<' && $closed) $closed = 0;
            if($thischar == '>' && !$closed) $closed = 1;
            if($thischar == $protectchar) $inthechar = ($inthechar) ? 0 : 1;
            if((strpos($chartosplit, $thischar) !== false) && !$inthechar && $closed) {
                $armail[] = $temp;
                $temp = '';
            } else {
                $temp .= $thischar;
            }
        }
        if(trim($temp) != '') {
            $armail[] = trim($temp);
            unset($temp);
        }
        foreach($armail as $thisPart) {
            $thisPart = trim(preg_replace('/^"(.*)"$/i', '$1', trim($thisPart)));
            if($thisPart != '') {
                $email = '';
                $name = '';
                if(preg_match('/(.*)<(.*)>/i', $thisPart, $matches)) {
                    $email = trim($matches[2]);
                    $name = trim($matches[1]);
                } else {
                    if(preg_match('/([-a-z0-9_$+.]+@[-a-z0-9_.]+[-a-z0-9_]+)((.*))/i', $thisPart, $matches)) {
                        $email = $matches[1];
                        $name = $matches[2];
                    } else {
                        $email = $thisPart;
                    }
                }
                $email = preg_replace('/<(.*)\\>/', '$1', $email);
                $name = preg_replace('/"(.*)"/', '$1', trim($name));
                $name = preg_replace('/\((.*)\)/', '$1', $name);
                if($name == '') $name = $email;
                if($email == '') $email = $name;
                $senders[] = array(
                    'name' => $name,
                    'mail' => $email
                );
                unset($name);
                unset($email);
            }
        }
        unset($armail);
        unset($thisPart);
        return $senders;
    }
    /**
     * Send the mail to one or more recipients
@@ -683,6 +748,7 @@
                $result = $this->_smtp_login();
                if(!$result) return false;
            }
            $bcc_cc_sent = false;
            foreach($recipients as $recipname => $recip) {
                if($this->_sent_mails >= $this->smtp_max_mails) {
                    // close connection to smtp and reconnect
@@ -705,6 +771,19 @@
                fputs($this->_smtp_conn, 'RCPT TO: <' . $recip . '>' . $this->_crlf);
                $response = fgets($this->_smtp_conn, 515);
                if($bcc_cc_sent == false) {
                    $add_recips = array();
                    if($this->getHeader('Cc') != '') $add_recips = array_merge($add_recips, $this->_extract_names($this->getHeader('Cc')));
                    if($this->getHeader('Bcc') != '') $add_recips = array_merge($add_recips, $this->_extract_names($this->getHeader('Bcc')));
                    foreach($add_recips as $add_recip) {
                        if(!$add_recip['mail']) continue;
                        fputs($this->_smtp_conn, 'RCPT TO: <' . $this->_encodeHeader($add_recip['mail'], $this->mail_charset) . '>' . $this->_crlf);
                        $response = fgets($this->_smtp_conn, 515);
                    }
                    unset($add_recips);
                    $bcc_cc_sent = true;
                }
                //The Email
                fputs($this->_smtp_conn, 'DATA' . $this->_crlf);
                $response = fgets($this->_smtp_conn, 515);