php - 从表单发送带有附件的电子邮件不起作用
问题描述
我一直在一个网站上工作,我想从用户那里获取输入类型“文件” ,并使用 php 将相同的内容通过电子邮件发送给管理员。
我的代码如下:
html:
<form class="pure-form" enctype="multipart/form-data" action="resumeUpload.php" method="POST">
<label for="resume_attachment">Upload your resume</label>
<input type="file" class="pure-input-rounded" name="resume_attachment">
<button type="submit" name="resume_send" class="mt-20 mb-20" value="1">Submit</button>
</form>
php:
if($_POST['resume_send'] && isset($_FILES['resume_attachment']))
{
//$from_email = 'sender@abc.com'; //from mail, sender email addrress
$recipient_email = 'xyz@gmail.com'; //recipient email addrress
//Load POST data from HTML form
//$sender_name = $_POST["sender_name"] //sender name
//$reply_to_email = $_POST["sender_email"] //sender email, it will be used in "reply-to" header
//$subject = 'New Resume' //subject for the email
//$message = $_POST["message"] //body of the email
/*Always remember to validate the form fields like this
if(strlen($sender_name)<1)
{
die('Name is too short or empty!');
}
*/
//Get uploaded file data using $_FILES array
$tmp_name = $_FILES['resume_file']['tmp_name']; // get the temporary file name of the file on the server
$name = $_FILES['resume_file']['name']; // get the name of the file
$size = $_FILES['resume_file']['size']; // get size of the file for size validation
$type = $_FILES['resume_file']['type']; // get type of the file
$error = $_FILES['resume_file']['error']; // get the error (if any)
//validate form field for attaching the file
if($file_error > 0)
{
die('Upload error or No files uploaded');
}
//read from the uploaded file & base64_encode content
$handle = fopen($tmp_name, "r"); // set the file handle only for reading the file
$content = fread($handle, $size); // reading the file
fclose($handle); // close upon completion
$encoded_content = chunk_split(base64_encode($content));
$boundary = md5("random"); // define boundary with a md5 hashed value
//header
$headers = "MIME-Version: 1.0\r\n"; // Defining the MIME version
//$headers .= "From:".$from_email."\r\n"; // Sender Email
//$headers .= "Reply-To: ".$reply_to_email."\r\n"; // Email addrress to reach back
$headers .= "Content-Type: multipart/mixed;\r\n"; // Defining Content-Type
$headers .= "boundary = $boundary\r\n"; //Defining the Boundary
//plain text
$body = "--$boundary\r\n";
$body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n\r\n";
$body .= chunk_split(base64_encode($message));
//attachment
$body .= "--$boundary\r\n";
$body .="Content-Type: $file_type; name=".$file_name."\r\n";
$body .="Content-Disposition: attachment; filename=".$file_name."\r\n";
$body .="Content-Transfer-Encoding: base64\r\n";
$body .="X-Attachment-Id: ".rand(1000, 99999)."\r\n\r\n";
$body .= $encoded_content; // Attaching the encoded file with email
$sentMailResult = mail($recipient_email, $subject, $body, $headers);
if($sentMailResult )
{
echo "File Sent Successfully.";
unlink($name); // delete the file after attachment sent.
}
else
{
die("Sorry but the email could not be sent.
Please go back and try again!");
}
}
?>
我已经使用了此代码,但无法完成任务。
任何人都可以在这里找到我的代码中的错误,并给出正确的方法。
谢谢你。
解决方案
您的问题似乎在这一行:
if($_POST['button'] && isset($_FILES['attachment']))
它有两个问题:
首先,$_POST['button']
总是会产生一个错误的值,因为它没有被设置。为此,您需要更改 html <button type="submit" class="mt-20 mb-20" name="button" value="1">Submit</button>
:. 即:加一个name
andvalue
属性,值不应该是导致的东西falsey
。
你对这张支票有什么意图?如果您只想检查请求是否以 的形式出现POST
,请跳过此步骤,因为 的存在$_FILES
就足够了。没有$_GET
文件上传。
其次,isset($_FILES['attachment'])
总是 false,因为在 HTML 中,这个文件上传的名称是resume_file
,而不是attachment
。
只有在解决了这些问题后,您才能继续处理邮件问题(如果存在)。
需要明确的是:您的邮件代码永远无法到达。
推荐阅读
- php - 如何为 Laravel 项目设置 Git 存储库以在克隆后运行?
- powershell - 使用私钥从对象导出证书 Export-Clixml
- php - 根据日期和名称对行求和
- ms-access - 在 DoCmd.TransferText 中指定列
- ios - 在 iOS 上启动屏幕后 React Native 白色闪烁:官方解决方案不起作用,抛出错误(为什么??)
- html - 悬停在左侧的CSS展开元素
- python-3.x - img[::a,::b] 可以降低 PIL 中图像的分辨率,但为什么
- spring - 在 spring webflux 中编写集成测试的最佳方法
- php - 将 unicode 字符转换为 html 特殊字符
- arrays - 子程序中的 Fortran 数组不匹配但没有错误?