php表单邮件附件:检查文件

时间:2013-12-13 17:09:23

标签: php forms

我想让人们在表格中发送附件以及其他信息。使用this Stackoverflow answer和大量的谷歌搜索我几乎对我现在拥有的东西感到满意。但是有一个问题:当用户没有附加文件(这没关系)时,我得到的错误是文件名不能为空(表单会被提交)。

编辑:我不想强制执行文件上传。相反,没有档案我很开心。但是(我认为?)join(file($_FILES['f']['tmp_name']))期望一个文件,如果它没有得到一个将抛出一个错误(当表格仍然发送)。所以我想改变它的方式,这条线也没有上传文件。 / EDIT

不幸的是,我的大部分知识来自于试验和错误(以及我之前所做过的事情)。无论我尝试或谷歌我都找不到避免错误的方法。有人能帮我一把吗?

    if( empty($errors))
    {
    $s = md5(rand());
    mail('email@example.com', 'attachment', "--$s
    Hello World!
    --$s
    Content-Type: application/octet-stream; name=\"f\"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment

    ".chunk_split(base64_encode(join(file($_FILES['f']['tmp_name']))))."
    --$s--", "MIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"$s\"");
    }

($ errors确保用户在表单中提供了一个电子邮件地址。)

非常感谢!

1 个答案:

答案 0 :(得分:0)

仅用于测试目的

欢迎您使用此功能。您将不得不进行某些修改,但是无论是否附加文件都可以。

对于单个文件附件。

HTML表格

<html>
<head>
<title></title>
</head>
<body>
<form action="php_sendmail_upload.php" method="post" name="form1" enctype="multipart/form-data">
<table width="343" border="1">
<tr>
<td>To</td>
<td><input name="txtTo" type="text" id="txtTo"></td>
</tr>
<tr>
<td>Subject</td>
<td><input name="txtSubject" type="text" id="txtSubject"></td>
</tr>
<tr>
<td>Description</td>
<td><textarea name="txtDescription" cols="30" rows="4" id="txtDescription"></textarea></td>
</tr>
<tr>
<td>Form Name</td>
<td><input name="txtFormName" type="text"></td>
</tr>
<tr>
<tr>
<td>Form Email</td>
<td><input name="txtFormEmail" type="text"></td>
</tr>
<tr>
<td>Attachment</td>
<td><input name="fileAttach" type="file"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Send"></td>
</tr>
</table>
</form>
</body>
</html>

PHP处理程序(php_sendmail_upload.php)

<?php
// $strTo = $_POST["txtTo"];
$strTo = "email@example.com";
$strSubject = "Email attach subject";
$strMessage = nl2br($_POST["txtDescription"]);

//*** Uniqid Session ***//
$strSid = md5(uniqid(time()));

$strHeader = "";
$strHeader .= "From: ".$_POST["txtFormName"]."<".$_POST["txtFormEmail"].">\nReply-To: ".$_POST["txtFormEmail"]."";

$strHeader .= "MIME-Version: 1.0\n";
$strHeader .= "Content-Type: multipart/mixed; boundary=\"".$strSid."\"\n\n";
$strHeader .= "This is a multi-part message in MIME format.\n";

$strHeader .= "--".$strSid."\n";
$strHeader .= "Content-type: text/html; charset=utf-8\n";
$strHeader .= "Content-Transfer-Encoding: 7bit\n\n";
$strHeader .= $strMessage."\n\n";

//*** Attachment ***//
if($_FILES["fileAttach"]["name"] != "")
{
$strFilesName = $_FILES["fileAttach"]["name"];
$strContent = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"])));
$strHeader .= "--".$strSid."\n";
$strHeader .= "Content-Type: application/octet-stream; name=\"".$strFilesName."\"\n";
$strHeader .= "Content-Transfer-Encoding: base64\n";
$strHeader .= "Content-Disposition: attachment; filename=\"".$strFilesName."\"\n\n";
$strHeader .= $strContent."\n\n";
}

$flgSend = @mail($strTo,$strSubject,null,$strHeader);  // @ = No Show Error //

if($flgSend)
{
echo "Mail send completed.";
}
else
{
echo "Cannot send mail.";
}
?>