Opencart SMTP mail sorunu yaşıyorsanız doğru yerdesiniz.Çok sık rastlanan problemlerden biri olan mail problemi opencart kullanıcıların bir hayli canını sıkmaktadır.Opencart’da mail problemi yaşıyorsanız sebebi genelikle ;
– Yanlış mail ayarları kullanımı ( port vs)
-Yeni çıkan opencart versiyonlarda yapılan fonksiyon hataları
– Hosting firmalarının uyguladığı katı mail protokol ayarları ( bazen bir hosting firmasında sorunsuz çalışan mail fonksiyonu başka bir hosting firmasında çalışmamaktadır )
Üstelik yanlış ayarlarla,problemli fonksiyonlarla mail problemi yaşadığınızda sisteminizin bir çok kısmında hatalar alabilirsiniz.Panik yapmanıza gerek yok , opencart mail smtp sorununu çözdüğümüzde tüm problemler ortadan kalkacaktır. Örnek hata görseli ;
” SyntaxError: Unexpected end of JSON input ” hatası.
Gelelim problemin çözümüne.Öncelikle smtp mail ayarlarımız doğru mu kontrol edelim.Örnek opencart smtp mail ayarları aşağıdadır(webmail smtp için).
Sistem>Mağazalar>Düzenle>E-Posta yollarını izliyoruz.
İşlemleri gerçekleştirdikten sonra sistemimizi kontrol edelim.(örnek üye kaydı , alışveriş oluşturarak vs.).
Eğer problem hala devam ediyorsa mail dosyamızı değiştirmekte çözümü arayacağız ;
system > library > mail.php yollarını izleyip mail.php dosyasını buluyoruz.Kodları aşagıdaki kodlarla değiştiriyoruz ve kaydediyoruz ;
<?php class Mail { protected $to; protected $from; protected $sender; protected $replyto; protected $subject; protected $text; protected $html; protected $attachments = array(); public $protocol = 'mail'; public $smtp_hostname; public $smtp_username; public $smtp_password; public $smtp_port = 587; public $smtp_timeout = 5; public $newline = "\n"; public $verp = false; public $parameter = ''; public function __construct($config = array()) { foreach ($config as $key => $value) { if ($value) { $this->$key = $value; } } } public function setTo($to) { $this->to = html_entity_decode($to, ENT_QUOTES, 'UTF-8'); } public function setFrom($from) { $this->from = html_entity_decode($from, ENT_QUOTES, 'UTF-8'); } public function setSender($sender) { $this->sender = html_entity_decode($sender, ENT_QUOTES, 'UTF-8'); } public function setReplyTo($reply_to) { $this->replyto = html_entity_decode($reply_to, ENT_QUOTES, 'UTF-8'); } public function setSubject($subject) { $this->subject = html_entity_decode($subject, ENT_QUOTES, 'UTF-8'); } public function setText($text) { $this->text = html_entity_decode($text, ENT_QUOTES, 'UTF-8'); } public function setHtml($html) { $this->html = html_entity_decode($html, ENT_QUOTES, 'UTF-8'); } 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 (!$this->replyto) { $this->setReplyTo($this->sender); } if (is_array($this->to)) { $to = implode(',', $this->to); } else { $to = $this->to; } $boundary = '----=_NextPart_' . md5(time()); $header = 'MIME-Version: 1.0' . $this->newline; if ($this->protocol != 'mail') { $header .= 'To: ' . $to . $this->newline; $header .= 'Subject: ' . '=?UTF-8?B?' . base64_encode($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: =?UTF-8?B?' . base64_encode($this->replyto) . '?=' . ' <' . $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') { $is_tls = substr($this->smtp_hostname, 0, 3) == 'tls'; $hostname = $is_tls ? substr($this->smtp_hostname, 6) : $this->smtp_hostname; $handle = fsockopen($hostname, $this->smtp_port, $errno, $errstr, $this->smtp_timeout); if (!$handle) { trigger_error('Error: ' . $errstr . ' (' . $errno . ')'); exit(); } else { if (substr(PHP_OS, 0, 3) != 'WIN') { socket_set_timeout($handle, $this->smtp_timeout, 0); } while ($line = fgets($handle, 515)) { if (substr($line, 3, 1) == ' ') { break; } } fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . "\r\n"); $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(); } if ($is_tls) { fputs($handle, 'STARTTLS' . "\r\n"); $reply = ''; 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(); } stream_socket_enable_crypto($handle, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); } if (!empty($this->smtp_username) && !empty($this->smtp_password)) { fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . "\r\n"); $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' . "\r\n"); $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->smtp_username) . "\r\n"); $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->smtp_password) . "\r\n"); $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') . "\r\n"); $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' . "\r\n"); } else { fputs($handle, 'MAIL FROM: <' . $this->from . '>' . "\r\n"); } $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 . '>' . "\r\n"); $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 . '>' . "\r\n"); $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' . "\r\n"); $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 . "\r\n"); } else { fputs($handle, str_replace("\n", "\r\n", $result) . "\r\n"); } } } fputs($handle, '.' . "\r\n"); $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' . "\r\n"); $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); } } } }
(Yedeğinizi almayı unutmayınız.) Bu işlemden sonra smtp mail sorunu düzelecektir.Son olarak tekrar kontrolleri sağlayınız.Geçmiş olsun…
Allah razı olsun. dünyanın yazısı makalesi 3 aydır yapmadığım işlem kalmamıştı. çok çok teşekkür ederim.
bu şekilde sorun düzeliyor ama mail göndermiyor hocam bılgın olsun
opencart hangi sürümü için bu
opencart Sürüm 3.0.3.8 için malesef olmuyor
Hosting sağlayıcınızdan gerekli port bilgilerini doğruladınız mı?
Merhaba, öncelikle bilgi için teşekkür ederim. Fakat smtp dosyasını değiştirdiğimde 2. satırda hata veriyor.
Allah razı olsun, önce bir sorun olur diye korktum ancak çözüldü. Saatlerdir uğraşıyordum. Teşekkürler