2010-05-04 152 views
2

haiphp邮件 - 特殊字符

我在php有一个西班牙网站。在这个邮件正文包含一个主题“Solicitud decotización”,但主题出现在像Solicitud decotización这样的热门邮箱。但在邮件部分显示正确。我如何避免这个问题。有人知道吗?

+0

你可以定义“热邮箱”和“邮件部分”? – Kobi 2010-05-04 04:46:04

回答

4

您需要使用您使用的任何文本编码对主题标题进行编码。参见http://metacpan.org/pod/Encode::MIME::Headerhttp://www.faqs.org/rfcs/rfc2047.html,其中谈到了这样做。

从本质上讲,你的主题行应该是这样的:

主题:????Solicitud DE = UTF-8,问cotizaci = C3 = B3N =

然后它知道MIME任何MUA应该呈现正确使用正确的字符集。

编辑:值得一提的是RFC2822指定ASCII作为邮件消息头的字符编码,这就是为什么引用是必要的。此外,它还指定行不应超过72个字符,因此可能需要折叠,并且在生成发往RFC(2)822邮件系统中处理的邮件时应考虑这一点。最后,使用B编码对于你提供的字符串没有多大意义,因为Q编码占用的空间更少(对于这一点,你只想引用一连串实际使用字符的单词在ASCII字符集之外)。

这是技术上可能只是蛮力为B编码整个字符串,但它总体上说不好的形式由于被浪费了,它更可能你会超过9,999个字符的硬性限制在RFC(2)822标准所规定的单一行中,即使你有很长的主题行。

+1

-1,不是真正的答案......不提供任何解决方案。 – 2010-05-04 05:04:43

+3

对不起,这个人想知道如何使它工作。链接到规范并提供解释为什么该规范很有用的答案(当然,假设OP是程序员)。 我没有足够的时间来上课,但是我认为给某个人提出解决方案的问题并没有多大用处,因为他们提出了一个问题,放弃了我们将互联网连接在一起的规范信件。如果你不关心RFC合规性,至少应该说清楚。 – 2010-05-04 05:11:02

+0

从我的经验@ SO,链接通常不被视为有用的答案。 – 2010-05-04 05:20:38

-1

尝试设置在电子邮件标题的charsetutf-8

charset=UTF-8 

或者看到:

UTF8 ready php mail function

UTF8_mail(
“fromname <[email protected]>”, 
“First Last <[email protected]>”, 
“Solicitud de cotización”, 
“Κείμενο Text”, 
“”, 
“Solicitud de cotización<[email protected]>” 
); 
+1

据我了解MIME,这将对身体生效。头文件仍然需要根据RFC 2047进行编码。 – 2010-05-04 04:48:35

+0

@Michael Trausch:我提供的链接讨论的不是“charset”。 – Sarfraz 2010-05-04 04:49:38

+0

哇。而且这个UTF8_mail函数也会遇到与Alix Axel提供的解决方案相同的问题,即它使用B编码浪费地编码字符串(在这种情况下Q更加高效 - 实际上大多数情况下也是如此),并且如果超过72个字符,则不会折叠标题。 – 2010-05-04 05:01:45

6

海! =)来编码对象,你必须这样做:

$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) . '?='; 
+0

该解决方案存在一个主要问题:它不能在72个字符处折叠,这就是按照RFC2822的完整规范创建邮件的程序必须遵循的行为。它也使用了很多空间,因为它会通过引用不需要编码的字符来不必要地增加字符串,因为它们是RFC2822邮件的ASCII字符集。 – 2010-05-04 04:58:45

+0

@Michael:有趣的是,你似乎是在低估每个人,而不是被低估,因为你是唯一一个没有提供具体解决方案的人(我也可以链接到RFC,你知道吗?)... – 2010-05-04 05:04:01

+0

我不现在有足够的时间来鞭策一个处理邮件的标准;然而,我已经阅读了标准,而且它们不是非常难以阅读。我假设OP能够编写代码来处理这种情况,因为指向了可用于与遵守RFC的邮件系统进行互操作的知识的指针。 除了那些明显违背RFC的要求和建议的建议之外,我没有其他任何理由而弃之不顾。没有个人意图。 – 2010-05-04 05:08:14

3

我有同样的问题,方式,现在它适用于我使用一个类(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('[email protected]', 'First Last'); 
$mail->SetFrom('[email protected]', 'First Last'); 
$mail->AddReplyTo('[email protected]', 'First Last'); 
// Receiver 
$address  = '[email protected]'; 
$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!'; 
} 
?> 
+1

这是正确的 - PHPMailer以正确的方式对标题行进行编码 - 它尝试4种不同的机制(包括B和Q编码,以及RFC的适当上下文)并选择最短的。 PHPMailer已正式转移到谷歌代码http://code.google.com/a/apache-extras.org/p/phpmailer/),但我也维护一个GitHub fork https://github.com/Synchro/PHPMailer。 – Synchro 2012-07-11 21:47:35