diff --git a/system/engine/registry.php b/system/engine/registry.php index 26f6764..6d9b2a1 100644 --- a/system/engine/registry.php +++ b/system/engine/registry.php @@ -115,6 +115,7 @@ final class Registry { * * @param string|object|null $class (optional) * @param array $args (optional) + * @param bool $onlyCheckInstances (Optional) if true, don't create an auto-instance * * @return \Phacil\Framework\Registry * @since 2.0.0 diff --git a/system/etc/preferences.json b/system/etc/preferences.json index 8f89966..c78c3ab 100644 --- a/system/etc/preferences.json +++ b/system/etc/preferences.json @@ -6,6 +6,7 @@ "Phacil\\Framework\\Databases\\Object\\ItemInterface": "Phacil\\Framework\\Databases\\Object\\Item", "Phacil\\Framework\\Api\\Database": "Phacil\\Framework\\Database", "Cm\\RedisSession\\Handler\\ConfigInterface": "Phacil\\Framework\\Session\\Redis\\Config", - "Cm\\RedisSession\\Handler\\LoggerInterface": "Phacil\\Framework\\Session\\Redis\\Logger" + "Cm\\RedisSession\\Handler\\LoggerInterface": "Phacil\\Framework\\Session\\Redis\\Logger", + "Phacil\\Framework\\Mail\\Api\\MailInterface": "Phacil\\Framework\\Mail" } } \ No newline at end of file diff --git a/system/mail/Api/DriverInterface.php b/system/mail/Api/DriverInterface.php new file mode 100644 index 0000000..17c490d --- /dev/null +++ b/system/mail/Api/DriverInterface.php @@ -0,0 +1,57 @@ +mail = $mail; + } + + protected function validate() { + $this->from = $this->mail->getFrom(); + $this->subject = $this->mail->getSubject(); + $this->parameter = $this->mail->getParameter(); + + if(!$this->from || !is_string($this->from)) + throw new \Phacil\Framework\Exception\InvalidArgumentException('Requires a valid FROM configuration'); + } + + /** + * {@inheritdoc} + */ + public function send($to, $message, $header){ + $this->validate(); + + ini_set('sendmail_from', $this->from); + + if (!empty($this->parameter)) { + return mail($to, '=?UTF-8?B?' . base64_encode($this->subject) . '?=', $message, $header, $this->parameter); + } else { + return mail($to, '=?UTF-8?B?' . base64_encode($this->subject) . '?=', $message, $header); + } + } + +} \ No newline at end of file diff --git a/system/mail/Drivers/SMTP.php b/system/mail/Drivers/SMTP.php new file mode 100644 index 0000000..de8a4f9 --- /dev/null +++ b/system/mail/Drivers/SMTP.php @@ -0,0 +1,338 @@ +mail = $mail; + } + + protected function validate() { + $this->verp = $this->mail->getVerp(); + $this->from = $this->mail->getFrom(); + $this->port = $this->mail->getConfig()->get(self::CONFIG_SMTP_PORT) ?: $this->port; + $this->hostname = $this->mail->getConfig()->get(self::CONFIG_SMTP_HOSTNAME); + $this->username = $this->mail->getConfig()->get(self::CONFIG_SMTP_USERNAME); + $this->password = $this->mail->getConfig()->get(self::CONFIG_SMTP_PASSWORD); + $this->timeout = $this->mail->getConfig()->get(self::CONFIG_SMTP_TIMEOUT) ?: $this->timeout; + + if(!$this->hostname || !is_string($this->hostname)) + throw new \Phacil\Framework\Exception\InvalidArgumentException('STMP requires a valid hostname configuration'); + + if(!empty($this->username) && !is_string($this->username)) + throw new \Phacil\Framework\Exception\InvalidArgumentException('STMP requires a valid smtp username configuration'); + + if(!empty($this->password) && !is_string($this->password)) + throw new \Phacil\Framework\Exception\InvalidArgumentException('STMP requires a valid smtp password configuration'); + + if(!$this->port || !is_int($this->port)) + throw new \Phacil\Framework\Exception\InvalidArgumentException('STMP requires a valid smtp port configuration'); + + if(!$this->timeout || !is_int($this->timeout)) + throw new \Phacil\Framework\Exception\InvalidArgumentException('STMP requires a valid timeout configuration'); + } + + /** + * {@inheritdoc} + */ + public function send($to, $message, $header){ + $this->validate(); + + $handle = fsockopen($this->hostname, $this->port, $errno, $errstr, $this->timeout); + + if (!$handle) { + throw new \Phacil\Framework\Exception('Error: ' . $errstr . ' (' . $errno . ')'); + } else { + if (substr(PHP_OS, 0, 3) != 'WIN') { + socket_set_timeout($handle, $this->timeout, 0); + } + + while ($line = fgets($handle, 515)) { + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($this->hostname, 0, 3) == 'tls') { + fputs($handle, 'STARTTLS' . $this->crlf); + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 220) { + throw new \Phacil\Framework\Exception('Error: STARTTLS not accepted from server!'); + } + } + + if (!empty($this->username) && !empty($this->password)) { + fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 250) { + throw new \Phacil\Framework\Exception('Error: EHLO not accepted from server!'); + } + + fputs($handle, 'AUTH LOGIN' . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 334) { + throw new \Phacil\Framework\Exception('Error: AUTH LOGIN not accepted from server!'); + } + + fputs($handle, base64_encode($this->username) . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 334) { + throw new \Phacil\Framework\Exception('Error: Username not accepted from server!'); + } + + fputs($handle, base64_encode($this->password) . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 235) { + throw new \Phacil\Framework\Exception('Error: Password not accepted from server!'); + } + } else { + fputs($handle, 'HELO ' . getenv('SERVER_NAME') . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 250) { + throw new \Phacil\Framework\Exception('Error: HELO not accepted from server!'); + } + } + + if ($this->verp) { + fputs($handle, 'MAIL FROM: <' . $this->from . '>XVERP' . $this->crlf); + } else { + fputs($handle, 'MAIL FROM: <' . $this->from . '>' . $this->crlf); + } + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 250) { + throw new \Phacil\Framework\Exception('Error: MAIL FROM not accepted from server!'); + } + + if (!is_array($to)) { + fputs($handle, 'RCPT TO: <' . $to . '>' . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) { + throw new \Phacil\Framework\Exception('Error: RCPT TO not accepted from server!'); + } + } else { + foreach ($to as $recipient) { + fputs($handle, 'RCPT TO: <' . $recipient . '>' . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) { + throw new \Phacil\Framework\Exception('Error: RCPT TO not accepted from server!'); + } + } + } + + fputs($handle, 'DATA' . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 354) { + throw new \Phacil\Framework\Exception('Error: DATA not accepted from server!'); + } + + // According to rfc 821 we should not send more than 1000 including the CRLF + $message = str_replace("\r\n", "\n", $header . $message); + $message = str_replace("\r", "\n", $message); + + $lines = explode("\n", $message); + + foreach ($lines as $line) { + $results = str_split($line, 998); + + foreach ($results as $result) { + if (substr(PHP_OS, 0, 3) != 'WIN') { + fputs($handle, $result . $this->crlf); + } else { + fputs($handle, str_replace("\n", "\r\n", $result) . $this->crlf); + } + } + } + + fputs($handle, '.' . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 250) { + throw new \Phacil\Framework\Exception('Error: DATA not accepted from server!'); + } + + fputs($handle, 'QUIT' . $this->crlf); + + $reply = ''; + + while ($line = fgets($handle, 515)) { + $reply .= $line; + + if (substr($line, 3, 1) == ' ') { + break; + } + } + + if (substr($reply, 0, 3) != 221) { + throw new \Phacil\Framework\Exception('Error: QUIT not accepted from server!'); + } + + fclose($handle); + + return true; + } + + } + +} \ No newline at end of file diff --git a/system/mail/autoload.php b/system/mail/autoload.php index 0af70b4..5a4448f 100644 --- a/system/mail/autoload.php +++ b/system/mail/autoload.php @@ -1,3 +1,371 @@ config = $config; + + $this->protocol = $this->config->get('config_mail_protocol') ?: $this->protocol; + + if (!\Phacil\Framework\Registry::checkPreferenceExist(\Phacil\Framework\Mail\Api\DriverInterface::class)) { + if($this->protocol == self::PROTOCOL_SMTP) { + \Phacil\Framework\Registry::addDIPreference(\Phacil\Framework\Mail\Api\DriverInterface::class, \Phacil\Framework\Mail\Drivers\SMTP::class); + } + if($this->protocol == self::PROTOCOL_MAIL) { + \Phacil\Framework\Registry::addDIPreference(\Phacil\Framework\Mail\Api\DriverInterface::class, \Phacil\Framework\Mail\Drivers\Native::class); + } + } + + /** @var \Phacil\Framework\Mail\Api\DriverInterface */ + $this->driver = $registry->getInstance(\Phacil\Framework\Mail\Api\DriverInterface::class, [$this]); + } + + /** @inheritdoc */ + public function getVerp(){ + return $this->verp; + } + + /** @inheritdoc */ + public function getFrom() { + return $this->from; + } + + public function getParameter() + { + return $this->parameter; + } + + /** @inheritdoc */ + public function getConfig() { + return $this->config; + } + + /** + * {@inheritdoc} + */ + public function setTo($to) { + $this->to = $to; + return $this; + } + + /** + * {@inheritdoc} + */ + public function getTo() { + return $this->to; + } + + /** + * {@inheritdoc} + */ + public function setFrom($from) { + $this->from = $from; + return $this; + } + + /** + * {@inheritdoc} + */ + public function setSender($sender) { + $this->sender = html_entity_decode($sender, ENT_QUOTES, 'UTF-8'); + return $this; + } + + /** @inheritdoc */ + public function getSender() { + return $this->sender; + } + + /** + * {@inheritdoc} + */ + public function setSubject($subject) { + $this->subject = html_entity_decode($subject, ENT_QUOTES, 'UTF-8'); + return $this; + } + + /** @inheritdoc */ + public function getSubject() + { + return $this->subject; + } + + /** + * {@inheritdoc} + */ + public function setText($text) { + $this->text = $text; + return $this; + } + + /** + * {@inheritdoc} + */ + public function getText() + { + return $this->text; + } + + /** + * {@inheritdoc} + */ + public function setHtml($html) { + $this->html = $html; + return $this; + } + + /** + * {@inheritdoc} + */ + public function getHtml() + { + return $this->html; + } + + /** + * {@inheritdoc} + */ + public function setReplyTo($replyTo) { + $this->replyTo = $replyTo; + return $this; + } + + /** + * {@inheritdoc} + */ + public function getReplyTo() { + return $this->replyTo; + } + + /** + * {@inheritdoc} + */ + public function addAttachment($file, $filename = '') { + if (!$filename) { + $filename = basename($file); + } + + $this->attachments[] = [ + 'filename' => $filename, + 'file' => $file + ]; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getAttachments() { + return $this->attachments; + } + + protected function validade() { + if (!$this->to || !is_string($this->to)) { + throw new \Phacil\Framework\Exception\InvalidArgumentException('A valid e-mail To is required!'); + } + + if (!$this->from || !is_string($this->from)) { + throw new \Phacil\Framework\Exception\InvalidArgumentException('Valid e-mail From required!'); + } + + if (!$this->sender || !is_string($this->sender)) { + throw new \Phacil\Framework\Exception\InvalidArgumentException('A valid email sender is required!'); + } + + if (!$this->subject || !is_string($this->subject)) { + throw new \Phacil\Framework\Exception\InvalidArgumentException('A valid email subject is required!'); + } + + if ((!$this->text) && (!$this->html)) { + throw new \Phacil\Framework\Exception\InvalidArgumentException('E-Mail message required!'); + } + } + + /** @inheritdoc */ + public function send() { + $this->validade(); + + if (is_array($this->to)) { + $to = implode(',', $this->to); + } else { + $to = $this->to; + } + + $boundary = '----=_NextPart_' . md5(time()); + + $header = ''; + + $header .= 'MIME-Version: 1.0' . $this->newline; + + if ($this->protocol != self::PROTOCOL_MAIL) { + $header .= 'To: ' . $to . $this->newline; + $header .= 'Subject: ' . $this->subject . $this->newline; + } + + $header .= 'Date: ' . date("D, d M Y H:i:s O") . $this->newline; + $header .= 'From: ' . '=?UTF-8?B?' . base64_encode($this->sender) . '?=' . '<' . $this->from . '>' . $this->newline; + $header .= 'Reply-To: ' . $this->sender . '<' . $this->from . '>' . $this->newline; + $header .= 'Return-Path: ' . $this->from . $this->newline; + $header .= 'X-Mailer: '.self::XMAILER_SIGN.' with PHP/' . (defined('PHP_MAJOR_VERSION') ? PHP_MAJOR_VERSION : phpversion() ). $this->newline; + $header .= 'Content-Type: multipart/related; boundary="' . $boundary . '"' . $this->newline; + + if (!$this->html) { + $message = '--' . $boundary . $this->newline; + $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline; + $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline; + $message .= $this->text . $this->newline; + } else { + $message = '--' . $boundary . $this->newline; + $message .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '_alt"' . $this->newline . $this->newline; + $message .= '--' . $boundary . '_alt' . $this->newline; + $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline; + $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline; + + if ($this->text) { + $message .= $this->text . $this->newline; + } else { + $message .= 'This is a HTML email and your email client software does not support HTML email!' . $this->newline; + } + + $message .= '--' . $boundary . '_alt' . $this->newline; + $message .= 'Content-Type: text/html; charset="utf-8"' . $this->newline; + $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline; + $message .= $this->html . $this->newline; + $message .= '--' . $boundary . '_alt--' . $this->newline; + } + + foreach ($this->attachments as $attachment) { + if (file_exists($attachment['file'])) { + $handle = fopen($attachment['file'], 'r'); + + $content = fread($handle, filesize($attachment['file'])); + + fclose($handle); + + $message .= '--' . $boundary . $this->newline; + $message .= 'Content-Type: application/octetstream; name="' . basename($attachment['file']) . '"' . $this->newline; + $message .= 'Content-Transfer-Encoding: base64' . $this->newline; + $message .= 'Content-Disposition: attachment; filename="' . basename($attachment['filename']) . '"' . $this->newline; + $message .= 'Content-ID: <' . basename($attachment['filename']) . '>' . $this->newline; + $message .= 'X-Attachment-Id: ' . basename($attachment['filename']) . $this->newline . $this->newline; + $message .= chunk_split(base64_encode($content)); + } + } + + $message .= '--' . $boundary . '--' . $this->newline; + + return $this->driver->send($to, $message, $header); + } +} diff --git a/system/mail/mail.php b/system/mail/mail.php deleted file mode 100644 index 688a7f0..0000000 --- a/system/mail/mail.php +++ /dev/null @@ -1,522 +0,0 @@ -to = $to; - } - - /** - * - * @param string $from - * @return void - */ - public function setFrom($from) { - $this->from = $from; - } - - /** - * @param string $sender - * @return void - */ - public function setSender($sender) { - $this->sender = html_entity_decode($sender, ENT_QUOTES, 'UTF-8'); - } - - /** - * @param string $subject - * @return void - */ - public function setSubject($subject) { - $this->subject = html_entity_decode($subject, ENT_QUOTES, 'UTF-8'); - } - - /** - * @param string $text - * @return void - */ - public function setText($text) { - $this->text = $text; - } - - /** - * @param string $html - * @return void - */ - public function setHtml($html) { - $this->html = $html; - } - - /** - * @param string $file - * @param string $filename - * @return void - */ - public function addAttachment($file, $filename = '') { - if (!$filename) { - $filename = basename($file); - } - - $this->attachments[] = [ - 'filename' => $filename, - 'file' => $file - ]; - } - - /** @return void */ - public function send() { - if (!$this->to) { - throw new \Phacil\Framework\Exception('Error: E-Mail to required!'); - } - - if (!$this->from) { - throw new \Phacil\Framework\Exception('Error: E-Mail from required!'); - } - - if (!$this->sender) { - throw new \Phacil\Framework\Exception('Error: E-Mail sender required!'); - } - - if (!$this->subject) { - throw new \Phacil\Framework\Exception('Error: E-Mail subject required!'); - } - - if ((!$this->text) && (!$this->html)) { - throw new \Phacil\Framework\Exception('Error: E-Mail message required!'); - } - - if (is_array($this->to)) { - $to = implode(',', $this->to); - } else { - $to = $this->to; - } - - $boundary = '----=_NextPart_' . md5(time()); - - $header = ''; - - $header .= 'MIME-Version: 1.0' . $this->newline; - - if ($this->protocol != 'mail') { - $header .= 'To: ' . $to . $this->newline; - $header .= 'Subject: ' . $this->subject . $this->newline; - } - - $header .= 'Date: ' . date("D, d M Y H:i:s O") . $this->newline; - $header .= 'From: ' . '=?UTF-8?B?' . base64_encode($this->sender) . '?=' . '<' . $this->from . '>' . $this->newline; - $header .= 'Reply-To: ' . $this->sender . '<' . $this->from . '>' . $this->newline; - $header .= 'Return-Path: ' . $this->from . $this->newline; - $header .= 'X-Mailer: PHP/' . phpversion() . $this->newline; - $header .= 'Content-Type: multipart/related; boundary="' . $boundary . '"' . $this->newline; - - if (!$this->html) { - $message = '--' . $boundary . $this->newline; - $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline; - $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline; - $message .= $this->text . $this->newline; - } else { - $message = '--' . $boundary . $this->newline; - $message .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '_alt"' . $this->newline . $this->newline; - $message .= '--' . $boundary . '_alt' . $this->newline; - $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline; - $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline; - - if ($this->text) { - $message .= $this->text . $this->newline; - } else { - $message .= 'This is a HTML email and your email client software does not support HTML email!' . $this->newline; - } - - $message .= '--' . $boundary . '_alt' . $this->newline; - $message .= 'Content-Type: text/html; charset="utf-8"' . $this->newline; - $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline; - $message .= $this->html . $this->newline; - $message .= '--' . $boundary . '_alt--' . $this->newline; - } - - foreach ($this->attachments as $attachment) { - if (file_exists($attachment['file'])) { - $handle = fopen($attachment['file'], 'r'); - - $content = fread($handle, filesize($attachment['file'])); - - fclose($handle); - - $message .= '--' . $boundary . $this->newline; - $message .= 'Content-Type: application/octetstream; name="' . basename($attachment['file']) . '"' . $this->newline; - $message .= 'Content-Transfer-Encoding: base64' . $this->newline; - $message .= 'Content-Disposition: attachment; filename="' . basename($attachment['filename']) . '"' . $this->newline; - $message .= 'Content-ID: <' . basename($attachment['filename']) . '>' . $this->newline; - $message .= 'X-Attachment-Id: ' . basename($attachment['filename']) . $this->newline . $this->newline; - $message .= chunk_split(base64_encode($content)); - } - } - - $message .= '--' . $boundary . '--' . $this->newline; - - if ($this->protocol == 'mail') { - ini_set('sendmail_from', $this->from); - - if ($this->parameter) { - mail($to, '=?UTF-8?B?' . base64_encode($this->subject) . '?=', $message, $header, $this->parameter); - } else { - mail($to, '=?UTF-8?B?' . base64_encode($this->subject) . '?=', $message, $header); - } - - } elseif ($this->protocol == 'smtp') { - $handle = fsockopen($this->hostname, $this->port, $errno, $errstr, $this->timeout); - - if (!$handle) { - throw new \Phacil\Framework\Exception('Error: ' . $errstr . ' (' . $errno . ')'); - } else { - if (substr(PHP_OS, 0, 3) != 'WIN') { - socket_set_timeout($handle, $this->timeout, 0); - } - - while ($line = fgets($handle, 515)) { - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($this->hostname, 0, 3) == 'tls') { - fputs($handle, 'STARTTLS' . $this->crlf); - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 220) { - throw new \Phacil\Framework\Exception('Error: STARTTLS not accepted from server!'); - } - } - - if (!empty($this->username) && !empty($this->password)) { - fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 250) { - throw new \Phacil\Framework\Exception('Error: EHLO not accepted from server!'); - } - - fputs($handle, 'AUTH LOGIN' . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 334) { - throw new \Phacil\Framework\Exception('Error: AUTH LOGIN not accepted from server!'); - } - - fputs($handle, base64_encode($this->username) . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 334) { - throw new \Phacil\Framework\Exception('Error: Username not accepted from server!'); - } - - fputs($handle, base64_encode($this->password) . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 235) { - throw new \Phacil\Framework\Exception('Error: Password not accepted from server!'); - } - } else { - fputs($handle, 'HELO ' . getenv('SERVER_NAME') . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 250) { - throw new \Phacil\Framework\Exception('Error: HELO not accepted from server!'); - } - } - - if ($this->verp) { - fputs($handle, 'MAIL FROM: <' . $this->from . '>XVERP' . $this->crlf); - } else { - fputs($handle, 'MAIL FROM: <' . $this->from . '>' . $this->crlf); - } - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 250) { - throw new \Phacil\Framework\Exception('Error: MAIL FROM not accepted from server!'); - } - - if (!is_array($this->to)) { - fputs($handle, 'RCPT TO: <' . $this->to . '>' . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) { - throw new \Phacil\Framework\Exception('Error: RCPT TO not accepted from server!'); - } - } else { - foreach ($this->to as $recipient) { - fputs($handle, 'RCPT TO: <' . $recipient . '>' . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) { - throw new \Phacil\Framework\Exception('Error: RCPT TO not accepted from server!'); - } - } - } - - fputs($handle, 'DATA' . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 354) { - throw new \Phacil\Framework\Exception('Error: DATA not accepted from server!'); - } - - // According to rfc 821 we should not send more than 1000 including the CRLF - $message = str_replace("\r\n", "\n", $header . $message); - $message = str_replace("\r", "\n", $message); - - $lines = explode("\n", $message); - - foreach ($lines as $line) { - $results = str_split($line, 998); - - foreach ($results as $result) { - if (substr(PHP_OS, 0, 3) != 'WIN') { - fputs($handle, $result . $this->crlf); - } else { - fputs($handle, str_replace("\n", "\r\n", $result) . $this->crlf); - } - } - } - - fputs($handle, '.' . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 250) { - throw new \Phacil\Framework\Exception('Error: DATA not accepted from server!'); - } - - fputs($handle, 'QUIT' . $this->crlf); - - $reply = ''; - - while ($line = fgets($handle, 515)) { - $reply .= $line; - - if (substr($line, 3, 1) == ' ') { - break; - } - } - - if (substr($reply, 0, 3) != 221) { - throw new \Phacil\Framework\Exception('Error: QUIT not accepted from server!'); - } - - fclose($handle); - } - } - } -} diff --git a/system/system.php b/system/system.php index d9ca58f..8cfc94d 100644 --- a/system/system.php +++ b/system/system.php @@ -354,16 +354,8 @@ final class startEngineExacTI { public function checkRegistry($key){ //mail if(!isset($this->registry->$key) && $key == 'mail'){ - $this->mail = new Mail(); - $this->mail->protocol = $this->config->get('config_mail_protocol'); - if($this->config->get('config_mail_protocol') == 'smtp'){ - $this->mail->parameter = $this->config->get('config_mail_parameter'); - $this->mail->hostname = $this->config->get('config_smtp_host'); - $this->mail->username = $this->config->get('config_smtp_username'); - $this->mail->password = $this->config->get('config_smtp_password'); - $this->mail->port = $this->config->get('config_smtp_port'); - $this->mail->timeout = $this->config->get('config_smtp_timeout'); - } + /** @var \Phacil\Framework\Mail\Api\MailInterface */ + $this->mail = $this->registry->getInstance(\Phacil\Framework\Mail\Api\MailInterface::class); } // Translate