Page 1 of 1

Mail problem NOT FIXED

Posted: Wed Dec 02, 2009 7:25 pm
by arrakis99
Hello,
I've changed the mail.php class as suggested by Daniel in the followinf thread (Mail problem fix)

http://forum.opencart.com/viewtopic.php?f=31&t=8075

BUT, after some testing I can tell you that the problem is still alive :-[

Here is my setup and what is happening:

- My server is Suse Linux based

- OC is configured to send mails through "mail" function (not SMTP)

- If from OC I send an email to a customer that has a gmail or yahoo account and he/she reads the email through the web mail, then the mail is READABLE
- If the customer use Outlook to read the emails, then the mails sent by OC are UNREADABLE
- The same thing happen with "confirmation" emails

Obviously I cannot tell to my customer to not use Outlook and the UNREADABLE MAIL PROBLEM
is a really big one...

Please help me...

Thanks a lot for you efforts

P.S.: OpenCart is a wonderful thing !

Re: Mail problem NOT FIXED

Posted: Wed Dec 02, 2009 10:21 pm
by flawless
I have the same problem!

Re: Mail problem NOT FIXED

Posted: Wed Dec 02, 2009 11:08 pm
by fido-x
The bug is not in OpenCart. The bug is Outlook (I mean in Outlook ;D )! It seems to be the only email client that has problems with emails sent out by OpenCart.

Re: Mail problem NOT FIXED

Posted: Thu Dec 03, 2009 12:34 am
by Xsecrets
fido-x wrote:The bug is not in OpenCart. The bug is Outlook (I mean in Outlook ;D )! It seems to be the only email client that has problems with emails sent out by OpenCart.
well unfortunately it is also the most used mail client on the planet probably, so just saying sorry it doesn't work won't cut it. it works just fine with mail from all other ecommerce/cms/whatever and it needs to work with opencart. I know it may be a pain to deal with, but email not working with outlook is pretty much a dealbreaker for ecommerce.

Re: Mail problem NOT FIXED

Posted: Thu Dec 03, 2009 1:57 am
by gilbe
Hi,

Ok so I dont know how well coded or safe this is, so someone let me know. But what I've done is taken off the "base64" encryption from the emails in the header and changed it to 8bit. This seems to have cured the visible problem with outlook (and other MS products) not working however, in the header source code i am still seeing a parse error which I dont know how to shake.

Im not going to loose sleep over it as the problem is fixed ... on the outside anyway.

Re: Mail problem NOT FIXED

Posted: Thu Dec 03, 2009 9:52 pm
by flawless
I've resolved the problem.

In file system/library/mail.php the string
public $eol = "\r\n";
has been changed to
public $eol = "\n";

I'm using the linux webhosting and it resolve the problem.

Re: Mail problem NOT FIXED

Posted: Thu Dec 03, 2009 9:56 pm
by gilbe
Yeah thats similar to what ive done.. but didnt change the EOL part.. just the base64 to 8bit... in your case 7bit

oh and I got the parse error to go away... they were caused by the boundary's ... a little bit of tweaking sorted them out

Re: Mail problem NOT FIXED

Posted: Thu Dec 03, 2009 10:39 pm
by flawless
Thanks Glibe
The problem has been resolved.

In file system/library/mail.php the follwing string has been changed:
//public $eol = "\r\n";
public $eol = "\n";

On linux webhosting it is working properly.

Re: Mail problem NOT FIXED

Posted: Fri Dec 04, 2009 3:29 pm
by arrakis99
I've resolved the problem.

In file system/library/mail.php the string
public $eol = "\r\n";
has been changed to
public $eol = "\n";

I'm using the linux webhosting and it resolve the problem.
Hello... I cannot find such a string in the recent mail.php class published by Daniel...
in which mail.php I must replace the string that you have suggested ?

Could you please paste here the right mail.php class to resolve the problem ?

Thanks a lot !

Re: Mail problem NOT FIXED

Posted: Fri Dec 04, 2009 4:57 pm
by Daniel
What would be the 100~% fix for this sort of problem?

reciving email works fine for me via outlook.

Re: Mail problem NOT FIXED

Posted: Fri Dec 04, 2009 9:33 pm
by arrakis99
Hello Daniel,
I don't really know what would be the 100% fix of this problem.
The customers of mine that use outlook receive weird and unreadable emails.
I've have replaced the mail.php class as you suggested but the problem is still here.

I asked for the right and latest mail.php class and I think I have it (I think because I have replaced and tested several mail.php classes published here but without seccess)

The best solution to avoid confusion would be to make a "sticky" post with the right php mail class.

One question: I have OC 1.3.2 ... if I "grab" the mail.php class from OC 1.3.4 would it work in OC 1.3.2 ?

Thanks Daniel

Re: Mail problem NOT FIXED

Posted: Fri Dec 04, 2009 10:19 pm
by gilbe

Code: Select all

<?php
final class Mail {
   protected $to;
     protected $from;
     protected $sender;
     protected $subject;
     protected $text;
     protected $html;
     protected $attachments = array();
   protected $protocol = 'mail';
   protected $hostname;
   protected $username;
   protected $password;
   protected $port = 25;
   protected $timeout = 5;

   public function __construct($protocol = 'mail', $hostname = '', $username = '', $password = '', $port = '25', $timeout = '5') {
      $this->protocol = $protocol;
      $this->hostname = $hostname;
      $this->username = $username;
      $this->password = $password;
      $this->port = $port;
      $this->timeout = $timeout;   
   }
   
   public function setTo($to) {
       $this->to = $to;
     }
   
     public function setFrom($from) {
       $this->from = $from;
     }
   
   public function addheader($header, $value) {
      $this->headers[$header] = $value;
   }
   
     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($attachment) {
      if (!is_array($attachment)) {
         $this->attachments[] = $attachment;
      } else{
         $this->attachments = array_merge($this->attachments, $attachment);
      }
     }

     public function send() {   
       if (!$this->to) {
            exit('Error: E-Mail to required!');
       }
   
       if (!$this->from) {
            exit('Error: E-Mail from required!');
       }
   
       if (!$this->sender) {
            exit('Error: E-Mail sender required!');
       }
      
      if (!$this->subject) {
            exit('Error: E-Mail subject required!');
       }
         
      if ((!$this->text) && (!$this->html)) {
            exit('Error: E-Mail message required!');
       }

      if (is_array($this->to)) {
            $to = implode(',', $this->to);
       } else {
            $to = $this->to;
       }
        
      $boundary = '----=_NextPart_' . md5(time()); 

      if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')) {
            $eol = "\r\n";
       } elseif (strtoupper(substr(PHP_OS, 0, 3)=='MAC')) {
            $eol = "\r";
       } else {
            $eol = "\n";
       }    
      
      $header = '';
      
      if ($this->protocol != 'mail') {
         $header .= 'To: ' . $to . $eol;
         $header .= 'Subject: ' . $this->subject . $eol;
      }
      
      $header .= 'From: ' . $this->sender . '<' . $this->from . '>' . $eol;
       $header .= 'Reply-To: ' . $this->sender . '<' . $this->from . '>' . $eol;   
      $header .= 'Return-Path: ' . $this->from . $eol;
     $header .= 'X-Mailer: PHP/' . phpversion() . $eol; 
       $header .= 'MIME-Version: 1.0' . $eol;
      $header .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '"' . $eol; 
   
      if (!$this->html) {
           $message  = '--' . $boundary . $eol; 
           $message .= 'Content-Type: text/plain; charset="utf-8"' . $eol;
           $message .= 'Content-Transfer-Encoding: 8bit' . $eol . $eol;
            $message .= $this->text . $eol;
      } else {
           $message  = '--' . $boundary . $eol;
          //$message .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '_alt"' . $eol . $eol;
           //$message .= '--' . $boundary . '_alt' . $eol;
           $message .= 'Content-Type: text/plain; charset="utf-8"' . $eol;
           $message .= 'Content-Transfer-Encoding: 8bit' . $eol;
    
           if ($this->text) {
              $message .= $this->text . $eol;
           } else {
             $message .= 'This is a HTML email and your email client software does not support HTML email!' . $eol;
            }   
    
           $message .= '--' . $boundary . $eol;
            $message .= 'Content-Type: text/html; charset="utf-8"' . $eol;
            $message .= 'Content-Transfer-Encoding: 8bit' . $eol . $eol;
           $message .= $this->html . $eol;
         $message .= '--' . $boundary . '--' . $eol;      
      }
      
       foreach ($this->attachments as $attachment) { 
            $filename = basename($attachment); 
            $handle = fopen($attachment, 'r');
            $content = fread($handle, filesize($attachment));
     
           fclose($handle); 
    
            $message .= '--' . $boundary . $eol;
            $message .= 'Content-Type: application/octetstream' . $eol;   
            $message .= 'Content-Transfer-Encoding: 8bit' . $eol;
            $message .= 'Content-Disposition: attachment; filename="' . $filename . '"' . $eol;
            $message .= 'Content-ID: <' . $filename . '>' . $eol . $eol;
            $message .= $content . $eol;
       } 

      if ($this->protocol == 'mail') {
         ini_set('sendmail_from', $this->from);
      
          mail($to, $this->subject, $message, $header); 
      } elseif ($this->protocol == 'smtp') {
         $handle = fsockopen($this->hostname, $this->port, $errno, $errstr, $this->timeout);   
         
         if (!$handle) {
            error_log('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' . $eol);
               
               
               while ($line = fgets($handle, 515)) {
                  $reply .= $line;
               
                  if (substr($line, 3, 1) == ' ') {
                     break;
                  }
               }
            
               if (substr($reply, 0, 3) != 220) {
                  error_log('Error: STARTTLS not accepted from server!');
               }               
            }
         
            if (!empty($this->username)  && !empty($this->password)) {
               fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . $eol);
               
               $reply = '';
            
               while ($line = fgets($handle, 515)) {
                  $reply .= $line;
               
                  if (substr($line, 3, 1) == ' ') {
                     break;
                  }
               }
            
               if (substr($reply, 0, 3) != 250) {
                  error_log('Error: EHLO not accepted from server!');
               }
               
               fputs($handle, 'AUTH LOGIN' . $eol);
   
               $reply = '';
            
               while ($line = fgets($handle, 515)) {
                  $reply .= $line;
               
                  if (substr($line, 3, 1) == ' ') {
                     break;
                  }
               }
               
               if (substr($reply, 0, 3) != 334) {
                  error_log('Error: AUTH LOGIN not accepted from server!');
               }
   
               fputs($handle, base64_encode($this->username) . $eol);
   
               $reply = '';
            
               while ($line = fgets($handle, 515)) {
                  $reply .= $line;
               
                  if (substr($line, 3, 1) == ' ') {
                     break;
                  }
               }
               
               if (substr($reply, 0, 3) != 334) {
                  error_log('Error: Username not accepted from server!');
               }            
   
               fputs($handle, base64_encode($this->password) . $eol);
   
               $reply = '';
            
               while ($line = fgets($handle, 515)) {
                  $reply .= $line;
               
                  if (substr($line, 3, 1) == ' ') {
                     break;
                  }
               }
               
               if (substr($reply, 0, 3) != 235) {
                  error_log('Error: Password not accepted from server!');               
               }   
            } else {
               fputs($handle, 'HELO ' . getenv('SERVER_NAME') . $eol);
   
               $reply = '';
            
               while ($line = fgets($handle, 515)) {
                  $reply .= $line;
               
                  if (substr($line, 3, 1) == ' ') {
                     break;
                  }
               }
               
               if (substr($reply, 0, 3) != 250) {
                  error_log('Error: HELO not accepted from server!');
               }            
            }
   
            fputs($handle, 'MAIL FROM: <' . $this->from . '>XVERP' . $eol);
   
            $reply = '';
         
            while ($line = fgets($handle, 515)) {
               $reply .= $line;
            
               if (substr($line, 3, 1) == ' ') {
                  break;
               }
            }
            
            if (substr($reply, 0, 3) != 250) {
               error_log('Error: MAIL FROM not accepted from server!');
            }
            
            if (!is_array($this->to)) {
               fputs($handle, 'RCPT TO: <' . $this->to . '>' . $eol);
      
               $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)) {
                  error_log('Error: RCPT TO not accepted from server!');
               }         
            } else {
               foreach ($this->to as $recipient) {
                  fputs($handle, 'RCPT TO: <' . $recipient . '>' . $eol);
         
                  $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)) {
                     error_log('Error: RCPT TO not accepted from server!');
                  }                  
               }
            }
   
            fputs($handle, 'DATA' . $eol);
   
            $reply = '';
         
            while ($line = fgets($handle, 515)) {
               $reply .= $line;
            
               if (substr($line, 3, 1) == ' ') {
                  break;
               }
            }
                  
            if (substr($reply, 0, 3) != 354) {
               error_log('Error: DATA not accepted from server!');
            }
            
            fputs($handle, $header . $message . $eol);
            fputs($handle, '.' . $eol);
            
            $reply = '';
         
            while ($line = fgets($handle, 515)) {
               $reply .= $line;
            
               if (substr($line, 3, 1) == ' ') {
                  break;
               }
            }
            
            if (substr($reply, 0, 3) != 250) {
               error_log('Error: DATA not accepted from server!');
            }
   
            fputs($handle, 'QUIT' . $eol);
   
            $reply = '';
         
            while ($line = fgets($handle, 515)) {
               $reply .= $line;
            
               if (substr($line, 3, 1) == ' ') {
                  break;
               }
            }
            
            if (substr($reply, 0, 3) != 221) {
               error_log('Error: QUIT not accepted from server!');
            }         
            
            fclose($handle);
         }
      }
   }
}
?>
This is the mail.php Im now using with 1.3.2 and it works well. I have taken of the base64 encryption though as I didn't think it was necessary for the emails that Im sending. Have also changed the boundarys around a little bit to stop parsing errors in the mail clients.

Might want to have Daniel check over it though to make sure it wont break anything else in the system though.

Re: Mail problem NOT FIXED

Posted: Sun Dec 06, 2009 1:35 am
by iloveopencart
Nice job, gilbe! Worked for me, too.

Re: Mail problem NOT FIXED

Posted: Wed Dec 09, 2009 3:12 am
by maema
SUPER ! WORK ON ME ... I'm using mail fom apple !

Re: Mail problem NOT FIXED

Posted: Wed Dec 09, 2009 8:45 am
by deeve
Worked as PHP MAIL for me in plain text but for some reason I can't get SMTP to work on my host, UK2net. If I select SMTP I get this php header error in Admin:

Code: Select all

Warning: fsockopen() [function.fsockopen]: unable to connect to mail.uptightrecords.co.uk:25 (Connection refused) in /mypath/system/library/mail.php on line 158
imagine it's something to do with the smtp timeout.

Also the CSS in Admin Nav goes all screwy!

Re: Mail problem NOT FIXED

Posted: Wed Dec 09, 2009 9:55 am
by Daniel
I think its to do with not using the right setting. port maybe or maybe need ssl://

try googling the mail settings for your provider.

Re: Mail problem NOT FIXED

Posted: Wed Dec 09, 2009 4:20 pm
by deeve
I've sent my client's ISP a support ticket & will inform others of the result, just in case there's any more UK2.net customers on here - port setting was correct. His last store ran on ZenCart which used PHP mail with no probs.

Re: Mail problem NOT FIXED

Posted: Wed Dec 09, 2009 5:36 pm
by deeve
re: UK2.net & mail probs

Doh! Sometimes the answer is just staring me in the face.. :o

Turns out Outlook was placing my emails into Junk E-Mail folder as unrecognized. This then made them appear as plain text as Outlook strips Junk mail by default. When returned to Inbox, they regain their HTML attributes & all's well!

Re: Mail problem NOT FIXED

Posted: Fri Dec 11, 2009 5:39 am
by flawless
gilbe wrote: This is the mail.php Im now using with 1.3.2 and it works well. I have taken of the base64 encryption though as I didn't think it was necessary for the emails that Im sending. Have also changed the boundarys around a little bit to stop parsing errors in the mail clients.

Might want to have Daniel check over it though to make sure it wont break anything else in the system though.
I have non-english site and some my clients received the messages with headers
From: ?ds? ?ds? <info@mydomain>
Subject: ?ness??d?

The following strings should be added right after the string:
$header = '';
to correct "Subject" and "From" headers for some mail servers:
$this->subject = '=?UTF-8?B?'. base64_encode($this->subject) .'?=';
$this->sender = '=?UTF-8?B?'. base64_encode($this->sender) .'?=';

It fixed the bug.