【问题标题】:PHP mail sent before finish uploading the attachment上传附件前发送的 PHP 邮件
【发布时间】:2012-09-28 13:14:18
【问题描述】:

我正在制作一个 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上下载的文件,无论附件多大,只有在附件完全上传后才会发送电子邮件。

脚本是否有任何错误,或者缺少某些东西,导致这种情况发生?非常感谢您的时间和帮助。

【问题讨论】:

  • 我需要测试一下,第一印象是你的标题有问题,我不喜欢那部分代码是如何完成的。
  • 我会首先通过追溯您所做的更改来隔离问题。
  • 说真的,如果您尝试使用附件,甚至不要尝试使用 PHP 的内置 mail() 函数。您将花费一生来努力使其正常工作。使用phpMailer class 会更好。另请参阅我的答案:stackoverflow.com/questions/12301358/…

标签: php email attachment


【解决方案1】:

首先,在您作为示例显示的代码中,这一行有错误:

$to="admin@admin.com" . "$email";

改成:

$to="admin@admin.com, " . "$email";
  • 请注意您缺少逗号...对于您希望以特定方式添加的每封新接收者电子邮件,它都需要存在...

我还在我的服务器上测试过代码,一切正常。
我上传了 100 mbps 并尝试了 4.5 MB 的文件,它可以工作。

所以可能是您的上传速度和您调用发送此电子邮件的 php 脚本的允许执行时间存在问题。

尝试在您以 HTML 形式设置为 action="something.php" 的 php 文件中的 &lt;?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>

【讨论】:

  • 非常感谢您的帮助。不幸的是,同样的问题仍然存在。表单的大小和 sender.php 的脚本是否会影响它?或者这都是关于连接问题?目前,我只是使用免费的网络主机。稍后我将在我的 PC 上使用 localhost 进行尝试。再次感谢大家的帮助。
  • 呃,“免费虚拟主机”是 99% 的问题!它们通常会限制可用资源......它在我的服务器上完美运行并在您使用的“免费网络主机”上失败并不奇怪。
猜你喜欢
  • 2011-03-24
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多