PHP电子邮件编码?

时间:2010-02-15 11:34:41

标签: php encoding email

发送电子邮件时遇到外国字符问题。有人可以告诉我该怎么办?我怀疑问题可能是三件事之一。

  1. html页面编码不正确。 (这会影响表单中的POST数据吗?)
  2. 邮件功能没有任何编码。因此程序不知道如何阅读它。 (最有可能)
  3. 文件本身没有正确的编码,因此会出现问题。 (可能不太可能)
  4. 还有其他可能的原因吗?

    我试图逐一敲出这些,直到找到问题为止。我认为选项2是最可能的原因。如何为邮件功能添加适当的通用编码?

    这就是我现在所拥有的。

    $mail_sent = mail($client_email, $title, $message, "From: {$visitor_email}");
    

    我目前知道表单不会发送波兰语或瑞典语字符。

    如果有人可以指出任何其他可能的原因并告诉我需要使用哪种编码来发送电子邮件,我将非常感激。

    非常感谢。

7 个答案:

答案 0 :(得分:29)

据我所知,PHP不支持UTF-8作为其字符串的默认编码。您需要使用相关的编码/处理函数进行您希望的编码。

同时在您的电子邮件标题中添加Content-Type:text/html;charset=utf-8,以便电子邮件客户端正确显示字符(或替换为您选择的编码)。

答案 1 :(得分:22)

您没有指定内容的类型和编码。试试这个:

$headerFields = array(
    "From: {$visitor_email}",
    "MIME-Version: 1.0",
    "Content-Type: text/html;charset=utf-8"
);
$mail_sent = mail($client_email, $title, $message, implode("\r\n", $headerFields));

答案 2 :(得分:10)

使用此代码

function mail_send($arr)
{
    if (!isset($arr['to_email'], $arr['from_email'], $arr['subject'], $arr['message'])) {
        throw new HelperException('mail(); not all parameters provided.');
    }

    $to      = empty($arr['to_name']) ? $arr['to_email'] : '"' . mb_encode_mimeheader($arr['to_name']) . '" <' . $arr['to_email'] . '>';
    $from    = empty($arr['from_name']) ? $arr['from_email'] : '"' . mb_encode_mimeheader($arr['from_name']) . '" <' . $arr['from_email'] . '>';

    $headers = array
    (
        'MIME-Version: 1.0',
        'Content-Type: text/html; charset="UTF-8";',
        'Content-Transfer-Encoding: 7bit',
        'Date: ' . date('r', $_SERVER['REQUEST_TIME']),
        'Message-ID: <' . $_SERVER['REQUEST_TIME'] . md5($_SERVER['REQUEST_TIME']) . '@' . $_SERVER['SERVER_NAME'] . '>',
        'From: ' . $from,
        'Reply-To: ' . $from,
        'Return-Path: ' . $from,
        'X-Mailer: PHP v' . phpversion(),
        'X-Originating-IP: ' . $_SERVER['SERVER_ADDR'],
    );

    mail($to, '=?UTF-8?B?' . base64_encode($arr['subject']) . '?=', $arr['message'], implode("\n", $headers));
}

从:http://php.net/manual/en/function.mail.php

答案 3 :(得分:8)

除了之前的说法之外,并非强制要求以HTML格式发送邮件以便能够使用UTF-8,您也可以将其格式化为标题中的简单文本:

'Content-Type: text/plain;charset=utf-8'

答案 4 :(得分:4)

我使用以下代码:

  $text = "";
  $text .= "<html>\n";
  $text .= "<body style=\"font-family:Arial; \">\n";

  $text .= "<b>Add Your text here . . .</b>";
  $text .= date("d.m.Y") . " <br><br>\n\n";

  $text .= "</body>\n";
  $text .= "</html>\n";

$headers = 'From: ' . $myEmail . "\r\n";
$headers .= 'To: ' . $depEmail . "\r\n";    
$headers .= 'Return-Path: ' . $myEmail . "\r\n";
$headers .= 'MIME-Version: 1.0' ."\r\n";
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n";
$headers .= $text . "\r\n";

set_time_limit(30);
if (!mail('', 'Demande information', '', $headers)) {
  Alert(...)

答案 5 :(得分:2)

使用PHP邮件包装器,它将保存您的理智(根据此处的经验说话)。例如,PHPMailer允许您设置传出电子邮件编码并为您构建消息。

另外,使用UTF-8;它现在几乎得到普遍支持,涵盖了你需要的所有角色。

答案 6 :(得分:1)

我使用此代码解决旧Horde邮件中的希腊编码问题。

$headers = 'From: ' . $youremail . "\r\n";
$headers .= 'To: ' . $to . "\r\n";    
$headers .= 'Return-Path: ' . $youremail . "\r\n";
$headers .= 'MIME-Version: 1.0' ."\r\n";
$headers .= 'Content-Type: text/HTML; charset=utf-8' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n";
$headers .= $message . "\r\n";

mail('', 'Request from Site yoursite', '', $headers);