如何使用 FormData 和 AJAX 将文档附加到电子邮件?

How Do I Use FormData and AJAX to attach a document to an email?

提问人:jgdhnds 提问时间:5/12/2023 最后编辑:Pippojgdhnds 更新时间:5/13/2023 访问量:69

问:

我曾多次尝试处理表单附件,但除了 html 中的初始上传框外,都没有运气。我读到可以使用FormData,我的尝试一直围绕着它,但我的尝试都没有给我带来任何进展。虽然我仍然有一系列非工作代码(注释掉,以供参考),但我已经将所有代码恢复到它最后的有凝聚力的功能状态,以使这篇文章更加简洁。

如何为外发电子邮件添加附件?

HTML 表单

<form id="requestcreditform" enctype="multipart/form-data">
    <h1>Withdraw Credit</h1>

    <div class="formcontainer">
    
      <div class="container">
        <label for="clientn"><strong>Check Made To</strong></label>
        <input type="text" name="clientname" placeholder="" id="clientname" required><br />
        <label for="credit_requested"><strong>Credit Requested</strong></label>
        <input type="number" name="creditreq" placeholder="5000" id="creditreq" required>
        <label><b><br />Upload Contract:<br /><b></label>
        <input type="file" name="file" id="file" accept="image/*,.pdf" required> <br /><br />
        <input type="checkbox" id="expedited" name="expedited" value="1">
        <label for="expedited">Expedited Shipping (+$15)</label><br>      
        <p>This change will be reflected to your account upon submission and your credit will be processed shortly afterwards.   Please verify the requested credit is correct prior to hitting the "Request Check" button. Checks will be addressed to the client and shipped to the attorney's practice. Thank you.<br />
        </p>
      </div>
      
      <button id="submit_button" type="submit"><strong>Request Check</strong></button>
      
    </div>
    
</form>

JS公司

(function($){
  $('#requestcreditform').submit( function(event) {
  
    event.preventDefault();
    
    var endpoint = '<?php echo admin_url('admin-ajax.php');?>';
   
    var form = $('#requestcreditform').serialize();
    
    var formdata = new FormData;
    
    //file
    //$this = $(this);
    //file_data = $(this).prop('files')[0];
    //formdata.append('file', file_data);
    
    formdata.append('action', 'requestcredit');
    formdata.append('requestcredit', form);
    
    //file
    //formdata.append("file[]", file_data[0]);
    
    $.ajax(endpoint, {
      type: 'POST',
      data: formdata,
      processData: false,
      contentType: false,
 
      success:function(res) {
        alert(res.data);
        location.reload();
      },
      error: function(err) {
      }
    
    })
  })
})(jQuery)

PHP的

add_action("wp_ajax_requestcredit", "request_credit1");
function request_credit1() {
    global $current_user;
    global $wpdb;
  
    //pull user data
    $current_user = wp_get_current_user();
    $user_id = $current_user->id;
  
    //get user name and address
    $user_fname_query = $wpdb->prepare("SELECT meta_value FROM oWC_usermeta WHERE user_id = %d AND meta_key = %s", $user_id, 'first_name');
    $user_fname = $wpdb->get_var($user_fname_query);
    
    $user_lname_query = $wpdb->prepare("SELECT meta_value FROM oWC_usermeta WHERE user_id = %d AND meta_key = %s", $user_id, 'last_name');
    $user_lname = $wpdb->get_var($user_lname_query);
    
    $name = $user_fname.' '.$user_lname;
    
    $user_address_query = $wpdb->prepare("SELECT meta_value FROM oWC_usermeta WHERE user_id = %d AND meta_key = %s", $user_id, 'user_registration_address');
    $user_address = $wpdb->get_var($user_address_query);
    
    //$name = $current_user->firstname . " " . $current_user->lastname;
    $email = $current_user->user_email;
    $phone = $current_user->phone;
    $approved_credit = $current_user->approved_credit;
    
    //POST
    $formdata = [];
    
    //text
    wp_parse_str($_POST['requestcredit'], $formdata);
    
    $credit_requested = $formdata['creditreq'];
    $checkmadeto = $formdata['clientname'];
    $expedited = $formdata['expedited'];
    
    $expedited_sum = $credit_requested;
    $expedited_price = 15;
    
    $check_type ='';
    
    if ($expedited == 1) {
        $expedited_sum = $credit_requested + $expedited_price;
        $check_type = 'expedited';
    }
    else {
        $check_type = 'standard';
    }
    
    //TRANSACTION TABLE
    //remaining credit
    $query = $wpdb->prepare("SELECT SUM(credit_amount) AS total FROM transaction_history WHERE (is_paid <> 1 OR is_paid IS NULL) AND user_id = %d", $user_id);
    $credit_total = $wpdb->get_var($query);
    
    $remaining_credit = $current_user->approved_credit;
    //$remaining_credit = $current_user->approved_credit - $credit_total;
    
     if ($credit_requested > $remaining_credit) {
        wp_send_json_success('Credit Request failed.  Please ensure you have entered a number within your remaining credit');
        exit;
    }
    //if requested amount is allowed
    else {
        //insert withdrawn credit into transaction history
        $wpdb->insert('transaction_history', array(
            'user_id' => $current_user->id,
            'credit_timestamp' => current_time( 'mysql' ),
            'credit_amount' => $expedited_sum,
            'clientname' => $checkmadeto,
            'transaction_type' => $check_type
        ));
        
        //MAIL
        //admin email - dynamic
        $admin_email = get_option('admin_email');

        //file
        $content = file_get_contents($fileName);
        $content = chunk_split(base64_encode($content));
        
        // main header (multipart mandatory)
        
        // carriage return type (RFC)
        $eol = "\r\n";
        
        //headers
        $headers[] = 'Content-Type: text/html; charset=UTF-8';
        $headers[] = 'From:' .$admin_email;

        //Set the recipient email address.
        $recipient = $admin_email;;

        //Set the email subject.
        $subject = "New CreditCapital Check Request from $name";

        // Build the email content.
        $email_content = 'Address Check To: '.$checkmadeto.$eol;
        $email_content .= 'Amount: $'.$credit_requested.$eol.$eol;
        
        $email_content .= 'Mailing Address:'.$eol;
        $email_content .= $name.$eol;
        $email_content .= $user_address.$eol.$eol;
        
        if ($expedited == 1) {
            $email_content .= 'Check Type: Expedited'.$eol.$eol;
        }
        else {
            $email_content .= 'Check Type: Standard'.$eol;
        }
        
        try {
          if (wp_mail($recipient, $subject, $email_content, $headers)) {
            wp_send_json_success('Credit Request for $'.$credit_requested. ' sent.');
          }
          else {
             wp_send_json_success('Credit Request failed.  Please ensure you have entered a number within your remaining credit');
          }
        } catch (Exception $e) {
           wp_send_json_success($e->getMessage());
        }
     }
}

我认为朝着正确方向取得的唯一进展是电子邮件的标题信息,切换到混合内容类型,因此......

$headers = 'From:' .$admin_email . $eol;
$headers .= "MIME-Version: 1.0" . $eol;
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol;
$headers .= "Content-Transfer-Encoding: 7bit" . $eol;
$headers .= "This is a MIME encoded message." . $eol;

我正在尝试以类似于通过 POST 的方式处理文件,但我没有运气 - 我看到的唯一反复出现的主题是这些行......

$filenameee =  $_FILES['file']['name'];
$fileName = $_FILES['file']['tmp_name'];
PHP AJAX 表单 电子邮件 附件

评论

1赞 Tangentially Perpendicular 5/12/2023
向电子邮件添加附件不需要 AJAX 和 HTML。既然您已经包含了这些代码,我们是否应该假设问题出在 AJAX 调用中,即将数据传输到服务器,或者我们可以假设它有效并且附加过程是问题所在,或者您还没有确定问题出在哪里?
1赞 Barmar 5/12/2023
请参阅 stackoverflow.com/questions/4554664/...了解如何使用 Wordpress 电子邮件发送附件。
0赞 jgdhnds 5/12/2023
@TangentiallyPerpendicular 问题当然在于我通过 JS 和 php 传递和接收 AJAX 调用的附件的能力。我尝试将其标记为“FormData”,因为这确实是问题所在,但我没有足够的声誉来这样做。
0赞 jgdhnds 5/12/2023
@Barmar 这是我目前看到的最有用的东西。比我一直在尝试的所有标题尝试要容易得多。狂野 我还没有遇到过。这消除了一半的可能问题。剩下要解决的是我使用 FormData 正确传递文件的困难。
1赞 Barmar 5/12/2023
formdata.append('file', file_data);应该工作

答: 暂无答案