使用PHP的邮件功能发送带有阿拉伯语内容的电子邮件时遇到了挑战。假设我有一个简单的阿拉伯字符串:
بريد
我尝试了几种利用标头的方法,但是电子邮件内容最终仍然都带有以下内容:X*X1X(X1Y X/。但是,如果我使用阿拉伯字符,则电子邮件主题的编码正确(由于使用base64_encode,请参见下面的功能)
X*X1X(X1Y X/
这是我尝试过的电子邮件功能之一
function sendSimpleMail($to,$from,$subject,$message) { $headers = 'MIME-Version: 1.0' ."\r\n"; $headers .= 'To: '.$to ."\r\n"; $headers .= 'From: '.$from . "\r\n"; $headers .= 'Content-type: text/plain; charset=UTF-8; format=flowed' . "\r\n"; $headers .= 'Content-Transfer-Encoding: 8bit'."\r\n"; mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=',$message, $headers); }
关于实现此目标的替代方法有何建议?
不幸的是,8bit编码在电子邮件中不可靠。许多邮件传输代理会删除邮件正文中每个字节的最高位。بريد是"\xD8\xA8\xD8\xB1\xD9\x8A\xD8\xAF"在UTF-8字节; 从这些字节中删除最高位,您将得到ASCII "X(X1Y\nX/"。
8bit
"\xD8\xA8\xD8\xB1\xD9\x8A\xD8\xAF"
"X(X1Y\nX/"
将非ASCII字符放入邮件正文的方法是设置Content-Transfer-Encoding为base64或quoted- printable,然后分别使用base64_encode或编码正文quoted_printable_encode。
Content-Transfer-Encoding
base64
quoted- printable
base64_encode
quoted_printable_encode
(quoted- printable如果邮件主要是ASCII会更好,因为它可以保留编码形式的可读性,并且对ASCII效率更高。如果整个邮件都是阿拉伯语,则base64可能是更好的选择。)