Encode outgoing attachments that have lines longer than allowed per RFC. Otherwise...
[squirrelmail.git] / class / deliver / Deliver_SMTP.class.php
index e50a535522e79e76fb68c6dcf755c42e13246ab3..d2458729182c6ac03250ccbbcc534529c6dba94a 100644 (file)
@@ -5,7 +5,7 @@
  *
  * SMTP delivery backend for the Deliver class.
  *
- * @copyright © 1999-2006 The SquirrelMail Project Team
+ * @copyright © 1999-2007 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
@@ -62,11 +62,11 @@ class Deliver_SMTP extends Deliver {
         }
     }
 
-    function initStream($message, $domain, $length=0, $host='', $port='', $user='', $pass='', $authpop=false) {
+    function initStream($message, $domain, $length=0, $host='', $port='', $user='', $pass='', $authpop=false, $pop_host='') {
         global $use_smtp_tls,$smtp_auth_mech;
 
         if ($authpop) {
-            $this->authPop($host, '', $user, $pass);
+            $this->authPop($pop_host, '', $user, $pass);
         }
 
         $rfc822_header = $message->rfc822_header;
@@ -82,6 +82,10 @@ class Deliver_SMTP extends Deliver {
             $content_type->type1 == 'report' &&
             isset($content_type->properties['report-type']) &&
             $content_type->properties['report-type']=='disposition-notification') {
+            // reinitialize the from object because otherwise the from header somehow
+            // is affected. This $from var is used for smtp command MAIL FROM which
+            // is not the same as what we put in the rfc822 header.
+            $from = new AddressStructure();
             $from->host = '';
             $from->mailbox = '';
         }
@@ -136,8 +140,8 @@ class Deliver_SMTP extends Deliver {
         // Read ehlo response
         $tmp = $this->parse_ehlo_response($stream);
         if ($this->errorCheck($tmp,$stream)) {
-            // fall back to HELO if EHLO is not supported
-            if ($this->dlv_ret_nr == '500') {
+            // fall back to HELO if EHLO is not supported (error 5xx)
+            if ($this->dlv_ret_nr{0} == '5') {
                 fputs($stream, "HELO $helohost\r\n");
                 $tmp = fgets($stream,1024);
                 if ($this->errorCheck($tmp,$stream)) {
@@ -290,7 +294,7 @@ class Deliver_SMTP extends Deliver {
         }
 
         /* Ok, who is sending the message? */
-        $fromaddress = ($from->mailbox && $from->host) ?
+        $fromaddress = (strlen($from->mailbox) && $from->host) ?
             $from->mailbox.'@'.$from->host : '';
         fputs($stream, 'MAIL FROM:<'.$fromaddress.">\r\n");
         $tmp = fgets($stream, 1024);
@@ -301,7 +305,7 @@ class Deliver_SMTP extends Deliver {
         /* send who the recipients are */
         for ($i = 0, $cnt = count($to); $i < $cnt; $i++) {
             if (!$to[$i]->host) $to[$i]->host = $domain;
-            if ($to[$i]->mailbox) {
+            if (strlen($to[$i]->mailbox)) {
                 fputs($stream, 'RCPT TO:<'.$to[$i]->mailbox.'@'.$to[$i]->host.">\r\n");
                 $tmp = fgets($stream, 1024);
                 if ($this->errorCheck($tmp, $stream)) {
@@ -312,7 +316,7 @@ class Deliver_SMTP extends Deliver {
 
         for ($i = 0, $cnt = count($cc); $i < $cnt; $i++) {
             if (!$cc[$i]->host) $cc[$i]->host = $domain;
-            if ($cc[$i]->mailbox) {
+            if (strlen($cc[$i]->mailbox)) {
                 fputs($stream, 'RCPT TO:<'.$cc[$i]->mailbox.'@'.$cc[$i]->host.">\r\n");
                 $tmp = fgets($stream, 1024);
                 if ($this->errorCheck($tmp, $stream)) {
@@ -323,7 +327,7 @@ class Deliver_SMTP extends Deliver {
 
         for ($i = 0, $cnt = count($bcc); $i < $cnt; $i++) {
             if (!$bcc[$i]->host) $bcc[$i]->host = $domain;
-            if ($bcc[$i]->mailbox) {
+            if (strlen($bcc[$i]->mailbox)) {
                 fputs($stream, 'RCPT TO:<'.$bcc[$i]->mailbox.'@'.$bcc[$i]->host.">\r\n");
                 $tmp = fgets($stream, 1024);
                 if ($this->errorCheck($tmp, $stream)) {
@@ -426,28 +430,30 @@ class Deliver_SMTP extends Deliver {
         if (!$pop_server) {
             $pop_server = 'localhost';
         }
-        $popConnection = fsockopen($pop_server, $pop_port, $err_no, $err_str);
+        $popConnection = @fsockopen($pop_server, $pop_port, $err_no, $err_str);
         if (!$popConnection) {
             error_log("Error connecting to POP Server ($pop_server:$pop_port)"
                 . " $err_no : $err_str");
+            return false;
         } else {
             $tmp = fgets($popConnection, 1024); /* banner */
             if (substr($tmp, 0, 3) != '+OK') {
-                return(0);
+                return false;
             }
             fputs($popConnection, "USER $user\r\n");
             $tmp = fgets($popConnection, 1024);
             if (substr($tmp, 0, 3) != '+OK') {
-                return(0);
+                return false;
             }
             fputs($popConnection, 'PASS ' . $pass . "\r\n");
             $tmp = fgets($popConnection, 1024);
             if (substr($tmp, 0, 3) != '+OK') {
-                return(0);
+                return false;
             }
             fputs($popConnection, "QUIT\r\n"); /* log off */
             fclose($popConnection);
         }
+        return true;
     }
 
     /**
@@ -510,5 +516,3 @@ class Deliver_SMTP extends Deliver {
         return $ret;
     }
 }
-
-?>