1

我已经研究过使用 mail() 发送给多个收件人,但我无法让它工作。我想要做的是,对于我拥有的每个订单,订单 1、2、3,每个都有自己的电子邮件地址,当我将他们的订单状态从待定更改为确认时,mail() 将使用该 ID 来引用db 表并发送这 3 个订单的电子邮件。但就我而言,它只邮寄了最新的订单,即订单 3。这是我用来更改订单状态的表格。

<form action="results-action" method="post" enctype="multipart/form-data">
<fieldset>


<table id ="table_id" class="display">

<thead>

<tr><td><h2>Pending Order</h2></td></tr>

<tr>
<th scope="col">Order ID</th>
<th scope="col"> </th>
<th scope="col">Name</th>
<th scope="col">Address</th>
<th scope="col">Product Name</th>
<th scope="col">Produt Quantity</th>
<th scope="col">Price</th>
<th scope="col">Order status</th>
</tr>
</thead>

<tbody>

<?php 
while ($row = mysqli_fetch_array($result)) {
?>

<tr>
<td><input type="text" value='<?=$row['virtuemart_order_id']?>' name="orderid" id="virtuemart_order_id"></td>
<td><input type="hidden" value='<?=$row['virtuemart_product_id']?>' name="productid" id="virtuemart_product_id"></td>
<td><?=$row['first_name']?></td>
<td><?=$row['address_1']?></td>
<td><?=$row['order_item_name']?></td>

<td><?=$row['product_quantity']?></td>

<td><?=$row['product_final_price'] ?></td>
<td><select name='change[<?=$row['virtuemart_order_id']?>]'>
<option value='C'> Confirmed</option>

<option value='X'> Cancelled</option></select></td>
</tr>

<?php
}
?>

</tbody>
</table>
</fieldset>



<fieldset>
<table>
<tr>
<td><input type="submit" value="Update status" name="update status"> </td>
</tr>
</table>
</fieldset>



</form>

这是 php,使用表单中的订单 ID 来选择电子邮件地址。

<?php
$orderid = $_POST['orderid'];


// build SQL statement to select email addresses
$query3 = "SELECT email from ruj3d_virtuemart_order_userinfos where virtuemart_order_id = '$orderid'";


// execute SQL statement
$result3 = mysqli_query($link, $query3) or die(mysqli_error($link)); 


$subject = "Order confirmed by Home and decor";
$message = "Hello! This is a message to inform that your order has been confirmed";
$from = "107496@myrp.edu.sg";
$headers = "From: $from";

while($row3 = mysqli_fetch_array($result3)){ 

$addresses[] = $row3['email'];

}

$to = implode(",", $addresses);



mail($to, $subject, $message, $headers);

?>
4

4 回答 4

1

您可以将 a 添加到您的标题中,这是创建HeadersCc的部分原因:

$headers = "From: $from" . "\r\n";
$headers .= "Cc: ".$secondEmail.', '.$thirdEmail . "\r\n"
于 2012-11-19T22:41:00.167 回答
0

我认为您需要在逗号后添加一个空格,如下所示: $to = implode(", ", $addresses);

于 2012-11-19T22:40:20.723 回答
0

代替

Select
  email 
From 
  ruj3d_virtuemart_order_userinfos 
Where 
  virtuemart_order_id = '$orderid'

Select
  email 
From 
  ruj3d_virtuemart_order_userinfos 
Where 
  virtuemart_order_id In ($orderid)

(我可能PHP错了,我只是在进行sql语句。如果您提交多个时$orderid看起来不像逗号分隔列表,那么您需要将其设为一个)

实际上,不要只是这样做,还要学习 SQL 注入,并用 PDO 尤其是PDO::Prepare替换已弃用的 mysqli 库

哦,如果这些是不同的客户,请不要在收件人字段中发送邮件,您的客户不会感谢您将他们的电子邮件地址发送给彼此。

于 2012-11-19T22:44:43.793 回答
0

您使用了错误的$_POST字段来选择您的电子邮件地址。

第一个 php 文件生成的表单包含一个表格,每行包含一个名为'orderid'. 但是你真正感兴趣的字段是select每一行的输入值。这些都存储在一个以数组命名change$_POST数组中。

这是一个如何$_POST初始化以对应于表单返回的选择值的示例:

$_POST['change'] = array('id1' => 'C', 'id2' => 'X' /*, 'id3' => ... */ );

所以你需要:

  • 获取表单中返回的数组$_POST
  • 过滤掉不等于'C'的条目,
  • 保留这些条目的密钥,
  • 逃离它们以对它们进行消毒,

您应该将 php 文件的开头替换为以下内容,如上文所述。

第一个版本不清理条目:

<?php

function confirmed($v) { return ($v == 'C'); }

// pick the rows in your form table which have been set as confirmed, and use the keys 
$orderid = implode(',', array_keys(array_filter($_POST['change'],'confirmed')));

// build SQL statement to select email addresses
$query3 = "SELECT email FROM ruj3d_virtuemart_order_userinfos WHERE virtuemart_order_id IN (".$orderid.")";

// etc.

这个做消毒:

<?php

function confirmed($v) { return ($v == 'C'); }

// pick the rows in your form table which have been set as confirmed, and use the keys 
$orderid = implode(',', array_map('mysql_real_escape_string', 
                                  array_keys(array_filter($_POST['change'],'confirmed'))));


// build SQL statement to select email addresses
$query3 = "SELECT email FROM ruj3d_virtuemart_order_userinfos WHERE virtuemart_order_id IN (".$orderid.")";

// etc.

有关将 BCC 与该功能一起使用的信息,请参阅此SO 问题。mail()

于 2012-11-19T22:54:35.220 回答