簡體   English   中英

在PHP Mail中發送名稱數組

[英]Sending name array in PHP Mail

我正在使用PHP的Mail函數將電子郵件發送給個人。 我想要一種簡單的方法來自定義電子郵件中的問候語名稱,因此我創建了一個表單,其中有一個逗號分隔的電子郵件列表和一個逗號分隔的名稱列表,它們通過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>

這是我想出的。 我不確定這是否能滿足您的要求,但是會向所有指定的人發送電子郵件:

$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更容易,使其更易於閱讀,並且不太可能忘記其中一個,或者在結尾處留一個額外的回車符。

盡管上面的代碼可以工作,但我也將借此機會向您警告當前代碼中存在的漏洞: Email Header Injection

如果攻擊者向您的表單提交包含“ \\ r \\ n”字符的內容,則他們可以注入自己的標頭。 這意味着,他們最終可能會將這封電子郵件發送給比您希望發送給更多的人,或者他們可能會植入自己的自定義正文消息。

該示例應該是您如何防止此類攻擊的一個很好的示例,因為其代碼示例與您的代碼非常相似。

您永遠不要信任通過$ _POST發送的輸入。 您應該驗證提交的數據是否符合您期望的正確格式,並且不包含任何惡意字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM