在PHP Mail中发送名称数组

时间:2011-09-22 21:48:36

标签: php email post explode

我正在使用PHP的邮件功能向个人发送电子邮件。我想要一种简单的方法来自定义电子邮件中的问候语名称,因此我创建了一个表单,其中有逗号分隔的电子邮件列表和逗号分隔的名称列表,并通过PHP发布和邮寄。

但是,每次发送时,名称都会吐出整个名称数组,而不是我指定的ONE值。我已经在这个工作了一个小时了,不能为我的生活看到问题出在哪里..这么简单的代码!如果您发现任何明显的错误,请通过以下代码告诉我。

$to_emails = $_POST['to_emails'];
$to_names = $_POST['to_names'];
$from_email = $_POST['from_email'];
$message = $_POST['message'];
$subject = $_POST['subject'];

$explode_emails = str_replace(" ", "", explode(",",$to_emails));    
$explode_names = explode(",",$to_names);

$email_array = array();

$i=0;
foreach($explode_names as $e) {
    $name = $e;
    $to      = $explode_emails[$i];
    $subject = $subject;
    $message = $name.",\r\n".$message;
    $headers = 'From: '.$from_email . "\r\n" .
        'Reply-To: '.$from_email . "\r\n" .
        'X-Mailer: PHP/' . phpversion();
    mail($to, $subject, $message, $headers);        
    echo "<font color='#FF0000'>".$i." Emailed: ".$name." : ".$to."</font><br />";
    $i++;

}


<form method="post">
To Emails (comma separated)
<input type="text" name="to_emails" value="">
<br /><br />
To Names (comma separated)
<input type="text" name="to_names" value="">
<br /><br />


From
<input type="text" name="from_email" value="trgentes@gmail.com">
<br /><br />

Subject
<input type="text" name="subject" value="">
<br /><br />

Message
<textarea name="message" rows="5" id="message"></textarea>
<br /><br />

<input type="submit" />

</form>

1 个答案:

答案 0 :(得分:3)

这就是我想出的。我不确定这是否完全符合您的要求,但它会向指定的所有人发送电子邮件:

$to_emails = $_POST['to_emails'];
$to_names = $_POST['to_names'];
$from_email = $_POST['from_email'];
$message = $_POST['message'];
$subject = $_POST['subject'];

$explode_emails = array_map('trim', explode(",", $to_emails));
$explode_names = array_map('trim', explode(",",$to_names));

$recipients = array_combine($explode_emails, $explode_names);

$i=0;
foreach($recipients as $email => $name) {
    $headers = 'From: ' . $from_email;
    $headers .= "\r\nReply-To: " . $from_email;
    $headers .= "\r\nX-Mailer: PHP/" . phpversion();

    $finalMessage = $name . ",\r\n" . $message;

    mail($email, $subject, $finalMessage, $headers);        

    echo "<font color='#FF0000'>" . $i . " Emailed: " . $name . " : " . $email . "</font><br />";

    $i++;
}

以下是我所做的更改的简要说明:

  1. str_replace()并不是真的需要。 trim()是修剪前导或尾随空格的更有效的函数。

  2. 我将电子邮件地址及其相应的名称合并到一个名为$recipients的关联数组中。这比通过数字键引用它们更容易跟踪,并且实际上将数据彼此关联。这也使得循环更容易阅读。

  3. 我简化了标头的创建方式。更容易在字符串的开头添加回车\r\n,使其更容易阅读,更不容易忘记,或在结尾留下额外的回报。

  4. 虽然上述代码可行,但我也借此机会警告您当前代码中存在漏洞: Email Header Injection

    如果攻击者向包含“\ r \ n”字符的表单提交内容,他们可以注入自己的标题。这意味着,他们最终可能会向更多人发送此电子邮件,或者他们可能会注入自己的自定义正文消息。

    对于你如何防止这种攻击,

    This example应该是一个很好的例子,因为它的代码示例非常类似于你的。

    你永远不应该信任通过$ _POST发送的输入。您应该验证提交的数据的格式是否符合预期,并且不包含任何恶意字符。