php 没有文件就不会发送带附件的联系表

php contact form with attachment doesnt send without file

对不起大家,我是 PHP 的新手,可能很简单:
我收到了一个带附件的联系表格,但是当我尝试在没有附加文件的情​​况下发送它时,它没有发送,但出现了我的错误消息。我不确定如何发送有附件和没有附件。这是我的基本代码

if(isset($_POST) && !empty($_POST)) {

// catch spam bots which never loaded contact form
if (!isset($_POST["p3"]) || $_POST["p3"] != "sometext") {  
    header("Location: contactform.php");
    exit;  
}  

// check whether the POST method was used
if ("POST" != getenv("REQUEST_METHOD")) {  
    header("Location: contactform.php");
    exit;  
} 

// check for user-agent and http-referer
if ("" == getenv("HTTP_USER_AGENT") || "" == getenv("HTTP_REFERER")) {
    header("Location: contactform.php");
    exit;  
} 

//  trick the spam bot into identifying itself using a honeypot
if (!empty($_POST["email"])) {
    exit;  
}

//if there is an attachment
if(!empty($_FILES['attachment']['name'])) {
    //store some varables
    $file_name = $_FILES['attachment']['name'];
    $temp_name = $_FILES['attachment']['tmp_name'];
    $file_type = $_FILES['attachment']['type'];

    //get the extension of the file
    $base = basename($file_name);
    $extension = substr($base, strlen($base)-4, strlen($base));

    // only thes file types will be allowed
    $allowed_extensions = array(".doc","docx",".pdf",".zip",".png","jpeg",".jpg",".gif",".txt","docm",".odt","xlsx","xlsm",".csv",".xml",".ods","tiff",".rtf","");

    // check that this file type is allowed
    if(in_array($extension,$allowed_extensions)){

        //mail essentials
        $from = $_POST['mail'];
        $to = "abcabacagagagag@gmx.de";
        $subject = "Anfrage über Website";
        $message = $_POST['quote'];

        // things you need
        $file = $temp_name;
        $content = chunk_split(base64_encode(file_get_contents($file)));
        $uid = md5(uniqid(time()));

        // standard mail headers
        $header = "From: ".$from."\r\n";
        $header .= "Reply-To: ".$to."\r\n";
        $header .= "MIME-Version: 1.0\r\n";

        $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
        $message .= "This is a multi-part message in MIME format.\r\n";

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

        // file attachment
        $message .= "--".$uid."\r\n";
        $message .= "Content-Type: ".$file_type."; name=\"".$file_name."\"\r\n";
        $message .= "Content-Transfer-Encoding: base64\r\n";
        $message .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r\n";
        $message .= $content."\r\n\r\n";

        $msg = "";

        //send the mail 
        if (mail($to, $subject, $message, $header)) {
            $msg = "Ich habe Ihre Mail erhalten und melde mich in Kürze!";
        } else {
            $msg = "Nachricht konnte nicht gesendet werden. Bitte senden Sie mir Ihre Anfrage an bm-translations@email.de";
        }
    } else {
        $msg = "Dieser Dateityp kann über das Formular nicht gesendet werden. Bitte senden Sie mir Ihre Anfrage an bm-translations@email.de";
    }
} 

// if no file, send anyway (does not work) 
//elseif (empty($_FILES['attachment']['name']) || !(is_uploaded_file($_FILES['attachment']['name']))) {
//}
}

现在我尝试了此代码以允许在没有附件的情况下发送,但不幸的是它不起作用。

  // if no file, send anyway
  elseif (empty($_FILES['attachment']['name']) ||(is_uploaded_file($_FILES['attachment']['name']))) {
  }

有什么问题或者有更简单的方法吗?请在投票前告诉我你还需要什么,因为它可能不清楚。非常感谢!

<?php
if(isset($_POST) && !empty($_POST)) {

// catch spam bots which never loaded contact form
if (!isset($_POST["p3"]) || $_POST["p3"] != "sometext") {  
    header("Location: contactform.php");
    exit;  
}  

// check whether the POST method was used
if ("POST" != getenv("REQUEST_METHOD")) {  
    header("Location: contactform.php");
    exit;  
} 

// check for user-agent and http-referer
if ("" == getenv("HTTP_USER_AGENT") || "" == getenv("HTTP_REFERER")) {
    header("Location: contactform.php");
    exit;  
} 

//  trick the spam bot into identifying itself using a honeypot
if (!empty($_POST["email"])) {
    exit;  
}
 //setting up the mail
$from = $_POST['mail'];
$to = "abcabacagagagag@gmx.de";
$subject = "Anfrage über Website";
$message = $_POST['quote'];
$uid = md5(uniqid(time()));
// standard mail headers
$header = "From: ".$from."\r\n";
$header .= "Reply-To: ".$to."\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$message .= "This is a multi-part message in MIME format.\r\n";

// plain text part
$message .= "--".$uid."\r\n";
$message .= "Content-Type:text/plain; charset=iso-8859-1\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$message .= $message."\r\n\r\n";
$msg = "";

//if there is an attachment
if(!empty($_FILES['attachment']['name'])) {
    //store some varables
    $file_name = $_FILES['attachment']['name'];
    $temp_name = $_FILES['attachment']['tmp_name'];
    $file_type = $_FILES['attachment']['type'];

//get the extension of the file
$base = basename($file_name);
$extension = substr($base, strlen($base)-4, strlen($base));

// only thes file types will be allowed
$allowed_extensions = array(".doc","docx",".pdf",".zip",".png","jpeg",".jpg",".gif",".txt","docm",".odt","xlsx","xlsm",".csv",".xml",".ods","tiff",".rtf","");

// check that this file type is allowed
if(in_array($extension,$allowed_extensions)){

   // file attachment
     // handling the content of the mail 
    $file = $temp_name;
    $content = chunk_split(base64_encode(file_get_contents($file)));
    $message .= "--".$uid."\r\n";
    $message .= "Content-Type: ".$file_type."; name=\"".$file_name."\"\r\n";
    $message .= "Content-Transfer-Encoding: base64\r\n";
    $message .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r\n";
    $message .= $content."\r\n\r\n";

    //send the mail 
    if (mail($to, $subject, $message, $header)) {
        $msg = "Ich habe Ihre Mail erhalten und melde mich in Kürze!";
    } else {
        $msg = "Nachricht konnte nicht gesendet werden. Bitte senden Sie mir Ihre Anfrage an bm-translations@email.de";
    }
} else {
    $msg = "Dieser Dateityp kann über das Formular nicht gesendet werden. Bitte senden Sie mir Ihre Anfrage an bm-translations@email.de";
}
}

else  mail($to, $subject, $message, $header);

?>

我想在您的代码中为您指出几件事

1- 使用 elseif 不是您应该简单地使用 else 的正确选项,因为条件与您之前写的完全相反有关更多信息,请单击 here

2- 你在最后一部分发送的消息没有像你在我写的代码中看到的那样声明我基本上把主要消息从附件中分离出来并在代码的开头声明它然后最后发送它。

我对你的代码做了一些修改。 (主要是稍微移动了一下。)

  • 我创建了一个变量 hasAttachment,顾名思义,如果 post 包含附件,则它包含一个布尔值。
  • 其余更改是从您构建附件的 if 中提取邮件部分。
  • if (isset($_POST) && !empty($_POST)) {
        // catch spam bots which never loaded contact form
        if (!isset($_POST["p3"]) || $_POST["p3"] != "sometext") {
            header("Location: contactform.php");
            exit;
        }
    
        // check whether the POST method was used
        if ("POST" != getenv("REQUEST_METHOD")) {
            header("Location: contactform.php");
            exit;
        }
    
        // check for user-agent and http-referer
        if ("" == getenv("HTTP_USER_AGENT") || "" == getenv("HTTP_REFERER")) {
            header("Location: contactform.php");
            exit;
        }
    
        //  trick the spam bot into identifying itself using a honeypot
        if (!empty($_POST["email"])) {
            exit;
        }
    
        $hasAttachment = !empty($_FILES['attachment']['name']);
        $uid = md5(uniqid(time()));
    
        // mail essentials
        $from = $_POST['mail'];
        $to = "abcabacagagagag@gmx.de";
        $subject = "Anfrage über Website";
        $message = $_POST['quote'];
    
        // standard mail headers
        $header = "From: " . $from . "\r\n";
        $header.= "Reply-To: " . $to . "\r\n";
        $header.= "MIME-Version: 1.0\r\n";
        $header.= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";
        $message.= "This is a multi-part message in MIME format.\r\n";
    
        // plain text part
        $message.= "--" . $uid . "\r\n";
        $message.= "Content-Type:text/plain; charset=iso-8859-1\r\n";
        $message.= "Content-Transfer-Encoding: 7bit\r\n\r\n";
        $message.= $message . "\r\n\r\n";
    
        // if there is an attachment
        if ($hasAttachment) {
            // store some varables
            $file_name = $_FILES['attachment']['name'];
            $temp_name = $_FILES['attachment']['tmp_name'];
            $file_type = $_FILES['attachment']['type'];
    
            // get the extension of the file
            $base = basename($file_name);
            $extension = substr($base, strlen($base) - 4, strlen($base));
    
            // only thes file types will be allowed
            $allowed_extensions = array(
                ".doc", "docx", ".pdf", ".zip", ".png", "jpeg", ".jpg", ".gif", ".txt", "docm", ".odt", "xlsx", "xlsm", ".csv", ".xml", ".ods", "tiff", ".rtf", ""
            );
    
            // check that this file type is allowed
            if (in_array($extension, $allowed_extensions)) {
    
                // things you need
                $file = $temp_name;
                $content = chunk_split(base64_encode(file_get_contents($file)));
    
                // file attachment
                $message.= "--" . $uid . "\r\n";
                $message.= "Content-Type: " . $file_type . "; name=\"" . $file_name . "\"\r\n";
                $message.= "Content-Transfer-Encoding: base64\r\n";
                $message.= "Content-Disposition: attachment; filename=\"" . $file_name . "\"\r\n";
                $message.= $content . "\r\n\r\n";
            }
        }
    
        $msg = "";
    
        // send the mail
        if (mail($to, $subject, $message, $header)) {
            $msg = "Ich habe Ihre Mail erhalten und melde mich in Kürze!";
        } else {
            $msg = "Nachricht konnte nicht gesendet werden. Bitte senden Sie mir Ihre Anfrage an bm-translations@email.de";
        }
    }