我正在尝试创建一个带有附件选项的表单,当表单在word press网站上提交时,该表单将发送到电子邮件中。
我的代码运行良好,它以HTML表格格式向我的电子邮件地址发送电子邮件。此外,我可以使用代码发送附件。当我考虑附件文件扩展名和文件大小时,就会出现这个问题。我不知道如何限制文件的大尺寸,并只为一些允许的扩展名设置附件。
我的代码是:
<?php
//Setup an empty array.
$errors = array();
if($_POST["submit"]) {
$to = "myemail@gmail.com";
$subject = "New reservations request";
$hotel = $_POST["hotel_url"];
$sender = $_POST["sendername"];
$senderEmail = $_POST["senderEmail"];
//Check the name and make sure that it isn't a blank/empty string.
if(empty($sender)){
//Blank string, add error to $errors array.
$errors['sendername'] = "Please enter your name!";
}
/* attachment */
move_uploaded_file($_FILES["attachment"]["tmp_name"],WP_CONTENT_DIR .'/uploads/'.basename($_FILES['attachment']['name']));
$attachments = array(WP_CONTENT_DIR ."/uploads/".$_FILES["attachment"]["name"]);
if(empty($errors)){
$mailBody = "<table border='1'>
<tr>
<th>No</td>
<th>Item</td>
<th>Description</td>
</tr>
<tr>
<td>01</td>
<td>Hotel</td>
<td>$hotel</td>
</tr>
<tr>
<td>02</td>
<td>Name</td>
<td>$sender</td>
</tr>
<tr>
<td>03</td>
<td>E-Mail</td>
<td>$senderEmail</td>
</tr>
</table>";
$headers = array('From: '.$_POST['sendername'].' <'.$_POST['senderEmail'].'>');
$mail_sent = wp_mail( $to, $subject, $mailBody, $headers, $attachments );
}
}
if ($mail_sent) {
?>
<p>Request sent</p>
<?php
} else {
?>
<form id="" name="" action="<?php echo get_permalink(); ?>" method="post" enctype="multipart/form-data">
<input type="hidden" name="hotel_url" value="<?php echo get_permalink();?>" />
<div class="section-heading"><h6>Your Details</h6></div>
<div class="label-input-wrapper">
<div class="form-label">Name</div>
<div class="form-input">
<input type="text" name="sendername"/>
<?php if(isset($errors['sendername'])) { echo '<span style="color: red">'.$errors['sendername'].'</span>'; } ?>
</div>
</div>
<div class="label-input-wrapper">
<div class="form-label">E-Mail</div>
<div class="form-input">
<input type="email" name="senderEmail" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{2,4}$" required value="<?PHP if(!empty($errors)) { echo $senderEmail;} ?>"/>
</div>
</div>
<label for='uploaded_file'>Select A File To Upload:</label>
<input type="file" name="attachment">
<input type="submit" value="Submit" name="submit">
</form>
<?php
}
?>
上面的代码将附件发送到我的邮件中,并保存到我的上传目录中。我知道我必须围绕这个区域做点什么/*附件*/以允许文件的特定扩展名和大小。但是怎么做呢?例如:如果我必须只允许.png、.jpg、.pdf,并且最大文件为1mb,我该怎么做?我必须在哪里和什么代码中修改为上述代码?
可以检查上传文件的扩展名,但这并不能很好地保证它实际上是该文件类型(因为您相信客户端会向您发送信息)。一个更好的方法是在上传文件后,但在将其附加到电子邮件之前,检查服务器上的文件。您可以对使用exif_imagetype()
的图像执行此操作。使用名称恰当的filesize()
函数可以获得以字节为单位的文件大小。
检查不同的图像mime类型(假设它们都是您问题中的图像)
// some number of max bytes for the attachment (1mb)
$file_max_bytes = 1000000;
// valid mime types for the upload
$mime_types = array( IMAGETYPE_PDF, IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF );
// tmp uploaded file
$file_name = $_FILES['attachment']['tmp_name'];
// info about the uploaded file, type and size
$mime_type = exif_imagetype( $file_name );
$file_size_bytes = filesize( $file_name );
// in list of valid types and less than max size?
if ( in_array( $mime_type, $mime_types ) && ( $file_size_bytes < $file_max_bytes ) ){
// valid, attach and send here
} else {
// invalid, wrong type or too big, respond with error
}