PHP电子邮件编码?

Posted

技术标签:

【中文标题】PHP电子邮件编码?【英文标题】:PHP E-Mail Encoding? 【发布时间】:2011-01-16 23:01:01 【问题描述】:

我在发送电子邮件时遇到了一些外来字符问题。有人可以建议我该怎么做吗?我怀疑问题可能是三件事之一。

    html 页面编码不正确。 (这会影响表单中的 POST 数据吗?) 邮件函数没有任何编码。因此程序不知道如何阅读它。 (很可能) 文件本身没有正确的编码,因此会出现问题。 (可能不太可能)

还有其他可能的原因吗?

我正在尝试一个一个地解决这些问题,直到找到问题为止。我认为选项 2 是最可能的原因。如何向邮件功能添加正确的通用编码?

这是我目前拥有的。

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

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

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

非常感谢。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

对于基于文本的电子邮件(不在 html 中)使用:'Content-Type:text/plain;charset=utf-8'【参考方案2】:

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

$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));

【讨论】:

【参考方案3】:

使用此代码

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

【讨论】:

你能告诉我为什么你使用 7bit 传输编码,因为我经常看到 8bit? 根据我的发现,7 位是电子邮件的默认设置,因为一些非常老的邮件客户端和服务器无法处理 8 位。发送 7bitquoted-printable 只是为了安全起见。也就是说,您可能可以毫无问题地发送 8bit iso-8859-1 或 8bit utf-8。 +1 到主题的 base64_encode()。以前从没想过。谢谢【参考方案4】:

除了前面所说的,发送邮件不是必须以 HTML 格式发送才能使用 UTF-8,您也可以将其格式化为标题中的简单文本:

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

【讨论】:

【参考方案5】:

我使用以下代码:

  $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(...)

【讨论】:

在“Content-Transfer-Encoding: 8bit”后面使用 \n\r\n 而不是 \r\n 是否有特定原因?【参考方案6】:

使用 PHP 邮件包装器,它会帮助您保持理智(从这里的经验谈起)。例如,PHPMailer 允许您设置外发电子邮件编码并为您构建邮件。

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

【讨论】:

【参考方案7】:

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

$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);

【讨论】:

以上是关于PHP电子邮件编码?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 电子邮件编码器,以减少垃圾邮件

PHP 电子邮件编码器

使用 PHP 的邮件发送 mime 编码电子邮件的正确格式

如何使用 PHP 从电子邮件数据中提取 html 编码

使用 7BIT 内容传输编码解析电子邮件正文 - PHP

PHP 如何使用电子邮件确认对注册表单进行编码