【问题标题】:Data push via Ajax/Post通过 Ajax/Post 推送数据
【发布时间】:2021-08-16 06:06:57
【问题描述】:

我构建了一个 PHP/Ajax 脚本来通过 PHPMailer 发送大量时事通讯电子邮件,除了从 HTML INPUT BOX 中获取电子邮件主题的值外,它工作得非常好。

该表使用以下 HTML/Bootstrap 从 MySQL 数据库中获取值;

<div class="table-responsive">
                <table class="table table-bordered table-striped">
                    <tr>
                        <th>Customer Name</th>
                        <th>Email</th>
                        <th>Select</th>
                        <th>Action</th>
                    </tr>
                <?php
                $count = 0;
                foreach($result as $row)
                {
                    $count = $count + 1;
                    echo '
                    <tr>
                        <td>'.$row["customer_name"].'</td>
                        <td>'.$row["customer_email"].'</td>
                        <td>
                            <input type="checkbox" name="single_select" class="single_select" data-email="'.$row["customer_email"].'" data-name="'.$row["customer_name"].'" />
                        </td>
                        <td>
                        <button type="button" name="email_button" class="btn btn-info btn-xs email_button" id="'.$count.'" data-email="'.$row["customer_email"].'" data-name="'.$row["customer_name"].'" data-action="single">Send Single</button>
                        </td>
                    </tr>
                    ';
                }
                ?>
                
                    <tr>
                        <td colspan="3"></td>
                        <td><button type="button" name="bulk_email" class="btn btn-info email_button" id="bulk_email" data-action="bulk">Send Bulk</button></td></td>
                    </tr>
                    <tr>
                </table>
            </div>

下面的AJAX/POST提交数据到PHP调用PHPMailer函数;

<script>
$(document).ready(function(){
    $('.email_button').click(function(){
        $(this).attr('disabled', 'disabled');
        var id  = $(this).attr("id");
        var action = $(this).data("action");
        var email_data = [];
        if(action == 'single')
        {
            email_data.push({
                email: $(this).data("email"),
                name: $(this).data("name")
            });
        }
        else
        {
            $('.single_select').each(function(){
                if($(this).prop("checked") == true)
                {
                    email_data.push({
                        email: $(this).data("email"),
                        name: $(this).data("name")
                    });
                } 
            });
        }

        $.ajax({
            url:"send_mail.php",
            method:"POST",
            data:{email_data:email_data},
            beforeSend:function(){
                $('#'+id).html('Sending...');
                $('#'+id).addClass('btn-danger');
            },
            success:function(data){
                if(data == 'ok')
                {
                    $('#'+id).text('Success');
                    $('#'+id).removeClass('btn-danger');
                    $('#'+id).removeClass('btn-info');
                    $('#'+id).addClass('btn-success');
                }
                else
                {
                    $('#'+id).text(data);
                }
                $('#'+id).attr('disabled', false);
            }
        })

    });
});
</script>

以下 PHP 脚本抓取数据并发送电子邮件,效果非常好。

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer-master/src/Exception.php';
require 'PHPMailer-master/src/PHPMailer.php';
require 'PHPMailer-master/src/SMTP.php';

if(isset($_POST['email_data']))
{
    $output = '';
    foreach($_POST['email_data'] as $row)
    {
        $mail = new PHPMailer;
        $mail->IsSMTP();        
        $mail->XMailer  = "Gleez CMS 0.10.5";   
        $mail->SMTPKeepAlive = true;                    
        $mail->Host = "smtp.gmail.com";
        $mail->Port = 587;
        $mail->SMTPAuth = TRUE;
        $mail->Username = "user@gmail.com";
        $mail->Password = "password";
        $mail->SMTPSecure = "tls";
        $mail->From = "user@gmail.com";
        $mail->FromName = "Jack N";
        $mail->AddAddress($row["email"], $row["name"]);
        $mail->WordWrap = 50;
        $mail->IsHTML(true);
        $mail->Subject = "You have a new message";
        $mail->Body = "This line also supports html";

        $mail->AltBody = '';

        $result = $mail->Send();

        if($result["code"] == '400')
        {
            $output .= html_entity_decode($result['full_error']);
        }

    }
    if($output == '')
    {
        echo 'ok';
    }
    else
    {
        echo $output;
    }
}

?>

我面临的挑战是替换

$mail->Subject = "You have a new message";

与

$mail->Subject($row["subject"]);

我尝试的操作是在我的 HTML 页面中包含以下行,例如,

<input type="text" name="subject" id="subject">

// modify the AJAX Script

subject:$(this).data("subject")
or var subject = document.getElementById("subject");

但没有成功! :(

请指导一下?谢谢!祝大家身体健康。干杯。

【问题讨论】:

  • 不确定您将$(this).data("subject") 放在哪里,但这一切都取决于this 是什么,以及是否具有适当的data-subject 属性。
  • var subject = document.getElementById("subject"); 将变量设置为匹配元素。不过,您可能想要元素的值。

标签: php ajax ajaxform


【解决方案1】:

由于您从 $(this) 的数据属性中获取“主题”,因此您需要在复选框/按钮上填充数据。

所以从你当前的代码

<input type="checkbox" name="single_select" class="single_select" data-email="'.$row["customer_email"].'" data-name="'.$row["customer_name"].'" />
<button type="button" name="email_button" class="btn btn-info btn-xs email_button" id="'.$count.'" data-email="'.$row["customer_email"].'" data-name="'.$row["customer_name"].'" data-action="single">Send Single</button>

你需要转换成

<input type="checkbox" name="single_select" class="single_select" data-email="'.$row["customer_email"].'" data-name="'.$row["customer_name"].'" data-subject="'.$row["subject"].'" />
<button type="button" name="email_button" class="btn btn-info btn-xs email_button" id="'.$count.'" data-email="'.$row["customer_email"].'" data-name="'.$row["customer_name"].'" data-action="single" data-subject="'.$row["subject"].'">Send Single</button>

一旦您填充了数据属性,您将能够执行您已经在执行的操作,也可以使用 subject:$(this).data("subject") 来填充它。

【讨论】:

  • 太棒了!谢谢安德里亚。填充数据主体需要从数据库中获取数据。任何建议如何简单地获取输入框的值并通过 ajax 发布到 phpmailer?我最好的尝试是添加一个输入框,&lt;input type="text" name="subject" id="subject"&gt; 使用 var subject = document.getElementById("subject"); 和 ajax subject:$(this).data("subject") 读取值虽然;我没工作。有什么想法吗?
  • 您对如何从输入中获取主题是正确的。最后一部分应该是subject:subject 或subject:document.getElementById("subject");,因为你没有使用$(this)。 $(this) 实际上是按钮或复选框
  • 没有成功。一旦我尝试通过 getElementId 读取值并发布后,脚本根本不起作用代码如下,$('.email_button').click(function(){ $(this).attr('disabled', 'disabled'); var id = $(this).attr("id"); var action = $(this).data("action"); var subject = document.getElementById("subject"); var email_data = []; if(action == 'single') { email_data.push({ email: $(this).data("email"), name: $(this).data("name"), subject:subject }); } else {
  • 我已经解决了我的问题,$.ajax({ url:"send_mail.php", method:"POST", data:{email_data:email_data,subject}, 和 var subject = document.getElementById("subject").value; 谢谢!
猜你喜欢
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多