附件文件名字符集

时间:2015-04-14 13:54:54

标签: php email utf-8 character-encoding phpmailer

美好的一天,

我正在通过SMTP发送带有附件的电子邮件和PHPMailer。

邮件中的字符集设置为utf-8,但是当我发送带有像“März”这样的特殊字符的附件时,客户端会收到一个附带破坏字符集的附件,如:M rz。

我的代码示例:

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

$mail->Host = "host ip";
$mail->SMTPDebug = 0;
$mail->SMTPAuth = true;
$mail->Port = 25;
$mail->Username = "user";
$mail->Password = "pw";

$mail->setFrom('send@host.de', 'Host');
$mail->addAddress("client@mail.de");
$mail->Subject = 'Subject';
$mail->Body = "Email Content";
$mail->AltBody = 'Alternative Email Content';

$mail->AddAttachment("example/file_märz.pdf");

我做错了什么或是否有解决此问题的方法?

3 个答案:

答案 0 :(得分:0)

如果问题出在文件名上,并且你在应用程序的源代码中(在PHP文件中)写了文件名,那么问题可能是以下一个或两个:

  1. 使用错误的编码保存PHP文件。也就是说,您告诉PHPMailer发送UTF-8电子邮件,但您的PHP文件可以保存为ISO-8859-1编码。因此,当PHP读取"example/file_märz.pdf"时,它会读取ISO-8859-1中的字节序列,但它会告诉PHPMailer将其解释为UTF-8。
    解决方案:确保文本编辑器以UTF-8

  2. 保存文件
  3. 操作系统和/或客户端不支持附件的Unicode文件名 解决方案:没有真正的解决方案,您需要避免文件名中的非ASCII字符(反正这不是一个坏主意)。

  4. 如果您的编辑器已设置为UTF-8并且您确定您的客户端/操作系统支持文件名中的Unicode,则需要检查PHPMailer发送的原始电子邮件并查看它包含的内容。许多电子邮件客户端允许您查看原始电子邮件(整个原始文本)。

答案 1 :(得分:0)

在附件过程中查看PHPMailer我发现basename 被使用了。因此,要正确输出setlocale所需的特定编码,具体取决于与您的文件名兼容的字符集。

setlocale(LC_ALL, 'ja_JP.UTF-8');

上面的代码对我有用。因为我使用日语/文本作为我的文件名。

答案 2 :(得分:-2)

  

块引用

我遇到了同样的问题。

可以通过添加:

来解决

utf8_encode()函数到attachment []数组的$ name。

我的phpmailer版本位于1322行的class.phpmailer.php上。