- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在制作一个 PHP 表单,允许用户上传附件并将其发送到我的电子邮件。我一直在寻找很长一段时间才能做到。最后,我找到了这个。 http://www.shotdev.com/php/php-mail/php-send-email-upload-form-attachment-file/ .它工作正常。但是,当我自己修改它(更改字段)时,有些事情并不顺利。
<?php
$location=$_POST['location'];
$name_ha=$_POST['name_ha'];
$name_person=$_POST['name_person'];
$email=$_POST['email'];
$date_sent=$_POST['date_sent'];
$date_completed=$_POST['date_completed'];
$date_received=$_POST['date_received'];
$to="admin@admin.com" . "$email";
$message="to";
//*** Uniqid Session ***//
$sid = md5(uniqid(time()));
$header = "";
$header .= "From: ".$_POST["name_ha"]."<".$_POST["email"].">\nReply-To: ".$_POST["email"]."";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$sid."\"\n\n";
$header .= "This is a multi-part message in MIME format.\n";
$header .= "--".$sid."\n";
$header .= "Content-type: text/html; charset=utf-8\n";
$header .= "Content-Transfer-Encoding: 7bit\n\n";
$header .= $message."\n\n";
//*** Attachment ***//
if($_FILES["fileAttach"]["name"] != "")
{
$FilesName = $_FILES["fileAttach"]["name"];
$Content = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"])));
$header .= "--".$sid."\n";
$header .= "Content-Type: application/octet-eam; name=\"".$FilesName."\"\n";
$header .= "Content-Transfer-Encoding: base64\n";
$header .= "Content-Disposition: attachment; filename=\"".$FilesName."\"\n\n";
$header .= $Content."\n\n";
}
$flgSend = @mail($to,"A new file for you!",null,$header); // @ = No Show Error //
if ($flgSend)
{
echo "Mail sent.";
}
?>
我从 shotdev.com 下载的文件和我修改的文件托管在同一台服务器和同一文件夹下。但是,对于我修改过的文件,如果文件大小大于 1MB,则在上传附件之前发送电子邮件(约 45% 的上传过程)。我收到的邮件,没有附件,也没有发件人信息($name_ha)。另一方面,对于在shotdev.com上下载的文件,无论附件大小,只有在附件完全上传后才会发送邮件。
是不是脚本有什么错误,或者是什么地方少了,导致出现这种情况?非常感谢您的宝贵时间和帮助。
最佳答案
首先,在您作为示例展示的代码中,这一行有错误:
$to="admin@admin.com" . "$email";
将其更改为:
$to="admin@admin.com, " . "$email";
我还在我的服务器上测试了代码,一切正常。
我以 100 mbps 的速度上传并尝试了 4.5 MB 的文件并且它有效。
因此,您的上传速度和允许的用于发送此电子邮件的 php 脚本的执行时间可能存在问题。
尝试在 <?php
之后添加以下内容在您以 HTML 形式设置为 action="something.php"的 php 文件中:
set_time_limit(0);
这意味着脚本的执行时间没有限制,将 0 更改为所需的秒数...
如果您需要查看错误,请在@mail() 函数之前删除@,隐藏它们对您没有任何好处。
编辑:
我已经更改了您的代码,以便它首先检查是否有文件,如果没有则发送不带附件的邮件。如果有文件,它会检查它是否编码为 base64 并拆分,在这种情况下,它会发送带有附件的邮件...
<?php
$location=$_POST['location'];
$name_ha=$_POST['name_ha'];
$name_person=$_POST['name_person'];
$email=$_POST['email'];
$date_sent=$_POST['date_sent'];
$date_completed=$_POST['date_completed'];
$date_received=$_POST['date_received'];
$FilesName = $_FILES["fileAttach"]["name"];
$to = "admin@mail.com," . "$email";
$message = "to";
$sid = md5(uniqid(time()));
$header = "";
$header .= "From: ".$_POST["name_ha"]."<".$_POST["email"].">\nReply-To: ".$_POST["email"]."";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$sid."\"\n\n";
$header .= "This is a multi-part message in MIME format.\n";
$header .= "--".$sid."\n";
$header .= "Content-type: text/html; charset=utf-8\n";
$header .= "Content-Transfer-Encoding: 7bit\n\n";
$header .= $message."\n\n";
if($_FILES["fileAttach"]["name"] != "") {
$Content = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"])));
$header .= "--".$sid."\n";
$header .= "Content-Type: application/octet-stream; name=\"".$FilesName."\"\n";
$header .= "Content-Transfer-Encoding: base64\n";
$header .= "Content-Disposition: attachment; filename=\"".$FilesName."\"\n\n";
$header .= $Content."\n\n";
}
if (strlen($FilesName) > 0) {
if ($Content) {
$flgSend = mail($to,"Here is that file",null,$header);
}
else {
echo "problem with file...";
}
}
else {
$flgSend = mail($to,"Here is that file",null,$header);
}
if ($flgSend) {
echo "Mail sent.";
}
?>
这是它的 HTML:
<html>
<head>
</head>
<body>
<form method="post" action="sender.php" enctype="multipart/form-data" >
location: <input type="text" name="location" />
<br />
name_ha: <input type="text" name="name_ha" />
<br />
name_person: <input type="text" name="name_person" />
<br />
email: <input type="text" name="email" />
<br />
date_sent: <input type="text" name="date_sent" />
<br />
date_completed: <input type="text" name="date_completed" />
<br />
date_received: <input type="text" name="date_received" />
<br />
file: <input type="file" name="fileAttach" />
<br />
<input type="submit" value="submit" />
</form>
</body>
</html>
关于附件上传完成前发送的 PHP 邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12779147/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!