如何发送UTF-8编码的电子邮件?

时间:2011-08-10 10:52:46

标签: php email utf-8

我继承了一个脚本,该脚本以三种语言发送一些内容(所有内容都在重复上)但是当收到内容字符时,我认为是UTF-8问题。

我是否正确我需要做的就是将charset部分更改为utf-8,还是需要像7bit部分一样进行更改?

你可以看到我插入一个UTF-8参考(尚未测试)的位置

这里有一些http://bitprison.net/php_mail_utf-8_subject_and_message似乎引用了基本编码,但我不确定我是否需要它?

// Contruct message body.
$body = "";

// Add message for non-mime clients.
$body .= "This is a multi-part message in MIME format.\n";

// Add text body.
$body .= "\n--$boundary\nContent-Type: text/plain; charset=UTF-8; format=flowed\nContent-Transfer-Encoding: 7bit\n\n" . $textContent;

// Add HTML body.
$body .= "\n--$boundary\nContent-Type: text/html; charset=ISO-8859-1; format=flowed\nContent-Transfer-Encoding: 7bit\n\n" . $htmlContent;

mail( $row["email"], "Update Your ArtsDB Listing", $body, $headers );

我在这里看了另一篇文章的例子。

$body .= "\n--$boundary\nContent-Type: text/plain; charset=UTF-8; format=flowed\nContent-Transfer-Encoding: 8bit\n\n" . $textContent;

// Add HTML body.
$body .= "\n--$boundary\nContent-Type: text/html; charset=UTF-8; format=flowed\nContent-Transfer-Encoding: 8bit\n\n" . $htmlContent;

2 个答案:

答案 0 :(得分:6)

您正在使用Content-Type: text/plain; charset=UTF-8告诉邮件阅读器这样的邮件部分使用UTF-8,这很好,但是...... $textContent变量包含什么?这是重要的一点。根据{{​​1}},它是一个7位编码,所以它不能是原始的UTF-8。但是,您没有使用任何通常用于电子邮件的7位编码。否则,会有一个(例如)Content-Transfer-Encoding: 7bit标题。

总而言之,您需要:

  1. 拥有包含有效UTF-8的源字符串。
  2. 选择转移的编码,例如quoted_printable_encode()
  3. 添加标题以告知您选择的传输编码。
  4. 你也可以按原样发送原始UTF-8并设置Content-Transfer-Encoding: quoted-printable,但我不推荐它。您只需发送非常长的行就可能违反SMTP标准。此外,您不知道这将会是什么样的遗留程序。

    电子邮件比看上去更难,这就是为什么迟早你最终会使用第三方库:PHP MailerSwift MailerPEAR Mail ......

答案 1 :(得分:1)

  

Content-Transfer-Encoding:7位

这没有意义 - 7位数据和8 +位表示之间没有直接映射。您需要更改mime标头以说明您正在使用的编码。

对于SMTP,传输编码应为7位ascii字符集。要更改你的utf8数据,你需要编码这个 - 常见的编码是base64和引用打印(PHP为两者提供编码和解码fns)。

为什么不使用像phpmailerswiftmailer

这样的好文章