【问题标题】:PHP Send mail function. How to make one email address receive one email containing data based on the number of ticked checkbox in a tablePHP 发送邮件功能。如何使一个电子邮件地址收到一封包含基于表格中选中复选框数量的数据的电子邮件
【发布时间】:2016-03-06 04:16:48
【问题描述】:

我正在开发我系统的发送邮件功能。我有一个表格,显示我的数据库中的数据。我系统的发送邮件功能是这样的:

用户应填写包含以下内容的表格:负责人(电子邮件地址)、评论和状态(打开或关闭),然后勾选表格中的复选框。该行中的所有值都将发送给负责人。它正在成功运行。我现在要做的是,如果我勾选了 2 个复选框并且我有同一个负责人,而不是收到两封电子邮件,我想将其设为一封电子邮件,其中包含根据勾选复选框数量的数据。例如,我勾选了将发送到 emailadd@yahoo.com 的 2 个复选框。我将如何做到这一点?:

更新:

我会更详细地解释它,因为我认为我的问题太复杂了。我想要的是,如果一个电子邮件地址是多个问题的接收者,而不是每个问题接收一封电子邮件,这些问题将放在一封电子邮件中。所以收件人只会在一封电子邮件中阅读它。

function InsertEmailMessage() {

    $explode_check=explode(',', $_POST['ticked']);
    //print_r($explode_check); 
    for($i=0;$i<count($explode_check);$i++)
    {
        $Selcheckb=$explode_check[$i];

        $sql6 = "SELECT * FROM invalid_invoice WHERE ID='".$Selcheckb."'";
        $conn = dbConnect();
        $stmt6 = $conn->prepare($sql6); 
        //$stmt6->bindParam(':id6', $_POST['idtxt'], PDO::PARAM_INT);
        $stmt6->execute();
        $data = $stmt6->fetchAll(PDO::FETCH_ASSOC);

        //var_dump($data);    

        foreach ($data as $row6) {

            $invnumb=$row6['Invoice_Number'];
            $partnumb=$row6['Part_Number'];
            $issue=$row6['Issues'];
            $pic=$row6['PIC_Comments'];
            $emailadd= $row6['PersoninCharge'];
            $issuetype=$row6['Issue_Type'];
            $createdate=$row6['Creation_Date'];
            $site=$row6['Site'];
            $vendor=$row6['Vendor_Name'];
            $invdate=$row6['Invoice_Date'];
            $po=$row6['PO'];
            $rr=$row6['RR']; 
            $currency=$row6['Currency'];
            $invamount=$row6['Invoice_Amount'];
            $stat=$row6['Status'];


            if($row6['Status']=="Open") {


                $message = "<html><b>Issue Type: {$issuetype} </b><br><br>";       
                $message .= "<b>Creation Date: {$createdate} </b><br><br>";
                $message .= "<b>Site: {$site} </b><br><br>";
                $message .= "<b>Vendor Name: {$vendor} </b><br><br>";
                $message .= "<b>Invoice Date: {$invdate} </b><br><br>";
                $message .= "<b>Invoice Number: {$invnumb} </b><br><br>";
                $message .= "<b>Part Number:</b><br>{$partnumb}<br><br>";
                $message .= "<b>PO: {$po} </b><br><br>";
                $message .= "<b>RR: {$rr} </b><br><br>";
                $message .= "<b>Currency: {$currency} </b><br><br>";
                $message .= "<b>Invoice Amount: {$invamount} </b><br><br>";
                $message .= "<b>Issues:</b><br>{$issue}<br>";
                $message .= "<b>Status: {$stat} </b><br><br>";  
                $message .= "<b>{$pic}<b><br>";  
                $message .= "</html>";

            }

            if(!empty($emailadd)) {
                dbInsertEmailMessage($emailadd, "Invoice Number: {$invnumb} - {$issue}.", $message);
                echo "<script language='javascript'>alert('Email sent to {$emailadd}.')</script>";
            }

        }
    }

    $conn=null;
}



function dbInsertEmailMessage($send_to, $subject, $message) {

    $sql7 = "INSERT INTO email_queue (send_to, subject, message) VALUES (:send_to, :subject, :message)";    
    $conn = dbConnect();
    $stmt7 = $conn->prepare($sql7); 
    $stmt7->bindParam(':send_to', $send_to);
    $stmt7->bindParam(':subject', $subject);
    $stmt7->bindParam(':message', $message);
    $stmt7->execute();
    $conn=null; 
}

【问题讨论】:

    标签: javascript php mysql pdo


    【解决方案1】:

    你只需要移动一些东西。无需在 foreach 循环中发送,只需构建一个以电子邮件地址为键的 $messages 数组。构建完所有消息后,循环消息并发送。

    此外,您的代码对 SQL 注入开放,允许任何人运行他们想要的任何查询。使用 PDO 的 -&gt;bindParam 方法,您走在了正确的轨道上。

    代码如下:

    function InsertEmailMessage() {
        $explode_check=explode(',', $_POST['ticked']);
        //print_r($explode_check);
    
        $messages = array();
    
        for($i=0;$i<count($explode_check);$i++)
        {
            $Selcheckb=$explode_check[$i];
    
            $conn = dbConnect();
            $stmt6 = $conn->prepare("SELECT * FROM invalid_invoice WHERE ID=:cb");
            $stmt6->bindParam(':cb', $Selcheckb);
            $stmt6->execute();
            $data = $stmt6->fetchAll(PDO::FETCH_ASSOC);
    
            //var_dump($data);
    
            foreach ($data as $row6) {
    
                $invnumb=$row6['Invoice_Number'];
                $partnumb=$row6['Part_Number'];
                $issue=$row6['Issues'];
                $pic=$row6['PIC_Comments'];
                $emailadd= $row6['PersoninCharge'];
                $issuetype=$row6['Issue_Type'];
                $createdate=$row6['Creation_Date'];
                $site=$row6['Site'];
                $vendor=$row6['Vendor_Name'];
                $invdate=$row6['Invoice_Date'];
                $po=$row6['PO'];
                $rr=$row6['RR'];
                $currency=$row6['Currency'];
                $invamount=$row6['Invoice_Amount'];
                $stat=$row6['Status'];
    
                if($row6['Status']=="Open") {
                    if(!isset($messages[$emailadd])) {
                      $messages[$emailadd] = '';
                    }
    
                    $messages[$emailadd] .= "<b>Issue Type: {$issuetype} </b><br><br>";
                    $messages[$emailadd] .= "<b>Creation Date: {$createdate} </b><br><br>";
                    $messages[$emailadd] .= "<b>Site: {$site} </b><br><br>";
                    $messages[$emailadd] .= "<b>Vendor Name: {$vendor} </b><br><br>";
                    $messages[$emailadd] .= "<b>Invoice Date: {$invdate} </b><br><br>";
                    $messages[$emailadd] .= "<b>Invoice Number: {$invnumb} </b><br><br>";
                    $messages[$emailadd] .= "<b>Part Number:</b><br>{$partnumb}<br><br>";
                    $messages[$emailadd] .= "<b>PO: {$po} </b><br><br>";
                    $messages[$emailadd] .= "<b>RR: {$rr} </b><br><br>";
                    $messages[$emailadd] .= "<b>Currency: {$currency} </b><br><br>";
                    $messages[$emailadd] .= "<b>Invoice Amount: {$invamount} </b><br><br>";
                    $messages[$emailadd] .= "<b>Issues:</b><br>{$issue}<br>";
                    $messages[$emailadd] .= "<b>Status: {$stat} </b><br><br>";
                    $messages[$emailadd] .= "<b>{$pic}<b><br>";
                    $messages[$emailadd] .= "<br><br>";
                }
            }
        }
    
        foreach($messages as $email=>$message) {
            dbInsertEmailMessage($email, "Invoice Number: {$invnumb} - {$issue}.", "<html>{$message}</html>");
            echo "<script language='javascript'>alert('Email sent to {$email}.')</script>";
        }
    
        $conn=null;
    }
    
    function dbInsertEmailMessage($send_to, $subject, $message) {
        $sql7 = "INSERT INTO email_queue (send_to, subject, message) VALUES (:send_to, :subject, :message)";
        $conn = dbConnect();
        $stmt7 = $conn->prepare($sql7);
        $stmt7->bindParam(':send_to', $send_to);
        $stmt7->bindParam(':subject', $subject);
        $stmt7->bindParam(':message', $message);
        $stmt7->execute();
        $conn=null;
    }
    

    【讨论】:

    • 我会解释更多,因为我认为我的问题太复杂了。我想要的是,如果一个电子邮件地址是多个问题的接收者,而不是每个问题接收一封电子邮件,这些问题将放在一封电子邮件中。所以收件人只会在一封电子邮件中阅读它。
    • 我已经更新了答案。我不确定如何处理主题{$invnumb} - {$issue},因为它似乎可能有多个值。您可能只想从主题中删除这些值并使用通用的东西,因为数据在消息中。
    • 应该是 (foreach($messages as $email=>$message) 而不是 (foreach(messages as $email=>$message)???
    • 我试过你的代码,但是数据没有插入到数据库中。
    • 是的,抱歉.. 使用我的 python IDE 编写 php,所以我没有听懂。它实际上应该是foreach($messages as $email=&gt;$message)。我会用正确的代码更新答案。
    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 2011-07-14
    • 1970-01-01
    • 2012-09-15
    • 2017-10-27
    • 1970-01-01
    • 2014-04-30
    • 2014-07-20
    相关资源
    最近更新 更多