【问题标题】:setting encoding for attachment in phpmailer在 phpmailer 中设置附件的编码
【发布时间】:2018-04-18 12:21:00
【问题描述】:

我正在使用 phpmailer 发送月度报告。

它包括€ 符号。因此我需要将编码设置为 utf-8。 我在这里遇到了问题。

没有这样的编码:

$mail->addStringAttachment($csvstring, $fileName);

邮件已发送,但附件中没有显示 € 符号

当我尝试添加编码时:

$mail->addStringAttachment($csvstring, $fileName,  "utf-8", "text/csv");

邮件已发送,但正文和附件不存在。 我试着查了一下,但文档似乎很少。

我错过了显而易见的事情吗?

【问题讨论】:

  • 刚刚浏览了源代码,我必须说 PHPmailer 看起来真的很尴尬,你可以考虑换一个。但是,看看你的第三个参数应该是什么:https://github.com/PHPMailer/PHPMailer/blob/master/src/PHPMailer.php#L62,所以“utf-8”不是预期的。作为第四个参数,您可能想尝试"text/html; charset=utf-8"。这只是实验。如果没有其他帮助,我想我会对 PHPMailer 的工作方式进行逆向工程。
  • 有大量的文档,链接自项目主页,隐藏在“文档”标题下。 The docs on addStringAttachment 非常清楚在添加附件时应如何指定内容传输编码,它与任何其他库中几乎相同 - 因为它们都是相同的东西。
  • 不是每个人每天都使用 PHPMailer...所以我宁愿不要被我的鼻子咬。不过,我还是要感谢您提供的有用链接。

标签: php phpmailer


【解决方案1】:

你越来越糊涂了。 EncodingCharSet 是两个不同的东西。通常,字符集不会影响附件,因为它们通常是 base-64 编码的,因此只有 7 位。

您可以为整个邮件设置一个整体CharSet 和一个Encoding,但您可以覆盖每个附件的整体编码。

根据the docs 附加内容的正确方法:

$mail->addStringAttachment($csvstring, $fileName, 'base64', 'text/csv');

使用该模式,附件将保留您传递给它的确切二进制内容 - 如果您仍然遇到字符问题,这是源数据的问题,而不是导致它的发送问题。

【讨论】:

  • 我不同意我之前对问题和字符集的困惑。但是,我仍然觉得在内容类型中添加字符集是处理这个问题的正确方法。目前,您的解决方案中没有任何内容明确将编码设置为 UTF-8,而 text/csv; charset=utf-8 确实根据规范执行此操作。 developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
【解决方案2】:

见:this line in PHPMailer's source code

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

如果您希望 CSV 在打开它的程序中被读取为 UTF-8,请将 BOM(Byte Order Marker;即"\\xef\\xbb\\xbf")添加到字符串文件内容。

"\\xef\\xbb\\xbf".$csvstring

更新:

你也可以这样做。

$mail->addStringAttachment($csvstring, $fileName, "base64", "text/csv; charset=utf-8");

另请参阅MIME Content-Type 上的规范,因为它指出了设置编码的正确方法;即text/csv; charset=utf-8

【讨论】:

  • 这设置了我需要为附件设置编码的电子邮件正文的编码。我已经在其余代码中使用了这一行
  • @MathiasKiekens 明白了。我为你更新了我的解决方案。
  • 更新后:恐怕还是不行
  • @MathiasKiekens 将您拥有的编码从utf-8 更改为base64,然后离开text/csv; charset=utf-8。我刚刚测试过,效果很好。
  • 字符集参数不应该在那里,它与 base-64 编码的 MIME 部分无关。
猜你喜欢
  • 2019-02-08
  • 2015-11-12
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多