PHPMailer字符编码问题

262

我尝试使用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 修改了。 - Gogowitsch
9个回答

621
如果您100%确定$message包含ISO-8859-1,则可以像David所说的那样使用utf8_encode。否则,请在$message上使用mb_detect_encodingmb_convert_encoding
另外请注意:
$mail -> charSet = "UTF-8"; 

应该被替换为:

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

在类的实例化之后(即 new 后面),加上属性。属性是区分大小写的!请参见 PHPMailer 文档 获取列表和确切拼写。
此外,PHPMailer 的默认编码方式是 8bit,这可能会对 UTF-8 数据造成问题。要解决这个问题,你可以执行以下操作:
$mail->Encoding = 'base64';

请注意,在这些情况下'quoted-printable'可能也能起作用(甚至可能是'binary')。有关更多细节,请阅读RFC1341-内容传输编码头字段


48
我不知道有没有人在意,因为这很古老,但我必须添加 $mail->Encoding = "base64"才能让它对我起作用。 - Andrew Revak
使用 mb_detect_encoding 和 mb_convert_encoding 会很不错。 - Tigerware
非常奇怪的是,正是这个语句成为了问题的根源,邮件没有被发送(但是完全没有错误)$message += '\n\nThis message was sent from IP Address: 。一旦我用 .= 替换了 +=,邮件就开始被发送了。 - TheTechGuy
1
“$mail->CharSet = 'UTF-8';” 技巧在6.5版本中仍然有效。可惜的是,1. 在PHPMailer类中,ISO-8859-1仍然是默认字符集;2. 没有公共方法设置CharSet公共类变量,因此无法通过IDE提示该选项存在... - Fabien Haddadi
1
你还可以利用PHPMailer内置的UTF-8常量:$mailer->CharSet = PHPMailer::CHARSET_UTF8;。如果你查看PHPMailer.php的源代码,你会看到可用的常量,默认情况下(截至撰写本文时,版本为6.8.1),使用的是CHARSET_ISO88591 - undefined

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

$mail -> CharSet = "UTF-8"; 这一行代码放在 $mail = new PHPMailer(); 之后。

尝试一下这样做。

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

6
我为了更好的阅读体验对这篇文章进行了更新,但是原帖的问题在两年前已经得到了回答!而且那个被接受的答案已经包含了这个答案。 - Dwza

7

警告 此函数已在PHP 8.2.0中被弃用。不建议依赖此函数。 - JSG

6

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

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

这个对我来说有效,使用iso-8859-1在正文中。 - Hola Soy Edu Feliz Navidad
在我的电脑上使用Apache服务器,编码为ISO-8859-1,在Windows操作系统下,与MS Outlook客户端配合良好。 - Max

6

很抱歉晚了。根据您的服务器配置,您可能需要严格指定utf-8字符,使用小写字母,否则将被忽略。如果您在寻找解决方案时没有找到任何答案,请尝试以下方法:

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

应替换为:

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

标准规定必须使用大写字母,如果重要的话。 - David Spector
这对我来说非常关键。谢谢! - Vincent
这对我来说非常关键。谢谢! - undefined

3

我在使用PHPMailer时,在$mail->Subject中得到了“ó”字符。

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

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

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

希望这有所帮助。

1
为了避免使用 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();

0
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";

2
没有 16bit 这种编码方式。 - Synchro

0

最简单的方法,也会帮助您的是将 CharSet 设置为 UTF-8

$mail->CharSet = "UTF-8"

@NickZuber 准确的那一行是由于编辑而出现的。在原始问题中它并不是那么准确。 - Mr Tsjolder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接