【问题标题】:php mail - special characterphp邮件 - 特殊字符
【发布时间】:2010-05-04 04:40:11
【问题描述】:

我在 php 中有一个西班牙语网站。在此邮件正文中包含主题“Solicitud de cotización”,但该主题出现在热门邮箱中,例如 Solicitud de cotización‏。但它在邮件部分显示是正确的。我如何避免这个问题。有人知道吗?

【问题讨论】:

  • 你能定义“热邮箱”和“邮件区”吗?

标签: php html email


【解决方案1】:

喂! =) 要对主题进行编码,您必须这样做:

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

【讨论】:

  • 该解决方案存在一个主要问题:它不会折叠到 72 个字符,这是创建符合 RFC2822 完整规范的邮件的程序必须表现的行为。它还使用大量空间,因为它会通过引用根本不需要编码的字符来不必要地增加字符串,因为它们在 RFC2822 邮件的 ASCII 字符集中。
  • @Michael:有趣的是,你似乎对每个人都投了反对票,而没有被反对,因为你是唯一一个没有提供具体解决方案的人(我也可以链接到 RFC,你知道吗?)。 ..
  • 我现在没有时间开课以按照标准处理邮件;但是,我已经阅读了这些标准,而且阅读起来并不难。我假设 OP 能够编写代码来处理这种情况,因为该指针指向可用于与遵循 RFC 的邮件系统进行互操作的知识。除了明显违背 RFC 的要求和建议的建议之外,我没有其他原因投反对票。无意冒犯他人。
  • @Michael:我只是不认为在没有提供更好的解决方案时投反对票是不公平的。您基本上是在保证“那些人完全错了”,RFC 2045 和 2822 是正确的 - 阅读并实施它!我对 RFC 没有任何反对意见(相反),但我和 @Sarfraz 提供的解决方案更快地实施和执行,清楚地解决了 OP 问题,并且至少 95% 以上的时间(给予或接受)完美无缺.
  • 相对于其他答案,我不会投赞成票或反对票。如果答案不正确,我会投反对票。请记住,投反对票也会损害 me 的声誉。我没有动力仅仅因为它的地狱而投反对票,其他任何人也没有。我确实提供了所需内容的摘要,但这里仍然没有完整的代码答案。我不希望人们用勺子喂我代码,尽管我可能是少数。我不会给出我自己不会在生产中运行的代码,我会否决建议和代码,这些建议和代码是不好的例子,甚至懒得提及极端情况。这就是我的工作方式。
【解决方案2】:

您需要以您使用的任何文本编码对主题标头进行编码。请参阅 http://metacpan.org/pod/Encode::MIME::Headerhttp://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 个字符,如果您的主题行很长。

【讨论】:

  • 对不起,这家伙想知道如何让它工作。链接到规范并提供解释该规范为何有用的答案(当然,假设 OP 是程序员)。我没有时间舀一堂课,但我认为给提出问题的人提供一个解决方案的用处不大,该问题放弃了我们拥有的将 Internet 连接在一起的规范的字母。如果您不关心 RFC 合规性,至少要明确这一点。
  • 根据我@SO 的经验,链接通常不被视为有用的答案。
  • 如果我不在 NDA 下,我会发布一个符合 RFC2822 和 MIME RFC 的邮件生成工作类——尽管使用不同的语言。由于我没有时间提供正确的代码,但我有时间提供一个指针(包括 Perl 中的代码,可以修改)以便 OP 可以编写正确的代码,我选择提供OP 可以用来编写正确代码的信息。我为自己的工作感到自豪,我认为我们所有人都会这样做;如果是这种情况,最好提供正确的信息,而不是提供在大多数情况下不符合要求的信息。
【解决方案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('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!';
}
?>

【讨论】:

【解决方案4】:

尝试在电子邮件标题中将charset 设置为utf-8

charset=UTF-8

或见:

UTF8 ready php mail function

UTF8_mail(
“fromname <my@email.com>”,
“First Last <your@email.com>”,
“Solicitud de cotización”,
“Κείμενο Text”,
“”,
“Solicitud de cotización<hidden_friend@email.com>”
);

【讨论】:

  • 据我了解 MIME,这将对正文生效。标头仍需要按照 RFC 2047 进行编码。
  • @Michael Trausch:除了charset之外,我提供的链接也讨论了这个问题。
  • 哇。这个 UTF8_mail 函数也遇到了与 Alix Axel 提供的解决方案相同的问题,也就是说,它使用 B 编码来浪费地对字符串进行编码(在这种情况下 Q 效率更高——实际上大多数其他情况也是如此)并且确实如果标题超过 72 个字符,则不要折叠标题。
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2014-08-14
  • 2021-01-27
  • 2010-11-02
  • 2017-06-15
相关资源
最近更新 更多