我有这个简单的联系表格:
<form id="emailForm" action="contact.php" method="POST">
<label for="name">Your name</label>
<input type="text" id="name" name="name">
<label for="email">Your email</label>
<input type="text" id="email" name="email">
<label for="subject">Subject</label>
<input type="text" id="subject" name="subject">
<label for="message">Message</label>
<textarea id="message" name="message"></textarea>
<p class="emailPop" id="emailError"></p>
<input id="submit" type="submit" value="Send">
</form>
如果邮件包含像àèìòù
这样的unicode字符,当我收到包含我已发送邮件的电子邮件时,它们会以奇怪的方式显示,例如à à à ùòèòòòèà èà à ò
。
我将表单摘录到仅包含表单的页面,来自该页面的邮件到达了我的电子邮件,没有任何修改。经过一些实验,我发现问题的原因是标签<meta charset="utf-8">
,实际上应该让事情发挥作用。
由于其他页面使用unicode字符,我不能没有这个标签,但它会与我的表单输出冲突。我该怎么办?
这是负责发送电子邮件的php脚本的代码
<?php
//require_once 'Mail.php';
function exit_message($error) {
echo json_encode(array('status' => 'error', 'message' => $error));
exit();
}
$data = $_POST;
// Check that all fields are filled in
$fields = array('name', 'email', 'subject', 'message');
foreach($fields as $field) {
if(empty($data[$field]))
exit_message("Please insert your " . $field . '.');
}
// Check if email is valid
if(!filter_var($data['email'], FILTER_VALIDATE_EMAIL))
exit_message('The email you provided is invalid.');
// Check if message is longer than 9 characters
if(strlen($data['message']) <= 9)
exit_message('Please write a message at least 9 characters long.');
// Begin composing the message
$message = array(
'recipient' => 'xxxxxxx@gmail.com',
'subject' => $data['subject'],
'body' => stripslashes($data['message']) . ' - gabrielecirulli.com',
'headers' => 'From: "' . $data['name'] . '" <' . $data['email'] . '>'
);
// Send
if(mail(
$message['recipient'],
utf8_encode($message['subject']),
utf8_encode($message['body']),
$message['headers']
)) {
echo json_encode(array('status' => 'ok'));
} else {
exit_message('An unidentified error happened while sending your message.');
}
这是一个例子:如果我通过我的页面发送消息
http://www.gabrielecirulli.com/p/20120113-073417.png
如果我通过没有<meta charset="utf-8">
的测试页发送相同的消息:
http://www.gabrielecirulli.com/p/20120113-073503.png
结果如下:
http://www.gabrielecirulli.com/p/20120113-073737.png
正如您所看到的,没有元标记的页面实际上给出了正确的字符。
此问题同时出现在Google Chrome和Firefox中。
答案 0 :(得分:2)
摆脱身体和主题的utf8_encode
!当您的数据来自浏览器时,您的数据已经是UTF-8,您无需将从Latin-1转换为UTF-8(这是utf8_encode
所做的)。< / p>
您还应该在指定其编码的消息中添加适当的标头:
'headers' => 'From: "' . $data['name'] . '" <' . $data['email'] . ">\r\n" .
"MIME-Version: 1.0\r\n" .
'Content-type: text/plain; charset=utf-8'
身体上也不需要stripslashes
,除非你有魔术行情,在这种情况下你应该停用Magic Quotes。