【发布时间】:2010-05-04 04:40:11
【问题描述】:
喂
我在 php 中有一个西班牙语网站。在此邮件正文中包含主题“Solicitud de cotización”,但该主题出现在热门邮箱中,例如 Solicitud de cotización。但它在邮件部分显示是正确的。我如何避免这个问题。有人知道吗?
【问题讨论】:
-
你能定义“热邮箱”和“邮件区”吗?
喂
我在 php 中有一个西班牙语网站。在此邮件正文中包含主题“Solicitud de cotización”,但该主题出现在热门邮箱中,例如 Solicitud de cotización。但它在邮件部分显示是正确的。我如何避免这个问题。有人知道吗?
【问题讨论】:
喂! =) 要对主题进行编码,您必须这样做:
$subject = 'Solicitud de cotización';
// =?UTF-8?B?U29saWNpdHVkIGRlIGNvdGl6YWNpw7Nu?=
$subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
如果您使用的是 PHP 5.3+,则可以改用 quoted_printable_encode():
$subject = 'Solicitud de cotización';
// =?UTF-8?Q?Solicitud de cotizaci=C3=B3n?=
$subject = '=?UTF-8?Q?' . quoted_printable_encode($subject) . '?=';
【讨论】:
您需要以您使用的任何文本编码对主题标头进行编码。请参阅 http://metacpan.org/pod/Encode::MIME::Header 和 http://www.faqs.org/rfcs/rfc2047.html 讨论这样做。
基本上,您的主题行应该如下所示:
主题:Solicitud de =?UTF-8?Q?cotizaci=C3=B3n?=
那么任何了解 MIME 的 MUA 都应该使用正确的字符集正确呈现主题。
编辑:值得一提的是,RFC2822 将 ASCII 指定为邮件消息头的字符编码,这就是为什么需要引用。它还指定行不应超过 72 个字符,因此折叠可能是必要的,您应该在生成要在 RFC(2)822 邮件系统中处理的邮件时考虑到这一点。最后,使用 B 编码对于您提供的字符串没有多大意义,因为 Q 编码占用的空间更少(就此而言,您只想引用一系列实际使用字符的单词ASCII 字符集之外)。
技术上可以对整个字符串使用 B 编码进行暴力破解,但由于浪费,一般来说这是一种不好的形式,而且你更有可能超过硬RFC(2)822 标准规定的单行中限制为 9,999 个字符,如果您的主题行很长。
【讨论】:
我有同样的问题,现在它对我有用的方式是使用一个类 (phpMailer):
<?php
require_once('class.phpmailer.php');
$mail = new PHPMailer(); // defaults to using php "mail()"
// Here's the code that allows special chars in subject and body
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'quoted-printable';
// From and reply data
$mail->AddReplyTo('name@yourdomain.com', 'First Last');
$mail->SetFrom('name@yourdomain.com', 'First Last');
$mail->AddReplyTo('name@yourdomain.com', 'First Last');
// Receiver
$address = 'whoto@otherdomain.com';
$mail->AddAddress($address, 'John Doe');
// Message
$mail->Subject = 'PHPMailer Test Subject via mail(), basic';
$mail->Body = 'Message sent from website';
// Attachment(s)
$mail->AddAttachment('images/phpmailer.gif');
$mail->AddAttachment('images/phpmailer_mini.gif');
// Try to send mail
if( ! $mail->Send())
{
echo 'Mailer Error: ' . $mail->ErrorInfo;
}
else
{
echo 'Message sent!';
}
?>
【讨论】:
尝试在电子邮件标题中将charset 设置为utf-8:
charset=UTF-8
或见:
UTF8_mail(
“fromname <my@email.com>”,
“First Last <your@email.com>”,
“Solicitud de cotización”,
“Κείμενο Text”,
“”,
“Solicitud de cotización<hidden_friend@email.com>”
);
【讨论】:
charset之外,我提供的链接也讨论了这个问题。