【问题标题】:PHP mail with accent带重音的 PHP 邮件
【发布时间】:2012-05-21 20:37:08
【问题描述】:

我在发送包含重音主题的电子邮件时遇到问题。我到处搜索,所有解决方案都不起作用。

我有一个字符串,主题,可能以 iso-8859-1 编码,通过命令行脚本发送

$res = shell_exec(sprintf("php mail.php %s %s %s %s",
   escapeshellarg($email->sender),
   escapeshellarg($receiver->email),
   escapeshellarg($email->subject),
   escapeshellarg($email->message)
));

以及邮件的标题:

$headers  = "MIME-Version: 1.0" . $endl;
$headers .= 'Content-type: text/html; charset="iso-8859-1"' . $endl;
$headers .= 'Content-Transfer-Encoding: 8bit';

结果,我收到一封带有 ???? 的电子邮件在主题中

注意:在 Windows、localhost 中测试

示例代码

testmail.php

<?php
$sender = "me@gmail.com";
$receiver = "you@mgmail.com";
$subject = "Accentued éàèçô letters";
$msg = "Accentued éàèçô letters";

shell_exec(sprintf('LANG="fr_FR.iso88591"; php mail.php %s %s %s %s > /dev/null 2>/dev/null &',
                        escapeshellarg($sender),
                        escapeshellarg($receiver),
                        escapeshellarg($subject),
                        escapeshellarg($msg)
                    ));
?>

mail.php

<?php

if ($argc!=5) exit;

$sender = $argv[1];
$receiver = $argv[2];
$subject = $argv[3];
$msg = $argv[4];

$endl = "\r\n";

//HTML header
$headers = "From: $sender" . $endl;
$headers .= "MIME-Version: 1.0" . $endl;
$headers .= "Content-type: text/html; charset=iso-8859-1" . $endl;
$headers .= 'Content-Transfer-Encoding: 8bit';


 $msg = "
         <html>
      <head>
       <title></title>
      </head>
      <body>
                $msg
      </body>
     </html>
     ";

$receiver = explode(',', $receiver);

foreach ($receiver as $rec)
{
    mail($rec, $subject, $msg, $headers);
    sleep(5);
}
?>

执行:php testmail.php 在 Linux 上测试。

解决方案 这个问题的正确解决方法是使用base64_encode

'=?UTF-8?B?' . base64_encode($subject) . '?=';

【问题讨论】:

  • stackoverflow.com/questions/1719149/… 见已接受答案的底部。
  • 可能已编码? 正确的标点和重音取决于所使用的编码! 可能不好!您需要确定正在使用的编码是什么!
  • @peterbond:试过了。首先,我应该使用的不是内容类型 text/plain。其次,尝试了 base64 编码但没有运气。问题在于命令行编码,在 Windows 中,它是 Windows-1252。在其他系统中,可能会有所不同。
  • @Zuul:它来自一个 HTML 表单,它是 iso-8859-1,所以它必须是 iso-8859-1
  • 您设置标头并发送使用 iso-8859-1 编码的电子邮件的 PHP 文件是吗?

标签: php email diacritics


【解决方案1】:

好的,在对您问题的更新代码进行多次测试后,这是基于您当前代码的有效解决方案:

MAIL.PHP (以 UTF8 编码保存的文件)

<?php

if ($argc!=5) exit;

$sender = $argv[1];
$receiver = $argv[2];
$subject = $argv[3];
$msg = $argv[4];

$endl = "\r\n";

// HTML header
$headers = "From: $sender" . $endl;
$headers.= 'MIME-Version: 1.0' . "\r\n";
$headers.= 'Content-type: text/html; charset=UTF-8' . "\r\n";
$headers.= 'Content-Transfer-Encoding: 8bit';

// Message
$msg = "
<html>
  <head>
    <title></title>
  </head>
  <body>
    $msg
  </body>
</html>";

$receiver = explode(',', $receiver);

foreach ($receiver as $rec) {
    mail($rec, $subject, $msg, $headers);
    sleep(5);
}

?>

TESTMAIL.PHP (以UTF8编码保存的文件)

<?php

$sender = "inbox@domain.com";
$receiver = "outbox@domain.com";
$subject = "Accentued éàèçô letters";
$msg = "Accentued éàèçô letters";

setlocale(LC_CTYPE, "en_US.UTF-8");
shell_exec(sprintf('"LANG=en_US.UTF-8"; php mail.php %s %s %s %s > /dev/null 2>/dev/null &',
                        escapeshellarg($sender),
                        escapeshellarg($receiver),
                        escapeshellarg($subject),
                        escapeshellarg($msg)
                    ));
?>

我已经对此进行了测试并正确接收了所有邮件。

【讨论】:

  • 我试过了,还是不行,你能试着写一个脚本来模拟这种情况吗?实际上,我使用了 LANG="fr_FR.iso88591" 。试过 utf8, \" , 没有 ; 等...但还是不行。我用法语键盘输入重音字母
  • 用你的完整 PHP 代码更新你的答案,以便我可以在这里测试它!
  • @Thanh Trung,刚刚更新了我的答案,对您的代码进行了有效且经过测试的更新!
  • 问题可能是因为我的邮件应用程序。在 gmail 上进行了测试,它可以工作......无需设置语言环境和语言。 Escapeshellarg 也会导致一个问题:它会删除重音字母。
  • 您需要更深入地了解您的应用程序!我的答案中的代码可以使用UTF-8 正确发送重音字母。考虑使用它来克服当前方法的编码问题!
【解决方案2】:

如果电子邮件的标头不是 7 位 US-ASCII,则需要进行 RFC2047 编码。您已经拥有的 MIME 声明覆盖了正文,而不是标题。

通常,除非您想了解电子邮件的工作原理,否则舒适且正确的解决方案是找到一个可以为您正确处理这些内容的库。我对 PHP 不熟悉,但这是 StackOverflow 上的一个常见问题,答案似乎经常涉及 PEAR。

猜你喜欢
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2013-10-12
相关资源
最近更新 更多