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

3

我接手了一份脚本,它可以用三种语言(都是相同的内容-重复)发送一些内容,但是当接收到内容时,字符会断开,我认为这是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
你在那里使用了3种编码 - 尝试只使用一种。 - OZ_
2个回答

7
您正在使用 Content-Type: text/plain; charset=UTF-8 来告诉邮件阅读器该消息部分使用UTF-8,这是好的,但是...$textContent变量包含什么?这是重要的一点。根据 Content-Transfer-Encoding: 7bit,它是7位编码,因此不能是原始的UTF-8。但是,您没有使用电子邮件中通常使用的任何7位编码。否则,将会有一个(例如)Content-Transfer-Encoding: quoted-printable头。
总之,您需要:
1. 有一个包含有效UTF-8的源字符串。 2. 选择传输的编码,例如quoted_printable_encode()。 3. 添加一个标题来告知您选择了哪种传输编码。
您也可以发送原始的UTF-8,并设置Content-Transfer-Encoding: 8bit,但我不建议这样做。您冒着通过发送非常长的行而破坏SMTP标准的风险。此外,您不知道它将经历哪些遗留程序。
电子邮件比看起来更难,这就是为什么迟早会使用第三方库的原因:PHP MailerSwift MailerPEAR Mail...

这个有点难,因为我继承了一个定制的CMS,它不是很清晰,似乎链接到各种文件和库-只是试图解密所有未知的东西。如果我从头开始编写,我会更开心。 - mro
我将7位编码更改为8位编码(在顶部的编辑中) - mro
我明白这可能需要全面改进,但目前通常都希望尽快修复问题! - mro
或者像我一样,学习电子邮件传递,自己制作玩具,然后为ESP公司获得一个非常棒的工作。 - transilvlad
@Alvaro “<<您也可以发送原始的UTF-8,并设置Content-Transfer-Encoding: 8bit,但我不建议这样做。您可能会通过发送非常长的行来破坏SMTP标准。>>”您需要使用8位编码来换行。只有“二进制”不需要换行,但这种方式的支持并不好。我认为使用8位编码时行的长度相同(假设我们正在讨论ASCII和UTF-8)。 - themihai

1
这没有意义 - 7位数据和8+位表示之间没有直接映射。您需要更改MIME标头以说明您正在使用的编码方式。
对于SMTP,传输编码应为7位ASCII字符集。要更改您的UTF8数据,您需要对其进行编码 - 常见的编码方式是base64和quoted printable(PHP提供了两者的编码和解码函数)。
为什么不使用像phpmailerswiftmailer这样的好库呢?

嗨,这是一个我正在逐步学习的脚本(问题是语言字符未显示),我尽量不去破坏它,所以希望我可以只改变字符集。 - mro
这是我在这里使用的示例: <?php $to = 'bob@example.com'; $subject = 'Wakeup bob!'; $message = '<b>yo</b>, whassup?'; $headers = "From: server@example.com\r\n" . 'X-Mailer: PHP/' . phpversion() . "\r\n" . "MIME-Version: 1.0\r\n" . "Content-Type: text/html; charset=utf-8\r\n" . "Content-Transfer-Encoding: 8bit\r\n\r\n"; // 发送邮件 mail($to, $subject, $message, $headers); ?> - mro

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