2011-09-22 92 views
0

我使用PHP的邮件功能向个人发送电子邮件。我想要一个简单的方法来定制电子邮件中的问候语名称,所以我创建了一个表单,其中包含用逗号分隔的电子邮件列表和用逗号分隔的名称列表,并且他们通过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="[email protected]"> 
<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

示例输入和输出将会有所帮助。例如,如果您对$ to_names的输入不是逗号分隔的,则不会像您期望的那样得到标记。 – Anson

+0

做一个'echo $ to_names;'以确保POST数据没有什么奇怪的事情发生,并且你的'''实际上正在被分隔。 – aus

+0

然后做'echo $ explode_names [0]'看看会发生什么。 – aus

回答

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() WASN真的不需要。 trim()是修剪前导空白或尾随空白的更有效的功能。

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

  3. 我简化了如何创建标题。在字符串的起始处添加回车\r\n比较容易,这样可以更容易阅读,并且不太可能会忘记,或者在结尾留下额外的回报。

虽然上面的代码将工作,我也会借此机会也警告你出现在你的当前代码漏洞的:Email Header Injection

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

This example对于如何防止这种攻击应该是一个很好的例子,因为它的代码示例非常类似于您的代码。

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

+0

此外,它正在私人服务器上使用,它不会被任何人访问。如果是这样,我一定会做一些sql注入预防。谢谢。 –

+0

好的,我把它回来...它不起作用,其他人是否可以运行这个程序,看看他们是否遇到以下相同的问题?发送给第一个人的电子邮件会工作..它会说“Brian,这是一条消息”,但是发送给第二个人的电子邮件会对第三人和第四人说“Brian,Tory,这是一条信息”等等,它不断地将以前的名字加入到电子邮件中,但是它的回声正确,我完全不知所措。 –

+0

啊,对不起。这是意外的指定'$ message'变量,使得每个循环前面加上名字。我编辑了上面的代码来解决这个问题。 –