From e1ceb050e19c7574bca146a8da7047ee4ff456b5 Mon Sep 17 00:00:00 2001
From: Marius Burkard <m.burkard@pixcept.de>
Date: Sun, 10 Jul 2016 05:02:35 -0400
Subject: [PATCH] Merge branch 'stable-3.1'
---
interface/lib/classes/ispcmail.inc.php | 95 +++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 87 insertions(+), 8 deletions(-)
diff --git a/interface/lib/classes/ispcmail.inc.php b/interface/lib/classes/ispcmail.inc.php
index 16247ab..c92601c 100644
--- a/interface/lib/classes/ispcmail.inc.php
+++ b/interface/lib/classes/ispcmail.inc.php
@@ -219,10 +219,11 @@
*
*/
private function detectHelo() {
- if(isset($_SERVER['HTTP_HOST'])) $this->smtp_helo = $_SERVER['HTTP_HOST'];
+ if(isset($_SERVER['HTTP_HOST'])) $this->smtp_helo = (strpos($_SERVER['HTTP_HOST'], ':') !== false ? substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], ':')) : $_SERVER['HTTP_HOST']);
elseif(isset($_SERVER['SERVER_NAME'])) $this->smtp_helo = $_SERVER['SERVER_NAME'];
else $this->smtp_helo = php_uname('n');
if($this->smtp_helo == '') $this->smtp_helo = 'localhost';
+ return $this->smtp_helo;
}
@@ -588,9 +589,14 @@
* @access private
*/
private function _smtp_login() {
- $this->_smtp_conn = fsockopen(($this->smtp_crypt == 'ssl' ? 'ssl://' : '') . $this->smtp_host, $this->smtp_port, $errno, $errstr, 30);
+ $this->_smtp_conn = fsockopen(($this->smtp_crypt == 'ssl' ? 'tls://' : '') . $this->smtp_host, $this->smtp_port, $errno, $errstr, 30);
$response = fgets($this->_smtp_conn, 515);
if(empty($this->_smtp_conn)) return false;
+
+ //Say Hello to SMTP
+ if($this->smtp_helo == '') $this->detectHelo();
+ fputs($this->_smtp_conn, 'HELO ' . $this->smtp_helo . $this->_crlf);
+ $response = fgets($this->_smtp_conn, 515);
// ENCRYPTED?
if($this->smtp_crypt == 'tls') {
@@ -598,11 +604,6 @@
fgets($this->_smtp_conn, 515);
stream_socket_enable_crypto($this->_smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
}
-
- //Say Hello to SMTP
- if($this->smtp_helo == '') $this->detectHelo();
- fputs($this->_smtp_conn, 'HELO ' . $this->smtp_helo . $this->_crlf);
- $response = fgets($this->_smtp_conn, 515);
//AUTH LOGIN
fputs($this->_smtp_conn, 'AUTH LOGIN' . $this->_crlf);
@@ -637,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
@@ -682,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
@@ -704,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);
@@ -714,7 +794,6 @@
$mail_content = 'Subject: ' . $enc_subject . $this->_crlf;
$mail_content .= 'To: ' . $this->getHeader('To') . $this->_crlf;
- if($this->getHeader('Bcc') != '') $mail_content .= 'Bcc: ' . $this->_encodeHeader($this->getHeader('Bcc'), $this->mail_charset) . $this->_crlf;
if($this->getHeader('Cc') != '') $mail_content .= 'Cc: ' . $this->_encodeHeader($this->getHeader('Cc'), $this->mail_charset) . $this->_crlf;
$mail_content .= implode($this->_crlf, $headers) . $this->_crlf . ($this->_is_signed == false ? $this->_crlf : '') . $this->body;
--
Gitblit v1.9.1