MIME标题出现在电子邮件正文中

时间:2011-12-05 04:51:39

标签: php

使用以下代码发送php电子邮件时遇到问题。 MIME heades继续在消息中显示,并且附件在消息体中显示为涂鸦文本而不是附件。可能是什么问题

        <?php
        session_start();
        require_once("includes/functions.php"); 
        require_once("includes/dbconnect.php");
        require_once("Mail/mailfunctions.php");



         //function_to_be_applied($finaldest_email, $message, $subject, $fromname, $fromemail, $replyto )
         function function_to_be_applied($finaldest_email, $key){
                //require_once "Mail.php" ;
                global $fromemail;
                global $message;
                global $fromname;
                global $subject;
                global $replyto;
                global $seconds;
                global $reprt;
                global $headers;

                $to = $finaldest_email;
                $from = "".$fromname." <$fromemail>";
                $subject = $subject;

                if(mail($to, $subject, $message, $headers)) {
                                            sleep($seconds);
                $reprt .= "Message successfully sent to: ". $to."<br />";
                                    } else {
                $reprt .= "Message not successfully sent to: ". $to."<br />";
                                    }

                }

         if(isset($_POST['submit']))
          { 
            $errors_val = array();
            $required_fields = array("subject", "fromemail", "message", "dest_email"); 
            foreach($required_fields as $fieldname)
            {
                 if( !isset($_POST[$fieldname]) || ( empty($_POST[$fieldname]) &&(!is_int($_POST[$fieldname])) ))
                       {
                        if($fieldname == "subject")
                          {$errors_val[0] = "-Sending email without SUBJECT is not allowed";}
                        if($fieldname == "fromemail")
                          {$errors_val[1] = "-Sending email without a FROM EMAIL is not allowed";}
                        if($fieldname == "message")
                          {$errors_val[2] = "-Sending an empty message is not allow";} 
                        if($fieldname == "dest_email")
                          {$errors_val[3] = "-There must be at least one email in the destination email address";}

                        }
            }
            if(empty($errors_val)){
            $errors = array();
            if(false == validate_email(trim($_POST['fromemail']))){
              $errors[0] = "FROM EMAIL is invalid";
            }
            if(false == validate_email(trim($_POST['replyto']))){
              $errors[1] = "REPLY TO EMAIL is invalid";}
            if(!is_numeric(trim($_POST['seconds']))){
              $errors[2] = "Seconds between messages must be a number";}

            $allowtypes = array("doc", "pdf", "txt", "zip", "gif", "jpeg", "jpg"); //the type of file can be attached
            $max_file_size="100"; //describes the size that cab be attached

            // checks that we have a file
            if((!empty($_FILES["attachment"])) && ($_FILES["attachment"]["error"] == 0)) {
               //set a variable $attached = 1
                    $attached = 1;

                    // basename -- Returns filename component of path
                    $filename = basename($_FILES['attachment']['name']);
                    $ext = substr($filename, strrpos($filename, '.') + 1);
                    $filesize=$_FILES['attachment']['size'];
                    $max_bytes=$max_file_size*1024;

                    //Check if the file type uploaded is a valid file type. 
                    if (!in_array($ext, $allowtypes)) {
                        $errors[3]="Invalid extension for your file: <strong>".$filename."</strong>";
                        unset($attached);
                // check the size of each file
                } elseif($filesize > $max_bytes) {
                        $errors[4]= "Your file: <strong>".$filename."</strong> is to big. Max file size is ".$max_file_size."kb.";
                     unset($attached);
                        }

            } 

        if(empty($errors)){
                  //generate a unique boundary
                  $semi_rand = md5(time());
                  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

                  if(isset($_POST['seconds']) && ($_POST['seconds'] != ""))
                  {$seconds = $_POST['seconds'];}else{$seconds = 0.5;}
                  $subject = trim($_POST['subject']);
                  $fromname = trim($_POST['fromname']);
                  $fromemail = trim($_POST['fromemail']);
                  $from = stripslashes($fromname)."<".stripslashes($fromemail).">";
                  $emailmessage  = trim($_POST['message']);
                  $replyto = trim($_POST['replyto']);
                  $dest_email = trim($_POST['dest_email']);
                  $emailarray = explode("\r\n", $dest_email, 400);
                  $finaldest_email = array_unique($emailarray );

                  $headers = "From: " . $from . "\r\n";
                  $headers .= "Reply-To:" . $replyto . "\r\n";
                  $headers .= "Mime-Version: 1.0\r\n";
                  $headers .= " Content-Type: multipart/mixed;\r\n" .
                              " boundary=\"{$mime_boundary}\"";


                  //attachment 
              if(isset($attached)){
                  $fileatt      = $_FILES["attachment"]["tmp_name"];
                  $fileatt_type = $_FILES["attachment"]["type"];
                  $fileatt_name = $_FILES["attachment"]["name"];
                if (is_uploaded_file($fileatt)) {
                  // Read the file to be attached ('rb' = read binary)
                  $data =  file_get_contents($fileatt);

                  //$file = fopen($fileatt,'rb');
                  //$data = fread($file,filesize($fileatt));
                  //fclose($file);

                  // Base64 encode the file data
                  $finaldata = chunk_split(base64_encode($data));
                   }
                    $message  = "--{$mime_boundary}\r\n";
                    $message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
                    $message .= "Content-Transfer-Encoding: 7bit\r\n";
                    $message .= "{$emailmessage}\r\n";
                    $message .= "--{$mime_boundary}\r\n";
                    $message .= "Content-Type: {$fileatt_type}; name=\"{$fileatt_name}\"\n\n".
                              "Content-Transfer-Encoding: base64\n\n";
                    $message .=  "Content-Disposition: attachment; filename=\"{$fileatt_name}\"\n\n";

                    $message .= "{$finaldata} \r\n--{$mime_boundary}--\r\n";

               }elseif(!isset($attached)){

                    $message = "--{$mime_boundary}\r\n";
                    $message .= "Content-Type: text/plain; charset=\"iso-8859-1\" \r\n";
                    $message .= "Content-Transfer-Encoding: 7bit\r\n";
                    $message .= "{$emailmessage}\r\n";
                    $message .= "--{$mime_boundary}--\r\n";

                    }
                $reprt = "Preparing to send message..<br />";

          if( true == array_walk($finaldest_email, 'function_to_be_applied' )){
          $numberofemailsent = count($finaldest_email);

          }else{echo "No email sent";}

               }else{$string = implode("<br /> -" , $errors);  $error_message = $string; }



            }else{$string = implode("<br /> -" , $errors_val);  $error_message = $string; }



         }

          ?>

1 个答案:

答案 0 :(得分:2)

不要生成自己的哑剧电子邮件。使用PHPMailerSwiftmailer并将该脚本的大部分减少到10行代码。

同样,不要通过查看文件名来验证文件类型。伪造文件名和客户端指定的mime类型是微不足道的。始终使用服务器端mime验证。