[英]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++;
}
以下是我所做更改的簡要說明:
確實不需要str_replace()
。 trim()
是修剪前導或尾隨空白的更有效函數。
我將電子郵件地址及其對應的名稱合並到一個名為$recipients
的關聯數組中。 這比通過數字鍵引用它們更容易跟蹤,並且實際上將數據彼此關聯。 這也使得遍歷它們更容易閱讀。
我簡化了標題的創建方式。 在字符串的開頭添加回車符\\r\\n
更容易,使其更易於閱讀,並且不太可能忘記其中一個,或者在結尾處留一個額外的回車符。
盡管上面的代碼可以工作,但我也將借此機會向您警告當前代碼中存在的漏洞: Email Header Injection 。
如果攻擊者向您的表單提交包含“ \\ r \\ n”字符的內容,則他們可以注入自己的標頭。 這意味着,他們最終可能會將這封電子郵件發送給比您希望發送給更多的人,或者他們可能會植入自己的自定義正文消息。
該示例應該是您如何防止此類攻擊的一個很好的示例,因為其代碼示例與您的代碼非常相似。
您永遠不要信任通過$ _POST發送的輸入。 您應該驗證提交的數據是否符合您期望的正確格式,並且不包含任何惡意字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.