【问题标题】:PHP UTF8 mail gets garbled on iPhone mail appPHP UTF8 邮件在 iPhone 邮件应用程序上出现乱码
【发布时间】:2011-07-08 19:02:43
【问题描述】:

我是用php内部的mail函数来发送邮件的,我把它封装在一个函数里面UTF8的过程中,我在网上找到的。

它有效,我将代码中的电子邮件发送到我的 GMAIL 和我的 EXCHANGE 服务器,在 GMAIL 和我 PC 上的 Outlook 客户端中,我收到了正确的消息。

我的 iPhone 还连接到 Exchange 和 GMAIL 帐户,所以我的 iPhone 上都收到了这两条消息。 iPhone 正确接收 GMAIL 消息,但 EXCHANGE 帐户显示的消息带有乱码,其中非拉丁字符。

下面的示例在主题和正文中发送希伯来语字符。在我的 iPhone 上,可以正确接收希伯来语的主题,但邮件正文中的希伯来语部分是乱码。

任何人都可以对此发表评论吗?也许在您自己的设置上尝试一下?

谢谢,

<?php


function mail_utf8($to, $subject = '(No subject)', $message = '', $header = '') { 
$header_ = 'MIME-Version: 1.0' . "\r\n" . 'Content-type: text/plain; charset=UTF-8' .   "\r\n"; 
mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_ . $header);  
}

$mymessage = "Hello <BR>"; 
$mymessage.= "Received: now<BR/><BR/>";
$mymessage.= "details: שלום שלום<BR/><BR/>";

mail_utf8 ("XXX@gmail.com,XXX@exchangeServer.com", "שלום", $mymessage, "my_mail", "mailer@phpmail.com");


?>

【问题讨论】:

  • 顺便说一句,我认为您在发送text/plain 电子邮件时不需要&lt;br /&gt;s,PHP_EOL 可能会更好。
  • 实际上我正在尝试发送 HTML,我只是在此示例中复制了错误的标题

标签: php iphone email utf-8


【解决方案1】:

因为邮件是通过您的 iPhone 在您的 gmail 帐户上正确接收的,这可能是交换服务器或 iPhone Exchange 同步中的错误/错误配置。

最好的办法是不仅对主题而且对整个消息进行 base64 编码:base64 使用的字符几乎总是正确传输,因为 US-ASCII、ISO-8859-x 和 UTF 中的字符代码相同-8。所有现代邮件客户端都可以解码 base64,但它确实会增加大约 33% 的邮件大小。

 function mail_utf8($to, $subject = '(No subject)', $message = '', $header = '') { 
      $header_ = 'MIME-Version: 1.0' . "\r\n" .
                 'Content-type: text/plain; charset=UTF-8' .   "\r\n" .
                 'Content-Transfer-Encoding: base64' . "\r\n"; 
      mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', base64_encode($message), $header_ . $header);  
 }

【讨论】:

  • 试过你的代码,GMAIL 做对了,Outlook 和 iPhone 现在所有的正文都乱码了,甚至是拉丁文......
  • 我正在使用 Thunderbird 发送消息,并且在 iPhone 从 GMail 帐户中读取消息时遇到了相同的症状。在我的情况下,Content-Transfer-Encoding: 8bit 已定义,因此看起来传输编码不是问题的根源。见google.com/support/forum/p/gmail/thread?tid=0cb7a810647d9dd8forum.nuevasync.com/forum/posts/list/15/118.page
  • 警告任何使用此功能的人:base64_encoding 使您的电子邮件更有可能最终进入垃圾邮件/批量过滤器,因为 base64 编码的正文是垃圾邮件过滤器的危险信号。
【解决方案2】:

我在使用 iPhone 和 Exchange 时遇到了同样的问题,我通过使用解决了我的问题 Content-Transfer-Encoding: quoted-printable\r\nquoted_printable_encode() 以这种方式尝试您的代码:

function mail_utf8($to, $subject = '(No subject)', $message = '', $from ='') { 
  $headers = "MIME-Version: 1.0\r\n";
  $headers .= "Content-type: text/html; charset=UTF-8\r\n";
  $headers .= "Content-Transfer-Encoding: quoted-printable\r\n";
  $headers .= "From: $from\r\n";
  mail($to, $subject, $message, $headers);  
}
$mymessage = "Hello <BR>"; 
$mymessage.= "Received: now<BR/><BR/>";
$mymessage.= "details: שלום שלום<BR/><BR/>";
$mymessage = quoted_printable_encode($mymessage);

mail_utf8 ("XXX@gmail.com,XXX@exchangeServer.com", "שלום", $mymessage, "mailer@phpmail.com");

【讨论】:

    【解决方案3】:

    简单的答案 - 使用Swift Mailer。电子邮件中的标题魔法是不可预测的。我也尝试过使用它很长一段时间,但迟早有人报告说在 他的 设置(电子邮件提供商或应用程序)上,文本是乱码或其他东西(我发送了很多电子邮件在捷克语中,因此优先使用 UTF)。

    使用 Swift Mailer 并为自己省点心。设置和学习速度很快,效果很好。

    【讨论】:

    • 您提供的邮件包装器或 PHPMailer 可以工作,但不能解决这个特定问题。特别是如果代码完全可以重构以使用包装器,那么它可能比仅仅修复错误更工作。
    • 我尝试了另一个包装器 PHPMAILER,它发送了邮件,我得到了完全相同的结果......仍然是乱码......
    • @Moshe Marciano,在那种情况下,我无法为您提供更多帮助,我在 iProducts 方面没有太多经验,而且对其内部结构的经验也完全为零......
    • 在对 Swift Mailer 进行基准测试后,我已经停止使用它,它需要太多资源来处理简单的事情。
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    相关资源
    最近更新 更多