【问题标题】:PHPMailer character encoding issuesPHPMailer 字符编码问题
【发布时间】:2011-01-30 07:02:10
【问题描述】:

我尝试使用PHPMailer发送注册、激活。等邮件给用户:

require("class.phpmailer.php");
$mail -> charSet = "UTF-8";
$mail = new PHPMailer();
$mail->IsSMTP();  
$mail->Host     = "smtp.mydomain.org";  
$mail->From     = "name@mydomain.org";
$mail->SMTPAuth = true; 
$mail->Username ="username"; 
$mail->Password="passw"; 
//$mail->FromName = $header;
$mail->FromName = mb_convert_encoding($header, "UTF-8", "auto");
$mail->AddAddress($emladd);
$mail->AddAddress("mytest@gmail.com");
$mail->AddBCC('mytest2@mydomain.org', 'firstadd');
$mail->Subject  = $sub;
$mail->Body = $message;
$mail->WordWrap = 50;  
if(!$mail->Send()) {  
   echo 'Message was not sent.';  
   echo 'Mailer error: ' . $mail->ErrorInfo;  
}

$message 包含拉丁字符。不幸的是,所有网络邮件(gmail、webmail.mydomain.org、emailaddress.domain.xx)都使用不同的编码。

如何强制使用 UTF-8 编码在所有邮箱中显示完全相同的邮件?

我尝试转换邮件标题宽度mb_convert_encoding(),但没有成功。

【问题讨论】:

  • 上面 CharSet 的大小写被 bovender 改变了。

标签: php email phpmailer


【解决方案1】:
$mail -> CharSet = "UTF-8";
$mail = new PHPMailer();

$mail -> CharSet = "UTF-8"; 行必须在$mail = new PHPMailer(); 之后

试试这个

$mail = new PHPMailer();
$mail->CharSet = "UTF-8";

【讨论】:

  • 我更新了这篇文章以便更好地阅读,但操作的问题已经在 2 年前得到回答!并且那个被接受的答案已经包括了这个。
【解决方案2】:

当以上都不起作用时,邮件仍然看起来像ª הודפסה ×•× ×©×œ

$mail->addCustomHeader('Content-Type', 'text/plain;charset=utf-8');
$mail->Subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';;

【讨论】:

  • 这个对我有用,在体内使用 iso-8859-1。
  • 使用 Apache 为我工作,使用 MS Outlook 客户端在 Windows 下编码 ISO-8859-1
【解决方案3】:

我在 $mail->Subject /w PHPMailer 中得到 ó

所以对我来说完整的解决方案是:

// Your Subject with tildes. Example.
$someSubjectWithTildes = 'Subscripción España';

$mailer->CharSet = 'UTF-8';
$mailer->Encoding = 'quoted-printable';
$mailer->Subject = html_entity_decode($someSubjectWithTildes);

希望对你有帮助。

【讨论】:

    【解决方案4】:

    如果您 100% 确定 $message 包含 ISO-8859-1,您可以使用 utf8_encode,正如 David 所说。否则在 $message 上使用 mb_detect_encodingmb_convert_encoding

    还要注意

    $mail -> charSet = "UTF-8"; 
    

    应替换为:

    $mail->CharSet = 'UTF-8';
    

    并且放置在之后类的实例化(在new之后)。属性区分大小写!请参阅PHPMailer doc 列表和准确拼写。

    PHPMailer 的默认编码也是8bit,这可能对 UTF-8 数据造成问题。要解决此问题,您可以这样做:

    $mail->Encoding = 'base64';
    

    请注意,'quoted-printable' 在这些情况下也可能会起作用(甚至可能是'binary')。更多详情可以阅读RFC1341 - Content-Transfer-Encoding Header Field

    【讨论】:

    • 好吧,我不知道是否有人在乎,因为这太老了,但是我必须添加 $mail->Encoding = "base64" 才能让它为我工作
    • 使用 mb_detect_encoding 和 mb_convert_encoding 会很好。
    • 很奇怪,只是这句话是问题的根本原因,没有发送邮件(但根本没有错误)$message += '\n\nThis message was sent from IP Address: 。一旦我将 += 替换为 .= ,电子邮件就会开始发送。
    【解决方案5】:

    为了避免使用 PHPMailer 类发送电子邮件时出现字符编码问题,我们可以使用“CharSet”参数将其配置为使用 UTF-8 字符编码发送,如下面的 PHP 代码所示:

    $mail = new PHPMailer();
    $mail->From = 'midireccion@email.com';
    $mail->FromName = 'Mi nombre';
    $mail->AddAddress('emaildestino@email.com');
    $mail->Subject = 'Prueba';
    $mail->Body = '';
    $mail->IsHTML(true);
    
    
    // Active condition utf-8
    $mail->CharSet = 'UTF-8';
    
    
    // Send mail
    $mail->Send();
    

    【讨论】:

      【解决方案6】:

      我自己就是这样工作的

        $mail->FromName = utf8_decode($_POST['name']);
      

      http://php.net/manual/en/function.utf8-decode.php

      【讨论】:

        【解决方案7】:
        $mail = new PHPMailer();
        $mail->CharSet = "UTF-8";
        $mail->Encoding = "16bit";
        

        【讨论】:

        • 没有16bit这样的编码
        【解决方案8】:

        很抱歉迟到了。根据您的服务器配置,您可能需要严格使用 小写字母 utf-8 指定字符,否则将被忽略。如果您最终在这里寻找解决方案并且以上答案都无济于事,请尝试此操作:

        $mail->CharSet = "UTF-8";
        

        应替换为:

        $mail->CharSet = "utf-8";
        

        【讨论】:

        • 如果重要的话,该标准始终使用大写。
        【解决方案9】:

        最简单的方法就是将 CharSet 设置为 UTF-8

        $mail->CharSet = "UTF-8"
        

        【讨论】:

        • @NickZuber 由于编辑,确切的行在那里。原来的问题并不那么准确......
        猜你喜欢
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 2013-04-21
        • 2010-10-23
        • 2011-12-03
        • 1970-01-01
        相关资源
        最近更新 更多