Attachments now opened with binary flag, for windows compatibility
[squirrelmail.git] / src / compose.php
index f8746036da3c980c2cb68e589ee77adc3e651b9f..d130c06f2d568bd6b2b8f05589f4eecc12863550 100644 (file)
@@ -51,7 +51,7 @@ function replyAllString($header) {
              $cur_email_address = getPref($data_dir, $username, 
                                          'email_address' . $i);
              $cur_email_address = strtolower($cur_email_address);
-            $excl_ar[$cur_email_address] = '';
+         $excl_ar[$cur_email_address] = '';
          }
        }
    }
@@ -67,9 +67,9 @@ function replyAllString($header) {
    $url_replytoallcc = '';
    foreach( $url_replytoall_ar as $email => $personal) {
       if ($personal) {
-        $url_replytoallcc .= ", \"$personal\" <$email>";
+     $url_replytoallcc .= ", \"$personal\" <$email>";
       } else {
-        $url_replytoallcc .= ', '. $email;    
+     $url_replytoallcc .= ', '. $email;    
       }
    }
    $url_replytoallcc = substr($url_replytoallcc,2);
@@ -79,28 +79,30 @@ function replyAllString($header) {
 function getforwardHeader($orig_header) {
     global $editor_size;
 
-   $display = array(
-                     _("Subject") => strlen(_("Subject")),
-                     _("From")    => strlen(_("From")),                     
-                     _("Date")    => strlen(_("Date")),                     
-                     _("To")      => strlen(_("To")),               
-                     _("Cc")      => strlen(_("Cc"))                
-                    );
+   $display = array( _("Subject") => strlen(_("Subject")),
+                     _("From")    => strlen(_("From")),          
+                     _("Date")    => strlen(_("Date")),          
+                     _("To")      => strlen(_("To")),            
+                     _("Cc")      => strlen(_("Cc")) );
    $maxsize = max($display);
    $indent = str_pad('',$maxsize+2);
    foreach($display as $key => $val) {
       $display[$key] = $key .': '. str_pad('', $maxsize - $val);
    }      
-   $bodyTop =  str_pad(' '._("Original Message").' ',$editor_size -2,'-',STR_PAD_BOTH);
-   $bodyTop .=  "\n". $display[_("Subject")] . decodeHeader($orig_header->subject) . "\n" .
-        $display[_("From")] . decodeHeader($orig_header->getAddr_s('from',"\n$indent")) . "\n" .
-        $display[_("Date")] . getLongDateString( $orig_header->date ). "\n" .
-        $display[_("To")] . decodeHeader($orig_header->getAddr_s('to',"\n$indent")) ."\n";
+   $bodyTop =  str_pad(' '._("Original Message").' ',$editor_size -2,'-',STR_PAD_BOTH) .
+               "\n". $display[_("Subject")] . 
+               decodeHeader($orig_header->subject) . "\n" .
+               $display[_("From")] . 
+               decodeHeader($orig_header->getAddr_s('from',"\n$indent")) . "\n" .
+               $display[_("Date")] . 
+               getLongDateString( $orig_header->date ). "\n" .
+               $display[_("To")] . 
+               decodeHeader($orig_header->getAddr_s('to',"\n$indent")) ."\n";
   if ($orig_header->cc != array() && $orig_header->cc !='') {
      $bodyTop .= $display[_("Cc")] . decodeHeader($orig_header->getAddr_s('cc',"\n$indent")) . "\n";
   }
-  $bodyTop .= str_pad('', $editor_size -2 , '-');
-  $bodyTop .= "\n";
+  $bodyTop .= str_pad('', $editor_size -2 , '-') .
+              "\n";
   return $bodyTop;
 }
 /* ----------------------------------------------------------------------- */
@@ -191,12 +193,12 @@ if (isset($draft)) {
         else {
             if ($compose_new_win == '1') {
                 Header("Location: compose.php?saved_draft=yes&session=$composesession");
-            exit();
+                exit();
             }
             else {
-            Header("Location: right_main.php?mailbox=$draft_folder&sort=$sort".
-                   "&startMessage=1&note=".urlencode($draft_message));
-            exit();
+                Header("Location: right_main.php?mailbox=$draft_folder&sort=$sort".
+                       "&startMessage=1&note=".urlencode($draft_message));
+                exit();
             }
         }
     }
@@ -377,8 +379,8 @@ elseif (isset($sigappend)) {
         foreach($delete as $index) {
             $attached_file = $hashed_attachment_dir . '/'
                            . $attachments[$index]['localfilename'];
-           unlink ($attached_file);
-           unset ($attachments[$index]);
+            unlink ($attached_file);
+            unset ($attachments[$index]);
         }
         setPref($data_dir, $username, 'attachments', serialize($attachments));
     }
@@ -398,10 +400,18 @@ elseif (isset($sigappend)) {
 
     $newmail = true;
 
-    if (!isset($passed_ent_id)) $passed_ent_id = '';
-    if (!isset($passed_id)) $passed_id = '';    
-    if (!isset($mailbox)) $mailbox = '';
-    if (!isset($action)) $action = '';
+    if (!isset($passed_ent_id)) {
+        $passed_ent_id = '';
+    }
+    if (!isset($passed_id)) {
+        $passed_id = '';    
+    }
+    if (!isset($mailbox)) {
+        $mailbox = '';
+    }    
+    if (!isset($action)) {
+        $action = '';
+    }
     
     $values = newMail($mailbox,$passed_id,$passed_ent_id, $action, $session);
 
@@ -427,64 +437,64 @@ exit();
 function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $session='') {
     global $editor_size, $default_use_priority, $body,
            $use_signature, $composesession, $data_dir, $username,
-          $username, $key, $imapServerAddress, $imapPort;
+           $username, $key, $imapServerAddress, $imapPort;
 
     $send_to = $send_to_cc = $send_to_bcc = $subject = $identity = '';
     $mailprio = 3;
 
     if ($passed_id) {
         $imapConnection = sqimap_login($username, $key, $imapServerAddress,
-                          $imapPort, 0);
-    
+        $imapPort, 0);
+
         sqimap_mailbox_select($imapConnection, $mailbox);
         $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
-       $body = '';
-       if ($passed_ent_id) {
-          /* redefine the messsage in case of message/rfc822 */
-          $message = $message->getEntity($passed_ent_id);
-          /* message is an entity which contains the envelope and type0=message
-           * and type1=rfc822. The actual entities are childs from 
-           * $message->entities[0]. That's where the encoding and is located
-           */
-           
-          $entities = $message->entities[0]->findDisplayEntity 
-                      (array(), $alt_order = array('text/plain'));
-          if (!count($entities)) {
-              $entities = $message->entities[0]->findDisplayEntity 
-                      (array(), $alt_order = array('text/plain','html/plain'));
-           }
-          $orig_header = $message->rfc822_header; /* here is the envelope located */
-          /* redefine the message for picking up the attachments */
-          $message = $message->entities[0];
-          
-       } else {
-          $entities = $message->findDisplayEntity (array(), $alt_order = array('text/plain'));
-          if (!count($entities)) {
-              $entities = $message->findDisplayEntity (array(), $alt_order = array('text/plain','html/plain'));
-           }
-           $orig_header = $message->rfc822_header;                
-       }
+        $body = '';
+        if ($passed_ent_id) {
+            /* redefine the messsage in case of message/rfc822 */
+            $message = $message->getEntity($passed_ent_id);
+            /* message is an entity which contains the envelope and type0=message
+            * and type1=rfc822. The actual entities are childs from
+            * $message->entities[0]. That's where the encoding and is located
+            */
+
+            $entities = $message->entities[0]->findDisplayEntity
+            (array(), $alt_order = array('text/plain'));
+            if (!count($entities)) {
+                $entities = $message->entities[0]->findDisplayEntity
+                (array(), $alt_order = array('text/plain','html/plain'));
+            }
+            $orig_header = $message->rfc822_header; /* here is the envelope located */
+            /* redefine the message for picking up the attachments */
+            $message = $message->entities[0];
+
+        } else {
+            $entities = $message->findDisplayEntity (array(), $alt_order = array('text/plain'));
+            if (!count($entities)) {
+                $entities = $message->findDisplayEntity (array(), $alt_order = array('text/plain','html/plain'));
+            }
+            $orig_header = $message->rfc822_header;
+        }
         $encoding = $message->header->encoding;
-       $type0 = $message->type0;
-       $type1 = $message->type1;
+        $type0 = $message->type0;
+        $type1 = $message->type1;
         foreach ($entities as $ent) {
-           $unencoded_bodypart = mime_fetch_body($imapConnection, $passed_id, $ent);
-          $body_part_entity = $message->getEntity($ent);
-          $bodypart = decodeBody($unencoded_bodypart,
-                                 $body_part_entity->header->encoding);
-          if ($type1 == 'html') {
-              $bodypart = strip_tags($bodypart);
-          }
-          $body .= $bodypart;
-       }
-       if ($default_use_priority) {
-         $mailprio = substr($orig_header->priority,0,1);
-         if (!$mailprio) {
-            $mailprio = 3;
-         }
-       } else {
-         $mailprio = '';
-       }
+            $unencoded_bodypart = mime_fetch_body($imapConnection, $passed_id, $ent);
+            $body_part_entity = $message->getEntity($ent);
+            $bodypart = decodeBody($unencoded_bodypart,
+            $body_part_entity->header->encoding);
+            if ($type1 == 'html') {
+                $bodypart = strip_tags($bodypart);
+            }
+            $body .= $bodypart;
+        }
+        if ($default_use_priority) {
+            $mailprio = substr($orig_header->priority,0,1);
+            if (!$mailprio) {
+                $mailprio = 3;
+            }
+        } else {
+            $mailprio = '';
+        }
         ClearAttachments($session);
 
         $identity = '';
@@ -494,119 +504,116 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se
             $orig_from = $from_o->getAddress();
         } else {
             $orig_from = '';
-        }    
+        }
         if (!empty($idents) && $idents > 1) {
-           for ($i = 1; $i < $idents; $i++) {
-              $enc_from_name = '"'. 
-                              getPref($data_dir, 
-                                      $username, 
-                                      'full_name' . $i) .
-                 '" <' . getPref($data_dir, $username, 
-                                 'email_address' . $i) . '>';
-              if ($enc_from_name == $orig_from) {
-                  $identity = $i;
-                  break;
-              }
-           }
+            for ($i = 1; $i < $idents; $i++) {
+                $enc_from_name = '"'.
+                getPref($data_dir,
+                $username,
+                'full_name' . $i) .
+                '" <' . getPref($data_dir, $username,
+                'email_address' . $i) . '>';
+                if ($enc_from_name == $orig_from) {
+                    $identity = $i;
+                    break;
+                }
+            }
         }
-       
-       switch ($action) {
-       case ('draft'):
-           $use_signature = FALSE;
-          $send_to = $orig_header->getAddr_s('to');    
-          $send_to_cc = $orig_header->getAddr_s('cc');
-          $send_to_bcc = $orig_header->getAddr_s('bcc');
-           $subject = decodeHeader($orig_header->subject);
-
-           $body_ary = explode("\n", $body);
-           $cnt = count($body_ary) ;
-          $body = '';
-           for ($i=0; $i < $cnt; $i++) {
-             if (!ereg("^[>\\s]*$", $body_ary[$i])  || !$body_ary[$i]) {
-                 sqWordWrap($body_ary[$i], $editor_size );
-                 $body .= $body_ary[$i] . "\n";
-             }
-              unset($body_ary[$i]);
-           }
-          sqUnWordWrap($body);
-           getAttachments($message, $session, $passed_id, $entities, $imapConnection);
-          break;
+
+        switch ($action) {
+        case ('draft'):
+            $use_signature = FALSE;
+            $send_to = $orig_header->getAddr_s('to');
+            $send_to_cc = $orig_header->getAddr_s('cc');
+            $send_to_bcc = $orig_header->getAddr_s('bcc');
+            $subject = decodeHeader($orig_header->subject);
+
+            $body_ary = explode("\n", $body);
+            $cnt = count($body_ary) ;
+            $body = '';
+            for ($i=0; $i < $cnt; $i++) {
+                if (!ereg("^[>\\s]*$", $body_ary[$i])  || !$body_ary[$i]) {
+                    sqWordWrap($body_ary[$i], $editor_size );
+                    $body .= $body_ary[$i] . "\n";
+                }
+                unset($body_ary[$i]);
+            }
+            sqUnWordWrap($body);
+            getAttachments($message, $session, $passed_id, $entities, $imapConnection);
+            break;
         case ('edit_as_new'):
-           $send_to = $orig_header->getAddr_s('to');   
-           $send_to_cc = $orig_header->getAddr_s('cc');
-           $send_to_bcc = $orig_header->getAddr_s('bcc');
-           $subject = decodeHeader($orig_header->subject);
-           $mailprio = $orig_header->priority;
-           $orig_from = '';
-           getAttachments($message, $session, $passed_id, $entities, $imapConnection);
-          sqUnWordWrap($body);
-          break;
-       case ('forward'):
-          $send_to = '';
-           $subject = decodeHeader($orig_header->subject);
-           if ((substr(strtolower($subject), 0, 4) != 'fwd:') &&
-              (substr(strtolower($subject), 0, 5) != '[fwd:') &&
-              (substr(strtolower($subject), 0, 6) != '[ fwd:')) {
-              $subject = '[Fwd: ' . $subject . ']';
-           }
-          $body = getforwardHeader($orig_header) . $body;
-          sqUnWordWrap($body);
-           getAttachments($message, $session, $passed_id, $entities, $imapConnection);
-          break;
-       case ('forward_as_attachment'):
-           getMessage_RFC822_Attachment($message, $session, $passed_id, $passed_ent_id, $imapConnection);
-          $body = '';
-          break;
+            $send_to = $orig_header->getAddr_s('to');
+            $send_to_cc = $orig_header->getAddr_s('cc');
+            $send_to_bcc = $orig_header->getAddr_s('bcc');
+            $subject = decodeHeader($orig_header->subject);
+            $mailprio = $orig_header->priority;
+            $orig_from = '';
+            getAttachments($message, $session, $passed_id, $entities, $imapConnection);
+            sqUnWordWrap($body);
+            break;
+        case ('forward'):
+            $send_to = '';
+            $subject = decodeHeader($orig_header->subject);
+            if ((substr(strtolower($subject), 0, 4) != 'fwd:') &&
+                (substr(strtolower($subject), 0, 5) != '[fwd:') &&
+                (substr(strtolower($subject), 0, 6) != '[ fwd:')) {
+                $subject = '[Fwd: ' . $subject . ']';
+            }
+            $body = getforwardHeader($orig_header) . $body;
+            sqUnWordWrap($body);
+            getAttachments($message, $session, $passed_id, $entities, $imapConnection);
+            break;
+        case ('forward_as_attachment'):
+            getMessage_RFC822_Attachment($message, $session, $passed_id, $passed_ent_id, $imapConnection);
+            $body = '';
+            break;
         case ('reply_all'):
-          $send_to_cc = replyAllString($orig_header);
-       case ('reply'):
-           $send_to = $orig_header->reply_to;
-           if (is_object($send_to)) {
-              $send_to = $send_to->getAddr_s('reply_to');
-           } else {
-              $send_to = $orig_header->getAddr_s('from');
-           }
-              $subject =  decodeHeader($orig_header->subject);
-           $subject = str_replace('"', "'", $subject);
-           $subject = trim($subject);
-           if (substr(strtolower($subject), 0, 3) != 're:') {
-              $subject = 'Re: ' . $subject;
-           }
-           /* this corrects some wrapping/quoting problems on replies */
-           $rewrap_body = explode("\n", $body);
-
-           $body = getReplyCitation($orig_header->from->personal);        
-              $cnt = count($rewrap_body);
-           for ($i=0;$i<$cnt;$i++) {
-//              sqWordWrap($rewrap_body[$i], ($editor_size - 2));
-              if (preg_match("/^(>+)/", $rewrap_body[$i], $matches)) {
-                 $gt = $matches[1];
-                        $body .= '>' . str_replace("\n", "\n$gt ", $rewrap_body[$i]) ."\n";
-              } else {
-                 $body .= '> ' . $rewrap_body[$i] . "\n";
-             }
-             unset($rewrap_body[$i]);
-           }
-          break;
-       default:
-          break;
+            $send_to_cc = replyAllString($orig_header);
+        case ('reply'):
+            $send_to = $orig_header->reply_to;
+            if (is_object($send_to)) {
+                $send_to = $send_to->getAddr_s('reply_to');
+            } else {
+                $send_to = $orig_header->getAddr_s('from');
+            }
+            $subject =  decodeHeader($orig_header->subject);
+            $subject = str_replace('"', "'", $subject);
+            $subject = trim($subject);
+            if (substr(strtolower($subject), 0, 3) != 're:') {
+                $subject = 'Re: ' . $subject;
+            }
+            /* this corrects some wrapping/quoting problems on replies */
+            $rewrap_body = explode("\n", $body);
+
+            $body = getReplyCitation($orig_header->from->personal);
+            $cnt = count($rewrap_body);
+            for ($i=0;$i<$cnt;$i++) {
+                //              sqWordWrap($rewrap_body[$i], ($editor_size - 2));
+                if (preg_match("/^(>+)/", $rewrap_body[$i], $matches)) {
+                    $gt = $matches[1];
+                    $body .= '>' . str_replace("\n", "\n$gt ", $rewrap_body[$i]) ."\n";
+                } else {
+                    $body .= '> ' . $rewrap_body[$i] . "\n";
+                }
+                unset($rewrap_body[$i]);
+            }
+            break;
+            default:
+            break;
         }
-       sqimap_logout($imapConnection);
+        sqimap_logout($imapConnection);
     }
-    $ret = array(
-            'send_to' => $send_to, 
-           'send_to_cc' => $send_to_cc,
-           'send_to_bcc' => $send_to_bcc,           
-           'subject' => $subject,
-           'mailprio' => $mailprio,
-           'body' => $body,
-           'identity' => $identity
-           );
-    
+    $ret = array( 'send_to' => $send_to,
+                  'send_to_cc' => $send_to_cc,
+                  'send_to_bcc' => $send_to_bcc,
+                  'subject' => $subject,
+                  'mailprio' => $mailprio,
+                  'body' => $body,
+                  'identity' => $identity );
+
     return ($ret);
 } /* function newMail() */
 
-
 function getAttachments($message, $session, $passed_id, $entities, $imapConnection) {
     global $attachments, $attachment_dir, $username, $data_dir;
     
@@ -614,13 +621,13 @@ function getAttachments($message, $session, $passed_id, $entities, $imapConnecti
     if (!count($message->entities) || 
        ($message->type0 == 'message' && $message->type1 == 'rfc822')) {
         if ( !in_array($message->entity_id, $entities) && $message->entity_id) {
-           if ($message->type0 == 'message' && $message->type1 == 'rfc822') {
-              $filename = decodeHeader($message->rfc822_header->subject.'.eml');
+        if ($message->type0 == 'message' && $message->type1 == 'rfc822') {
+           $filename = decodeHeader($message->rfc822_header->subject.'.eml');
                if ($filename == "") {
                   $filename = "untitled-".$message->entity_id.'.eml';
                }
-           } else {
-              $filename = decodeHeader($message->getFilename());
+        } else {
+           $filename = decodeHeader($message->getFilename());
             }
             $localfilename = GenerateRandomString(32, '', 7);
             $full_localfilename = "$hashed_attachment_dir/$localfilename";
@@ -634,14 +641,14 @@ function getAttachments($message, $session, $passed_id, $entities, $imapConnecti
             $newAttachment['remotefilename'] = $filename;
             $newAttachment['type'] = strtolower($message->type0 .
                                                 '/' . $message->type1);
-           $newAttachment['id'] = strtolower($message->header->id);
-           $newAttachment['session'] = $session;
+            $newAttachment['id'] = strtolower($message->header->id);
+            $newAttachment['session'] = $session;
 
             /* Write Attachment to file */
-            $fp = fopen ("$hashed_attachment_dir/$localfilename", 'w');
+            $fp = fopen ("$hashed_attachment_dir/$localfilename", 'wb');
             fputs($fp, decodeBody(mime_fetch_body($imapConnection,
-                $passed_id, $message->entity_id),
-                $message->header->encoding));
+                  $passed_id, $message->entity_id),
+                  $message->header->encoding));
             fclose ($fp);
             $attachments[] = $newAttachment;
         }
@@ -659,33 +666,33 @@ function getMessage_RFC822_Attachment($message, $session, $passed_id,
     global $attachments, $attachment_dir, $username, $data_dir, $uid_support;
     $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
     if (!$passed_ent_id) {
-       $body_a = sqimap_run_command($imapConnection, 
-                 'FETCH '.$passed_id.' RFC822',
-                 true, $response, $readmessage, $uid_support);
+        $body_a = sqimap_run_command($imapConnection, 
+                                    'FETCH '.$passed_id.' RFC822',
+                                    TRUE, $response, $readmessage, 
+                                    $uid_support);
     } else {
         $body_a = sqimap_run_command($imapConnection, 
-                 'FETCH '.$passed_id.' BODY['.$passed_ent_id.']',
-                 true, $response, $readmessage, $uid_support);
-       $message = $message->parent;
+                                     'FETCH '.$passed_id.' BODY['.$passed_ent_id.']',
+                                     TRUE, $response, $readmessage, $uid_support);
+        $message = $message->parent;
     }
     if ($response = 'OK') {
-       $subject = encodeHeader($message->rfc822_header->subject);
-       array_shift($body_a);
-       $body = implode('', $body_a);
-       $body .= "\r\n";
-                       
-       $localfilename = GenerateRandomString(32, 'FILE', 7);
-       $full_localfilename = "$hashed_attachment_dir/$localfilename";
-               
-       $fp = fopen( $full_localfilename, 'w');
-       fwrite ($fp, $body);
-       fclose($fp);
-       $newAttachment = array();
-       $newAttachment['localfilename'] = $localfilename;
-       $newAttachment['type'] = "message/rfc822";
-       $newAttachment['remotefilename'] = $subject.'.eml';
-       $newAttachment['session'] = $session;
-       $attachments[] = $newAttachment;
+        $subject = encodeHeader($message->rfc822_header->subject);
+        array_shift($body_a);
+        $body = implode('', $body_a) . "\r\n";
+                
+        $localfilename = GenerateRandomString(32, 'FILE', 7);
+        $full_localfilename = "$hashed_attachment_dir/$localfilename";
+            
+        $fp = fopen( $full_localfilename, 'wb');
+        fwrite ($fp, $body);
+        fclose($fp);
+        $newAttachment = array();
+        $newAttachment['localfilename'] = $localfilename;
+        $newAttachment['type'] = "message/rfc822";
+        $newAttachment['remotefilename'] = $subject.'.eml';
+        $newAttachment['session'] = $session;
+        $attachments[] = $newAttachment;
     }
     setPref($data_dir, $username, 'attachments', serialize($attachments));
     return;
@@ -700,7 +707,7 @@ function showInputForm ($session, $values=false) {
            $username, $data_dir, $identity, $draft_id, $delete_draft,
            $mailprio, $default_use_mdn, $mdn_user_support, $compose_new_win,
            $saved_draft, $mail_sent, $sig_first, $edit_as_new, $action, 
-          $username;
+           $username;
 
     $subject = decodeHeader($subject, false);
     if ($values) {
@@ -753,8 +760,8 @@ function showInputForm ($session, $values=false) {
     }
     echo '<TABLE ALIGN=center CELLSPACING=0 BORDER=0>' . "\n";
     if ($compose_new_win == '1') {
-        echo '<TABLE ALIGN=CENTER BGCOLOR="'.$color[0].'" WIDTH="100%" BORDER=0>'."\n";
-        echo '   <TR><TD></TD><TD ALIGN="RIGHT"><INPUT TYPE="BUTTON" NAME="Close" onClick="return self.close()" VALUE='._("Close").'></TD></TR>'."\n";
+        echo '<TABLE ALIGN=CENTER BGCOLOR="'.$color[0].'" WIDTH="100%" BORDER=0>'."\n" .
+             '   <TR><TD></TD><TD ALIGN="RIGHT"><INPUT TYPE="BUTTON" NAME="Close" onClick="return self.close()" VALUE='._("Close").'></TD></TR>'."\n";
     }
     if ($location_of_buttons == 'top') {
         showComposeButtonRow();
@@ -865,21 +872,19 @@ function showInputForm ($session, $values=false) {
     if ($location_of_buttons == 'bottom') {
         showComposeButtonRow();
     } else {
-        echo '   <TR><TD COLSPAN=2 ALIGN=RIGHT>';
-        echo '     <INPUT TYPE=SUBMIT NAME=send VALUE="' . _("Send") . '">';
-        echo '     &nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>';
-        echo '   </TD></TR>' . "\n";
+        echo '   <TR><TD COLSPAN=2 ALIGN=RIGHT>' .
+             '     <INPUT TYPE=SUBMIT NAME=send VALUE="' . _("Send") . '">' .
+             '     &nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>' .
+             '   </TD></TR>' . "\n";
     }
 
     /* This code is for attachments */
-    echo '<table width="100%" cellpadding="0" cellspacing="4" align="center" border="0">';
-    echo '   <tr><td>';
-    echo '   <table width="100%" cellpadding="1" cellspacing="0" align="center"'.' border="0" bgcolor="'.$color[9].'">';
-    echo '      <tr><td>';
-    echo '      <table width="100%" cellpadding="3" cellspacing="0" align="center" border="0">';
-
-    
-    echo '   <TR>' . "\n" .
+    echo '<table width="100%" cellpadding="0" cellspacing="4" align="center" border="0">' .
+         '   <tr><td>' .
+         '   <table width="100%" cellpadding="1" cellspacing="0" align="center"'.' border="0" bgcolor="'.$color[9].'">' .
+         '      <tr><td>' .
+         '      <table width="100%" cellpadding="3" cellspacing="0" align="center" border="0">' .
+         '   <TR>' . "\n" .
          '     <TD VALIGN=MIDDLE ALIGN=RIGHT>' . "\n" .
                 _("Attach:") .
          '      </TD>' . "\n" .
@@ -899,29 +904,28 @@ function showInputForm ($session, $values=false) {
            $s_a[] = '<input type="checkbox" name="delete[]" value="' . $key . "\">\n" .
                     $info['remotefilename'] . ' - ' . $info['type'] . ' (' .
                     show_readable_size( filesize( $attached_file ) ) . ")<br>\n";
-       }
+        }
     }
     if (count($s_a)) {
        foreach ($s_a as $s) {
           echo '<tr><td align=left colspan="2" bgcolor="' . $color[0] . '">'.$s.'</td></tr>';
-       }        
+       }         
        echo '<tr><td colspan="2"><input type="submit" name="do_delete" value="' .
             _("Delete selected attachments") . "\">\n" .
             '</td></tr>';
     }
-    echo '      </table></td></tr>';
-    echo '   </table>';
-    echo '   </td></tr>';
+    echo '      </table></td></tr>' .
+         '   </table>' .
+         '   </td></tr>';
 
     /* End of attachment code */
     if ($compose_new_win == '1') {
         echo '</TABLE>'."\n";
     }
-    echo '</TABLE>' . "\n";
-
-    echo '<input type="hidden" name="username" value="'. $username . "\">\n";    
-    echo '<input type=hidden name=action value=' . $action . ">\n";
-    echo '<INPUT TYPE=hidden NAME=mailbox VALUE="' . htmlspecialchars($mailbox) .
+    echo '</TABLE>' . "\n" .
+         '<input type="hidden" name="username" value="'. $username . "\">\n" .   
+         '<input type=hidden name=action value=' . $action . ">\n" .
+         '<INPUT TYPE=hidden NAME=mailbox VALUE="' . htmlspecialchars($mailbox) .
          "\">\n" .
          '</FORM>';
     do_hook('compose_bottom');
@@ -931,9 +935,9 @@ function showInputForm ($session, $values=false) {
 
 function showComposeButtonRow() {
     global $use_javascript_addr_book, $save_as_draft,
-        $default_use_priority, $mailprio, $default_use_mdn,
-       $request_mdn, $request_dr,
-        $data_dir, $username;
+           $default_use_priority, $mailprio, $default_use_mdn,
+           $request_mdn, $request_dr,
+           $data_dir, $username;
 
     echo "  <TR><TD>\n</TD><TD>\n";
     if ($default_use_priority) {
@@ -951,14 +955,14 @@ function showComposeButtonRow() {
         if ($mdn_user_support) {
             echo "\n\t". _("Receipt") .': '.
             '<input type="checkbox" name="request_mdn" value=1'.
-               ($request_mdn=='1'?' checked':'') .'>'. _("On Read").
+        ($request_mdn=='1'?' checked':'') .'>'. _("On Read").
             ' <input type="checkbox" name="request_dr" value=1'.
-               ($request_dr=='1'?' checked':'') .'>'. _("On Delivery");
+        ($request_dr=='1'?' checked':'') .'>'. _("On Delivery");
         }
     }
 
-    echo "   </td></tr>\n   <TR><td>\n   </td><td>\n";
-    echo "\n    <INPUT TYPE=SUBMIT NAME=\"sigappend\" VALUE=\"". _("Signature") . "\">\n";
+    echo "   </td></tr>\n   <TR><td>\n   </td><td>\n" .
+         "\n    <INPUT TYPE=SUBMIT NAME=\"sigappend\" VALUE=\"". _("Signature") . "\">\n";
     if ($use_javascript_addr_book) {
         echo "      <SCRIPT LANGUAGE=JavaScript><!--\n document.write(\"".
              "         <input type=button value=\\\""._("Addresses").
@@ -989,9 +993,9 @@ function checkInput ($show) {
      * using $show=false, and then when i'm ready to display the error
      * message, show=true
      */
-    global $body, $send_to, $subject, $color;
+    global $body, $send_to, $send_to_bcc, $subject, $color;
 
-    if ($send_to == "") {
+    if ($send_to == '' && $send_to_bcc == '') {
         if ($show) {
             plain_error_message(_("You have not filled in the \"To:\" field."), $color);
         }
@@ -1015,15 +1019,15 @@ function saveAttachedFiles($session) {
     }
 
     if (!@rename($HTTP_POST_FILES['attachfile']['tmp_name'], $full_localfilename)) {
-       if (function_exists("move_uploaded_file")) {
-               if (!@move_uploaded_file($HTTP_POST_FILES['attachfile']['tmp_name'], $full_localfilename)) {
+    if (function_exists("move_uploaded_file")) {
+            if (!@move_uploaded_file($HTTP_POST_FILES['attachfile']['tmp_name'], $full_localfilename)) {
             return true;
-               }
-       } else {
-               if (!@copy($HTTP_POST_FILES['attachfile']['tmp_name'], $full_localfilename)) {
-                   return true;
-                       }
-       }
+            }
+    } else {
+        if (!@copy($HTTP_POST_FILES['attachfile']['tmp_name'], $full_localfilename)) {
+                return true;
+            }
+    }
 
     }
     $newAttachment['localfilename'] = $localfilename;
@@ -1038,7 +1042,6 @@ function saveAttachedFiles($session) {
     setPref($data_dir, $username, 'attachments', serialize($attachments));
 }
 
-
 function ClearAttachments($session)
 {
     global $username, $attachments, $attachment_dir, $data_dir;
@@ -1047,15 +1050,15 @@ function ClearAttachments($session)
     $rem_attachments = array();
     if (is_array($attachments)) {
         foreach ($attachments as $info) {
-               if ($info['session'] == $session) {
-               $attached_file = "$hashed_attachment_dir/$info[localfilename]";
-               if (file_exists($attached_file)) {
-                       unlink($attached_file);
-               }
-               
+            if ($info['session'] == $session) {
+                $attached_file = "$hashed_attachment_dir/$info[localfilename]";
+                if (file_exists($attached_file)) {
+                    unlink($attached_file);
+                }
+            } 
             else {
-                   $rem_attachments[] = $info;
-               }
+                $rem_attachments[] = $info;
+            }
         }
     }
     $attachments = $rem_attachments;
@@ -1089,7 +1092,7 @@ function getReplyCitation($orig_from)
         break;
     case 'user-defined':
         $start = $reply_citation_start . 
-                ($reply_citation_start == '' ? '' : ' ');
+         ($reply_citation_start == '' ? '' : ' ');
         $end   = $reply_citation_end;
         break;
     default: