Отправка массива имен в PHP Mail - PullRequest
0 голосов
/ 23 сентября 2011

Я использую функцию почты PHP для отправки писем частным лицам. Я хотел простой способ настроить имя приветствия в электронном письме, поэтому я создал форму, в которой есть разделенный запятыми список электронных писем и разделенный запятыми список имен, и они отправляются и отправляются по почте через PHP.

Однако, каждый раз, когда я отправляю его, имя выплевывает весь массив имен, а не ОДНО значение, которое я указываю. Я работаю над этим уже час и не могу понять, в чем проблема ... в таком простом коде! Вот код, дайте мне знать, если вы видите какие-либо явные ошибки.

$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 Ответ

3 голосов
/ 23 сентября 2011

Вот что я придумал.Я не уверен, что это именно то, что вы хотите, но отправит электронное письмо всем указанным людям:

$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 в начале строки, чтобы его было легче читать, и было меньше шансов забыть его, либо оставить дополнительный возврат в конце.

Хотя приведенный выше код будет работать, я также воспользуюсь этой возможностью, чтобы также предупредить вас об уязвимости, присутствующей в вашем текущем коде: Инъекция заголовка электронной почты .

Если злоумышленник отправляет в вашу форму контент, содержащий символ "\ r \ n", он может добавить свои собственные заголовки.Это означает, что они могут отправить это электронное письмо большему количеству людей, чем вы хотите, или они могут добавить свое собственное сообщение.

Этот пример должен быть хорошим примером дляВы о том, как предотвратить подобные атаки, так как пример кода очень напоминает ваш.

Вы НИКОГДА не должны доверять вводу, отправленному через $ _POST.Вам следует проверить, что представленные данные находятся в том формате, который вы ожидаете, и не содержат вредоносных символов.

...