PHPMailer字符编码问题


189

我尝试使用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(),但是没有运气。


以上字符集的大小写被bovender更改。
Gogowitsch '16

Answers:


473

如果您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的默认编码是8bitUTF-8数据可能会出现问题。要解决此问题,您可以执行以下操作:

$mail->Encoding = 'base64';

请注意,'quoted-printable'在这些情况下(甚至可能'binary')也可能起作用。有关更多详细信息,您可以阅读RFC1341-Content-Transfer-Encoding标头字段


35
好吧,我不知道是否有人在乎,因为这

5
@AndrewRevak您保存了这一天!:)
carla 2015年

3
@AndrewRevak好东西!那就是解决它的事情。
BernardA 2015年

mb_detect_encoding和mb_convert_encoding的用法会很好。
BluE

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

$mail -> CharSet = "UTF-8";必须在后面$mail = new PHPMailer();且没有空格!

试试这个

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

5
我更新了此帖子以更好地阅读,但是操作问题已经在两年前得到了解答!那个被接受的答题者已经包括了这个。
Dwza 2015年

5

很抱歉参加晚会。根据您的服务器配置,可能会要求您严格使用小写字母 utf-8 指定字符,否则它将被忽略。如果您最终在这里搜索解决方案,而以上答案均无济于事,请尝试以下方法:

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

应替换为:

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



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

希望能帮助到你。


1

当以上方法均无效时,仍会发送如下邮件ª הודפסה ×•× ×©×œ

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

0

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

---这行应该在

$mail = new PHPMailer(); line.

pff ..


是的,这是正确的。您必须将其放置在对象实例化之后。


这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论-您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,就可以在任何帖子中发表评论
piet.t

这不是对该问题的批评或澄清要求。正确的答案是:$ mail = new PHPMailer(); $ mail-> CharSet ='UTF-8';
Nikos Kapetanakos

我似乎是对Holian的回答的评论,因为它没有添加任何内容。
piet.t 2015年

如果使用charSet属性将无法正常工作。正确的是CharSet。情况有所不同。
Nikos Kapetanakos

那么,为什么您引用错误的答案而不是给出正确的答案呢?但是那个也已经存在了,那么您必须添加什么呢?
piet.t 2015年

0

最简单的方法将对您有帮助,将CharSet设置为UTF-8

$mail->CharSet = "UTF-8"

@NickZuber确切的行是由于进行了编辑。最初的问题不是那么精确……
茨约德先生16年

0

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

-5

$ mail-> charSet =“ UTF-8”; -这行应该在$ mail = new PHPMailer();下;线。

pff ..

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.