【问题标题】:UTF-8 characters in an email form电子邮件表单中的 UTF-8 字符
【发布时间】:2011-10-23 10:23:05
【问题描述】:

下面的代码应通过将数据发送到相关数据库表的联系表单生成 UTF-8 编码的电子邮件。但是,它仍然无法正确显示 UTF-8 字符。你能看看我是否输入错误/没有添加/弄乱下面的代码吗?非常感谢!

<?php
$text = "Results from form:\n\n";
$space = ' ';
$line = '
';
foreach ($_POST as $key => $value)
{
if ($req == '1')
{
if ($value == '')
{echo "$key is empty";die;}
}
$j = strlen($key);
if ($j >= 20)
{echo "Name of form element $key cannot be longer than 20 characters";die;}
$j = 20 - $j;
for ($i = 1; $i <= $j; $i++)
{$space .= ' ';}
$value = str_replace('\n', "$line", $value);
$conc = "{$key}:$space{$value}$line";
$text .= $conc;
$space = ' ';
}
mail($emailadd, $subject, $text, 'From: '.$emailadd.'');
echo '<META HTTP-EQUIV=Refresh charset=utf-8 CONTENT="0; URL='.$url.'">';
?>

编辑:

感谢克里斯的快速响应——不过,我们的电子邮件表单依赖于“func.php”文件,其中包含网站的各种设置。目前'sendemail'代码如下:

$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
$headers .= "From: ".$hostmail." \r\n";
$headers .= "Reply-To : ".$hostmail." \r\n";
return mail($to, $subj, $body, $headers);

我试过改变如下,没有成功...有什么想法吗?

$headers .= "From: ".$hostmail." \r\n";
$headers .= "Reply-To : ".$hostmail." \r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=utf-8\r\n";
$headers .="Content-Transfer-Encoding: 8bit";
$body=htmlspecialchars_decode($body,ENT_QUOTES);
return mail($to, "=?utf-8?B?".base64_encode($subj)."?=",$body, $headers);

【问题讨论】:

    标签: forms utf-8 character-encoding


    【解决方案1】:

    这可能有用,也可能没有用,但我想我很感激你在处理 PHP 中的邮件错误时的痛苦,所以我想我至少会尝试帮助这个线程运行!

    我不想问的一件事是,您确定发布的值是 UTF-8 编码的吗?另外,我不禁认为换行符可能会导致一些时髦的行为,所以为什么不尝试这样的事情(如果适用):

    line = "\r\n";
    $value = str_replace('\n', $line, $value);
    

    注意我为 $line 输入的换行符周围的 双引号...我假设上面的第一个 '\n' 实际被放入值和需要中更换?否则,尤其是纯文本电子邮件,您不必担心解析这些换行符,只需将其直接输入邮件消息即可。

    编辑:

    不确定这是否会有所帮助,但在使用 Zend's mail libraries(UTF-8 和 base64 编码)运行最基本的邮件发送功能并检查通过的邮件的来源之后,这基本上就是您所需要的纯文本邮件,将其作为消息:

    $message = "This is a\r\ntest message";
    

    ...邮件源 sn-p 将是:

    Date: Sun, 23 Oct 2011 16:24:16 +0300
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: base64
    Content-Disposition: inline
    MIME-Version: 1.0
    
    VGhpcyBpcyBhDQp0ZXN0IG1lc3NhZ2U=
    

    编辑 #2:

    好的,我想我终于想出了一些有用的方法,尽管这只会在发送带有捷克特殊字符的 HTML 邮件消息时有所帮助。问题似乎与字符编码的关系不如 HTML 特殊字符(好吧,无论如何对我来说!),所以下面的代码似乎在我可信赖的 Firefox 网络浏览器中可以很好地生成原始文本:

    <?php
    
    // original message...
    $message = "To je nějaký ukázkový text.\r\nTento text je na dalším řádku.";
    
    // convert as many characters as possible in PHP < 5.4...
    $message = htmlentities($message, ENT_QUOTES, 'UTF-8');
    
    // I suspect this next line will work for all characters in PHP >= 5.4...
    // $message = htmlentities($message, ENT_SUBSTITUTE, 'UTF-8');
    
    // if not all characters are being converted, plug the missing ones in here
    // with their relevant codes...
    $missing_characters = array
    (
        'ě' => '&#283',
        'ř' => '&#345;'
    );
    
    // heavy function, but I wasn't trying to be efficient ;)
    foreach ($missing_characters as $char => $code)
        $message = str_replace($char, $code, $message);
    
    // this should give you the original string in a browser...
    echo $message;
    
    ?>
    

    编辑 #3:

    最后,使用 纯文本 邮件消息中可见的文本实现相同的结果要简单得多。只需对消息进行 base64 编码,设置适当的标头,然后使用 PHP's mail 函数完成其余工作。以下是我的工作方式:

    // original message...
    $message = "To je nějaký ukázkový text.\r\nTento text je na dalším řádku.";
    $message = base64_encode($message);
    
    // headers...
    $headers = "";
    $headers .= "From: your-email@domain.com\r\n";
    $headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
    $headers .= "Content-Transfer-Encoding: base64\r\n";
    $headers .= "MIME-Version: 1.0";
    
    mail("destination-email@domain.com", "Subject Here", $message, $headers);
    

    希望这会有所帮助! :)

    【讨论】:

    • 感谢克里斯的快速响应 - 然而,我们的电子邮件表单依赖于“func.php”文件,其中包含网站的各种设置。目前'sendemail'代码如上面的编辑所示......
    • 老实说,标题看起来不错,除了对它们进入的顺序很迂腐——比如把 MIME 标题放在第一位——我真的不能责怪他们 :) 也许我真的应该问你到底遇到了什么问题?错误地将行插入数据库?在另一端收到看起来很奇怪的邮件?我希望我们在这里走上正轨:)
    • 有一个联系表格,可以将数据发布到“sendmail.php”(sendmail.php 的代码在原始帖子中)。那应该给我发送一封带有编码字符的电子邮件……但事实并非如此。我能看到的所有内容都正确编码为 UTF-8,但一定有一些我错过了!
    • 感谢 JoeW 的评论,感谢您的耐心等待,我觉得我们正在取得进展!所以你根本没有收到邮件,还是你收到了邮件,但是内容不是base64编码的?另外,您有没有想过使用Zend's mailing libraries 来摆脱一些由更普通的操作引起的头痛,或者这不是您的选择?
    • 你知道 PHP 中有一个 mb_send_mail() 吗?我并不是说你绝对应该使用它,但它值得一看
    猜你喜欢
    • 2013-10-19
    • 2019-10-05
    • 2013-06-08
    • 1970-01-01
    • 2011-09-17
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多