代码之家  ›  专栏  ›  技术社区  ›  in2d

PHP换行符“\n”在电子邮件正文中不起作用。线条消失了

  •  2
  • in2d  · 技术社区  · 6 年前

    之后我如何断线 $sender_name $sender_number ? 现在只显示 $发件人\u名称 作为输出,但当我删除“ \n “他们都在一条线上。

        $body .= chunk_split(base64_encode($sender_name."\n\r"));
        $body .= chunk_split(base64_encode($sender_number."\n\r"));
        $body .= chunk_split(base64_encode($sender_message."\n\r"));
    

    整个PHP代码

    <?php
    if($_POST && isset($_FILES['file']))
    {
        $recipient_email    = "mymail@gmail.com"; //recepient
        $from_email         = "mymail2@gmail.com"; //from email using site domain.
        $subject            = "Attachment email from your website!"; //email subject line
    
        $sender_name = filter_var($_POST["s_name"], FILTER_SANITIZE_STRING); //capture sender name
        $sender_number = filter_var($_POST["s_number"], FILTER_SANITIZE_STRING); //capture sender number
        $sender_email = filter_var($_POST["s_email"], FILTER_SANITIZE_STRING); //capture sender email
        $sender_message = filter_var($_POST["s_message"], FILTER_SANITIZE_STRING); //capture message
        $attachments = $_FILES['file'];
    
        //php validation
        if(strlen($sender_name)<4){
            die('Name is too short or empty');
        }
        if(strlen($sender_number)<4){
            die('Number is too short or empty');
        }
        if (!filter_var($sender_email, FILTER_VALIDATE_EMAIL)) {
          die('Invalid email');
        }
        if(strlen($sender_message)<4){
            die('Too short message! Please enter something');
        }
    
        $file_count = count($attachments['name']); //count total files attached
        $boundary = md5(""); 
    
        if($file_count > 0){ //if attachment exists
            //header
            $headers = "MIME-Version: 1.0\r\n"; 
            $headers .= "From:".$from_email."\r\n"; 
            $headers .= "Reply-To: ".$sender_email."" . "\r\n";
            $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; 
    
            //message text
            $body = "--$boundary\r\n";
            $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
            $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
              $body .= chunk_split(base64_encode($sender_name)) . "<br />";
      $body .= chunk_split(base64_encode($sender_number)) . "<br />";
      $body .= chunk_split(base64_encode($sender_message)) . "<br />";
    
            //attachments
            for ($x = 0; $x < $file_count; $x++){       
                if(!empty($attachments['name'][$x])){
    
                    if($attachments['error'][$x]>0) //exit script and output error if we encounter any
                    {
                        $mymsg = array( 
                        1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini", 
                        2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", 
                        3=>"The uploaded file was only partially uploaded", 
                        4=>"No file was uploaded", 
                        6=>"Missing a temporary folder" ); 
                        die($mymsg[$attachments['error'][$x]]); 
                    }
    
                    //get file info
                    $file_name = $attachments['name'][$x];
                    $file_size = $attachments['size'][$x];
                    $file_type = $attachments['type'][$x];
    
                    //read file 
                    $handle = fopen($attachments['tmp_name'][$x], "r");
                    $content = fread($handle, $file_size);
                    fclose($handle);
                    $encoded_content = chunk_split(base64_encode($content)); //split into smaller chunks (RFC 2045)
    
                    $body .= "--$boundary\r\n";
                    $body .="Content-Type: $file_type; name=" . $file_name ."\r\n";
                    $body .="Content-Disposition: attachment; filename=" . $file_name ."\r\n";
                    $body .="Content-Transfer-Encoding: base64\r\n";
                    $body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n"; 
                    $body .= $encoded_content; 
                }
            }
    
        }else{ //send plain email otherwise
           $headers = "From:".$from_email."\r\n".
            "Reply-To: ".$sender_email. "\n" .
            "X-Mailer: PHP/" . phpversion();
            $body = $sender_name. "\n";
            $body = $sender_number. "\n";
            $body = $sender_message. "\n";
        }
    
         $sentMail = @mail($recipient_email, $subject, $body, $headers);
        if($sentMail) //output success or failure messages
        {       
             header("Location: index.php"); /* Redirect browser */
             exit();
        }else{
    
            header("Location: index.php"); /* Redirect browser */       
        }
    }
    ?>
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   user3647971    6 年前

    您也在对行尾进行Base64编码

    因此实际输出不会有\n\r 尝试以下操作:

    $string .= $sender_name."\r\n";
    $string .= $sender_number."\r\n";
    $string .= $sender_message."\r\n";
    $body .= base64_encode(chunk_split($string)); // I think since your transfer encoding is base64, it will not respect the line endings added by the chunk_split not sure tho so be sure to encode it all with base64
    

    编辑: 给定您的代码:

    $body = $sender_name. "\n";
    $body = $sender_number. "\n";
    $body = $sender_message. "\n";
    

    在这些行中的每一行上,您都没有附加字符串,而是为其指定一个新值;使用 .= 代替赋值运算符

        2
  •  2
  •   azjezz    6 年前

    您还遇到了“\n\r”,请确保在末尾加上换行符,

      $body .= chunk_split(base64_encode($sender_name)) . PHP_EOL;
      $body .= chunk_split(base64_encode($sender_number)) . PHP_EOL;
      $body .= chunk_split(base64_encode($sender_message)) . PHP_EOL;
    

    如果您正在以html格式发送电子邮件,请替换 PHP_EOL 具有 <br /> 这样地:

      $body .= chunk_split(base64_encode($sender_name)) . "<br />";
      $body .= chunk_split(base64_encode($sender_number)) . "<br />";
      $body .= chunk_split(base64_encode($sender_message)) . "<br />";