mirror of
https://github.com/VTECRM/vtenext.git
synced 2026-02-26 16:18:47 +00:00
224 lines
5.7 KiB
PHP
224 lines
5.7 KiB
PHP
<?php
|
|
/*************************************
|
|
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
************************************/
|
|
|
|
/* crmv@180739 */
|
|
|
|
use \PHPMailer\PHPMailer\PHPMailer;
|
|
use \PHPMailer\PHPMailer\SMTP;
|
|
|
|
class VTEMailerSMTP extends SMTP {
|
|
|
|
//crmv@58893
|
|
public function getHelloOutput(){
|
|
return $this->helo_rply;
|
|
}
|
|
//crmv@58893e
|
|
}
|
|
|
|
class VTEMailer extends PHPMailer {
|
|
|
|
public $XMailer = 'VTECRM-WEBMAIL';
|
|
|
|
public $CharSet = self::CHARSET_UTF8;
|
|
|
|
public $max_message_size = null;
|
|
|
|
protected $preSendOK = false;
|
|
|
|
public function __construct($exceptions = null) {
|
|
parent::__construct($exceptions);
|
|
|
|
$VP = VTEProperties::getInstance();
|
|
if ($VP->get("security.smtp.validate_certs") == '0') {
|
|
$this->SMTPOptions['ssl'] = array(
|
|
//Some men just want to watch the world burn...
|
|
'verify_peer' => false,
|
|
'allow_self_signed' => true,
|
|
'verify_peer_name' => false,
|
|
);
|
|
}
|
|
|
|
//$this->SMTPDebug = 2; // crmv@201913
|
|
}
|
|
|
|
|
|
public function getSMTPInstance() {
|
|
if (!is_object($this->smtp)) {
|
|
$this->smtp = new VTEMailerSMTP();
|
|
}
|
|
|
|
return $this->smtp;
|
|
}
|
|
|
|
// crmv@198780
|
|
public function createHeader($message_id='') {
|
|
if (!empty($message_id)) $this->MessageID = $message_id;
|
|
|
|
$r = parent::createHeader();
|
|
|
|
// compatibility fix: set old message_id
|
|
$this->message_id = $this->lastMessageID;
|
|
if (!empty($message_id)) $this->uniqueid = preg_replace('/<([^@]+)@(.*)/', '$1', $message_id);
|
|
|
|
return $r;
|
|
}
|
|
// crmv@198780e
|
|
|
|
/**
|
|
* Added a flag to return the same id in case of multiple calls to CreateBody or CreateHeader
|
|
*/
|
|
protected function generateId() {
|
|
return $this->uniqueid ?: parent::generateId();
|
|
}
|
|
|
|
// clear the uniqueid
|
|
public function postSend() {
|
|
$r = parent::postSend();
|
|
$this->uniqueid = '';
|
|
return $r;
|
|
}
|
|
|
|
public function preSend() {
|
|
// alter the text only body to translate html
|
|
if (!empty($this->Body) && !empty($this->AltBody)) {
|
|
$this->AltBody = html_entity_decode($this->AltBody, ENT_QUOTES, $this->CharSet);
|
|
}
|
|
return parent::preSend();
|
|
}
|
|
|
|
/**
|
|
* Wrapper to have the function serverHostname public
|
|
*/
|
|
public function getHostname() {
|
|
return $this->serverHostname();
|
|
}
|
|
|
|
/**
|
|
* Clear errors
|
|
*/
|
|
public function resetErrors() {
|
|
$this->error_count = 0;
|
|
$this->ErrorInfo = '';
|
|
}
|
|
|
|
/**
|
|
* Do a preliminary check to see if the SMTP server accepts the email
|
|
*/
|
|
public function checkSend($attSize = 0, &$return_error) { // crmv@201913
|
|
|
|
try {
|
|
|
|
// code copied from original class
|
|
$bad_rcpt = [];
|
|
if (!$this->smtpConnect($this->SMTPOptions)) {
|
|
throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
|
|
}
|
|
//Sender already validated in preSend()
|
|
if ('' == $this->Sender) {
|
|
$smtp_from = $this->From;
|
|
} else {
|
|
$smtp_from = $this->Sender;
|
|
}
|
|
if (!$this->smtp->mail($smtp_from)) {
|
|
$this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
|
|
throw new Exception($this->ErrorInfo, self::STOP_CRITICAL);
|
|
}
|
|
|
|
// Attempt to send to all recipients
|
|
foreach ([$this->to, $this->cc, $this->bcc] as $togroup) {
|
|
foreach ($togroup as $to) {
|
|
if (!$this->smtp->recipient($to[0], $this->dsn)) {
|
|
$error = $this->smtp->getError();
|
|
$bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']];
|
|
$isSent = false;
|
|
} else {
|
|
$isSent = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
//Create error message for any bad addresses
|
|
if (count($bad_rcpt) > 0) {
|
|
$errstr = '';
|
|
foreach ($bad_rcpt as $bad) {
|
|
$errstr .= $bad['to'] . ': ' . $bad['error'];
|
|
}
|
|
throw new Exception(
|
|
$this->lang('recipients_failed') . $errstr,
|
|
self::STOP_CONTINUE
|
|
);
|
|
} else {
|
|
$extList = $this->smtp->getServerExtList();
|
|
$max_size = $extList['SIZE'] ?: $this->max_message_size;
|
|
|
|
if ($max_size > 0) {
|
|
// calculate email size and check if bigger
|
|
$this->message_type = 'alt_inline_attach'; // crmv@201913
|
|
$bodystring = $this->CreateBody();
|
|
$message_size = mb_strlen($bodystring) + $attSize;
|
|
$message_size += 300000; // crmv@192217 add 300 KB
|
|
|
|
unset($bodystring);
|
|
|
|
if ($message_size > $max_size) {
|
|
$size_mb = round($max_size/1024/1024,2)." MB";
|
|
$error = sprintf(getTranslatedString('LBL_MESSAGE_TOO_BIG','Emails').$error,$size_mb);
|
|
throw new Exception($error, self::STOP_CRITICAL);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($this->SMTPKeepAlive) {
|
|
$this->smtp->reset();
|
|
} else {
|
|
$this->smtp->quit();
|
|
$this->smtp->close();
|
|
}
|
|
|
|
} catch (Exception $e) {
|
|
$return_error = $e->getMessage(); // crmv@201913
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// crmv@198780
|
|
function addStringAttachment($string, $filename = '', $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'attachment', $cid = 0) {
|
|
try {
|
|
// If a MIME type is not specified, try to work it out from the file name
|
|
if ('' === $type) {
|
|
$type = static::filenameToType($filename);
|
|
}
|
|
|
|
if (!$this->validateEncoding($encoding)) {
|
|
throw new Exception($this->lang('encoding') . $encoding);
|
|
}
|
|
|
|
$this->attachment[] = [
|
|
0 => $string,
|
|
1 => $filename,
|
|
2 => $filename,
|
|
3 => $encoding,
|
|
4 => $type,
|
|
5 => true, // isStringAttachment
|
|
6 => $disposition,
|
|
7 => $cid,
|
|
];
|
|
} catch (Exception $exc) {
|
|
$this->setError($exc->getMessage());
|
|
$this->edebug($exc->getMessage());
|
|
if ($this->exceptions) {
|
|
throw $exc;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
// crmv@198780e
|
|
} |