【问题标题】:php mail function with attachments带附件的php邮件功能
【发布时间】:2017-06-16 14:10:48
【问题描述】:

我正在尝试制作一个向我发送邮件的表单。

这是html文件内容。

<form method="post" action="email.php" enctype="multipart/form-data">
<input type="text" id="contact_name" class="form-control" placeholder="Name" name="user_name"/>
<input type="text" id="contact_email" class="form-control" placeholder="Email Address"     
name="user_mail" <textarea id="contact_message" class="form-control" rows="7" placeholder="Write a 
message" name="user_message"></textarea>
<input name="attachment" type="file">      
<input type="submit" value="Send mail" class="btn btn-primary pull-right"/>
 </form>

这是 php 文件。

<?php

 if(isset($_POST) && !empty($_POST)) {
 if(!empty($_FILES['attachment']['name'])) {
   $file_name = $FILES['attachment']['name'];  
   $temp_name = $FILES['attachment']['tmp_name'];  
   $file_type = $FILES['attachment']['type'];

   $base = basename($file_name);
   $extension = substr($base, strlen($base)-4, strlen($base));

   //only these file types will be allowed
   $allowed_extensions = array(".doc", "docx", ".pdf", ".zip", ".png");

   //check that this file type is allowed
   if(in_array($extension,$allowed_extensions)) {
       //mail essentials
       $from = $_POST['user_mail'];
       $to = "eugenepi1025@gmail.com";
       $subject = $_POST['user_name'];
       $message = $_POST['user_message'];

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

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


       //declare multiple kinds of email (plain text + attch)
       $header .="Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
       $header .="This is a multi-part message in MIME format.\r\n";

       //plain txt part

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


       //attch part
       $header .= "--".$uid."\r\n";
       $header .= "Content-Type: ".$file_type."; name=\"".$file_name."\"\r\n";
       $header .= "Content-Transfer-Encoding: base64\r\n";
       $header .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r\n\r\n";
       $header .= $content."\r\n\r\n";  //chucked up 64 encoded attch


       //sending the mail - message is not here, but in the header in a multi part

       if(mail($to, $subject, "", $header)) {
       echo "success";
       }else {
           echo "fail";
       }


   }else {
       echo "file type not allowed"; }    //echo an html file
}else {
  echo "no file posted"; }    
}
?>

问题是file type not allowed 消息不断出现。但是我上传的是.png文件,所以不知道是什么问题。

你能帮我解决这个问题吗?我已经坚持了好几个小时了:(

【问题讨论】:

  • 您缺少 close-delimiter。在末尾添加$header .= "--$uid--\r\n";

标签: php email-attachments


【解决方案1】:

其实你有

$file_name = $FILES['attachment']['name'];  
$temp_name = $FILES['attachment']['tmp_name'];  
$file_type = $FILES['attachment']['type'];

应该是

$file_name = $_FILES['attachment']['name'];  
$temp_name = $_FILES['attachment']['tmp_name'];  
$file_type = $_FILES['attachment']['type'];

而且效果很好:))

【讨论】:

  • 天哪,为什么我没有注意到;(非常感谢您的帮助
  • 除了` 字符外,我看不出两个代码块之间的区别,可能是错字。你能提供一个解决方案吗?此外,这提供了有关文件的 MIME 类型信息,但 OP 会检查扩展名。
  • $FILES 和 $_FILES 是非常不同的变量。而且他使用的 $FILES 不是现有变量..而且没用:)他只是忘记了下划线“_”..对不起括号.. :)
  • 哦,对不起,我也没听清楚。谢谢你的解释:)
  • 没问题 :) user2106381 也没有看到他的问题 :)
【解决方案2】:

此外,请确保为图像附件的标题 Content-Type 分配了正确的 MIME 类型,即 image/png 用于 .png 文件。请参阅此wiki 以获取图像 MIME 类型的列表。

【讨论】:

  • 哇,新信息。谢谢,我刚刚检查了那个 wiki 页面 :) 学习新事物真是太好了。非常感谢!
【解决方案3】:

您超出了substr() 中的字符串大小,因此您的$extension 不正确。

对于a.pdf; strlen($base) 是 5;所以结束索引是4。因此,你的第三个参数应该是strlen($base) - 1而不是strlen($base)

改行如下:

$extension = substr($base, strlen($base) - 4, strlen($base) - 1);

我认为这种方法更好:

$extension = substr($base, strrpos($base, ".")-1);

这会给你最后一个 . 字符和字符串的其余部分,也就是文件扩展名。

Demo.

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 2015-12-10
    • 1970-01-01
    • 2023-03-10
    • 2014-04-04
    • 2012-02-27
    • 2016-01-11
    • 2013-04-14
    • 2023-03-21
    相关资源
    最近更新 更多