| | |
| | | * |
| | | */ |
| | | 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'; |
| | |
| | | $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') { |
| | | fputs($this->_smtp_conn, 'STARTTLS' . $this->_crlf); |
| | | 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); |
| | |
| | | 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 |
| | |
| | | $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 |
| | |
| | | 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); |
| | |
| | | |
| | | $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; |
| | | |