Fórum OpenCart Brasil

Por um e-commerce livre, confiável e profissional

Suporte geral sobre problemas técnicos para OpenCart v1.x.
Por ldsbh
#15366
Amigos,

Na linha 131:
Código: Selecionar todos
foreach ($this->attachments as $attachment) {
Mas o $this->attachments retorna um array vazio... Ele nem está entrando na função para anexar a imagem ao e-mail...
O que pode ser?
Em configurções da loja a imagem está selecionada e até é exibida na home...
O logotipo estava em PNG e depois tentei com JPG e mesma coisa...
Por ldsbh
#15383
Reinstalei a pasta system para garantir que não fiz besteira...
Agora, não sei se tem motivo.
Mas o meu logotipo está dentro de uma pasta /logo.
As outras imagens eu apaguei...
#15388
Sem o fix Renato, mas caso queira ldsbh, você pode utilizar o código modificado para a nova versão que ainda vai ser lançada:
system/library/mail.php
Código: Selecionar todos
<?php
class Mail {
        protected $to;
        protected $from;
        protected $sender;
        protected $subject;
        protected $text;
        protected $html;
        protected $attachments = array();
        public $protocol = 'mail';
        public $hostname;
        public $username;
        public $password;
        public $port = 25;
        public $timeout = 5;
        public $newline = "\n";
        public $crlf = "\r\n";
        public $verp = false;
        public $parameter = '';

        public function setTo($to) {
                $this->to = $to;
        }

        public function setFrom($from) {
                $this->from = $from;
        }

        public function setSender($sender) {
                $this->sender = $sender;
        }

        public function setSubject($subject) {
                $this->subject = $subject;
        }

        public function setText($text) {
                $this->text = $text;
        }

        public function setHtml($html) {
                $this->html = $html;
        }

        public function addAttachment($filename) {
                $this->attachments[] = $filename;
        }

        public function send() {
                if (!$this->to) {
                        trigger_error('Error: E-Mail to required!');
                        exit();                 
                }

                if (!$this->from) {
                        trigger_error('Error: E-Mail from required!');
                        exit();                                 
                }

                if (!$this->sender) {
                        trigger_error('Error: E-Mail sender required!');
                        exit();                                 
                }

                if (!$this->subject) {
                        trigger_error('Error: E-Mail subject required!');
                        exit();                                 
                }

                if ((!$this->text) && (!$this->html)) {
                        trigger_error('Error: E-Mail message required!');
                        exit();                                 
                }

                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 . $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)) {
                                $handle = fopen($attachment, 'r');
                                
                                $content = fread($handle, filesize($attachment));
                                
                                fclose($handle);

                                $message .= '--' . $boundary . $this->newline;
                                $message .= 'Content-Type: application/octet-stream; name="' . basename($attachment) . '"' . $this->newline;
                                $message .= 'Content-Transfer-Encoding: base64' . $this->newline;
                                $message .= 'Content-Disposition: attachment; filename="' . basename($attachment) . '"' . $this->newline;
                                $message .= 'Content-ID: <' . basename(urlencode($attachment)) . '>' . $this->newline;
                                $message .= 'X-Attachment-Id: ' . basename(urlencode($attachment)) . $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) {
                                trigger_error('Error: ' . $errstr . ' (' . $errno . ')');
                                exit();                                 
                        } 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) {
                                                trigger_error('Error: STARTTLS not accepted from server!');
                                                exit();                                                         
                                        }
                                }

                                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) {
                                                trigger_error('Error: EHLO not accepted from server!');
                                                exit();                                                         
                                        }

                                        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) {
                                                trigger_error('Error: AUTH LOGIN not accepted from server!');
                                                exit();                                         
                                        }

                                        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) {
                                                trigger_error('Error: Username not accepted from server!');
                                                exit();                                                         
                                        }

                                        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) {
                                                trigger_error('Error: Password not accepted from server!');
                                                exit();                                                         
                                        }
                                } 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) {
                                                trigger_error('Error: HELO not accepted from server!');
                                                exit();                                                 
                                        }
                                }

                                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) {
                                        trigger_error('Error: MAIL FROM not accepted from server!');
                                        exit();                                                 
                                }

                                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)) {
                                                trigger_error('Error: RCPT TO not accepted from server!');
                                                exit();                                                 
                                        }
                                } 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)) {
                                                        trigger_error('Error: RCPT TO not accepted from server!');
                                                        exit();                                                         
                                                }
                                        }
                                }

                                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) {
                                        trigger_error('Error: DATA not accepted from server!');
                                        exit();                                         
                                }
                
                                // 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) {
                                        trigger_error('Error: DATA not accepted from server!');
                                        exit();                                         
                                }
                                
                                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) {
                                        trigger_error('Error: QUIT not accepted from server!');
                                        exit();                                         
                                }

                                fclose($handle);
                        }
                }
        }
}
?>
Espero ter ajudado :D
Por ldsbh
#15452
Senhores,

Muito estranho a logo não aparecer.
Tenho uma conta particular na HostGator. Solicitei a liberação e fui atendido.
Instalei uma loja do zero e só configurei o e-mail por SMTP usando o google app.
Cadastrei um cliente e o e-mail de confirmação de cadastro do cliente funcionou mostrando a LOGO...
Fiz uma compra... E depois no admin alterei o status da compra...
Os e-mails chegam normal... mas sem a logo...

Com vocês é diferente? Testei até com outro servidor...

E Manoel Vidal,
Testei código que enviou... Ele submete o e-mail mas sem a logo...
Mas dá um alerta...
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/espir408/public_html/livraria/system/library/mail.php:1) in /home/espir408/public_html/livraria/system/library/session.php on line 11
#15453
o erro acontece porque o arquivo foi salvo em "UTF-8 com BOM" ou porque ele contém espaços antes de <?php ou depois de ?>

Converta para "UTF-8 sem BOM" com o Notepad++
Por ldsbh
#15454
Renato Frota escreveu:o erro acontece porque o arquivo foi salvo em "UTF-8 com BOM" ou porque ele contém espaços antes de <?php ou depois de ?>

Converta para "UTF-8 sem BOM" com o Notepad++
Mas funciona... Foi só um alerta...
De qualquer forma, como disse, o único email que foi com a logo (padrão do opencart, pois foi uma instalação zerada) foi o email de cadastro...
Os emails de confirmação não tem a logo...
No sistema de vocês é diferente?
Sempre vai com a logo?
Estou quase colocando na mão essa logo...
#15458
Aqui tanto os e-mails de cadastro do cliente quanto os de pedido vão com a logo da loja, só não reparei se os e-mails de acompanhamento do pedido vão com logo, mas vou verificar.

Espero ter ajudado :D
Por ldsbh
#15478
Pelos testes que fiz aqui ele não envia o logotipo da loja no email de mudança de status do pedido...
Para o cadastro de clientes até existe um template é chamado o logotipo da loja. E o sistema usa esse template para envio do e-mail.
Agora se é possível criar um template personalizado para o e-mail de alteração de status desconheço e nas pesquisas pelo google não encontrei nada...
Seria muito interessante se fosse possível personalizar esses e-mails...
Os amigos mais experientes saberiam informar algo a respeito?