【问题标题】:How to allow specific extensions and file size to wp_mail attachment?如何允许 wp_mail 附件的特定扩展名和文件大小?
【发布时间】:2014-09-06 17:56:46
【问题描述】:

我正在尝试创建一个带有附件选项的表单,当表单在 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
}
?>

以上代码将附件发送到我的邮件并保存到我的上传目录中。 我知道我必须围绕这个区域做一些事情 /* attachment */ 以允许文件的特定扩展名和大小。但是怎么做呢? 例如:如果我必须只允许 .png、.jpg、.pdf 并且最大文件为 1mb,我该怎么做?上面的代码我要在哪里修改什么代码?

【问题讨论】:

    标签: php wordpress forms email-attachments


    【解决方案1】:

    可以检查上传文件的扩展名,但这并不能很好地保证它实际上是该文件类型(因为您相信客户端会向您发送信息)。执行此操作的更好方法是在文件上传后但在附加到电子邮件之前检查服务器上的文件。您可以对带有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
    }
    

    【讨论】:

    • 谢谢。我已经像 codepad.org/O6XJ3csV 这样更改了 ocde,但它会发送所有文件和文件大小。似乎if ( !in_array( $mime_type, $mime_types ) &amp;&amp; ( $file_size_bytes &lt; $file_max_bytes ) ){ $errors['attachment'] = "Invalid file or too big"; } 不工作..
    • 您的 if 语句是倒退的,请与答案进行比较。如果您想按原样编写代码,则需要使用逻辑或并测试大于:if ( ! in_array( $mime_type, $mime_types ) || ( $file_size_bytes &gt; $file_max_bytes ) )
    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 2017-11-13
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多