我正在使用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>
答案 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++;
}
以下是我所做的更改的简要说明:
str_replace()
并不是真的需要。 trim()
是修剪前导或尾随空格的更有效的函数。
我将电子邮件地址及其相应的名称合并到一个名为$recipients
的关联数组中。这比通过数字键引用它们更容易跟踪,并且实际上将数据彼此关联。这也使得循环更容易阅读。
我简化了标头的创建方式。更容易在字符串的开头添加回车\r\n
,使其更容易阅读,更不容易忘记,或在结尾留下额外的回报。
虽然上述代码可行,但我也借此机会警告您当前代码中存在漏洞: Email Header Injection 。
如果攻击者向包含“\ r \ n”字符的表单提交内容,他们可以注入自己的标题。这意味着,他们最终可能会向更多人发送此电子邮件,或者他们可能会注入自己的自定义正文消息。
对于你如何防止这种攻击,This example应该是一个很好的例子,因为它的代码示例非常类似于你的。
你永远不应该信任通过$ _POST发送的输入。您应该验证提交的数据的格式是否符合预期,并且不包含任何恶意字符。