PHP imap_search:Microsoft Exchange 邮件服务器上的 UTF-8/非 ASCII 字符

2024-05-01

我想从以下位置获取电子邮件outlook.office365.com使用 IMAP 和 PHP。

由于大多数电子邮件包含非 ASCII 字符,例如äöü, I use UTF-8 in my imap_search()功能:

imap_search($mbox_connection, 'ALL', SE_UID, "UTF-8")

With UTF-8和搜索条件ALL我按预期收到了所有电子邮件。现在,我想将其限制为仅显示未见过(未读)的电子邮件:

imap_search($mbox_connection, 'UNSEEN', SE_UID, "UTF-8")

但不幸的是,这导致了问题,即再也找不到电子邮件了 - 尽管有看不见的电子邮件 - 并且它还会引发此 PHP 通知:

PHP Notice:  Unknown: [BADCHARSET (US-ASCII)] The specified charset is not supported. (errflg=2) in Unknown on line 0

根据此通知,我已将字符集从UTF-8 to US-ASCII:

imap_search($mbox_connection, 'UNSEEN', SE_UID, "US-ASCII")

现在,它会返回所有预期的未见过(未读)电子邮件。

现在的问题是,我无法搜索带有 UTF-8 字符的电子邮件。例如,我有一封包含以下信息的电子邮件:

  • 来自: 纽伦堡阿普费尔
  • 主题:阿普菲尔 vs. 阿普菲尔
  • Body:
Einzahl gegen Mehrzahl.

Ein Apfel, mehrere Äpfel.

当我尝试搜索主题为“apfel”的所有电子邮件时,它按预期工作 - 我可以找到该电子邮件:

imap_search($mbox_connection, 'FROM "apfel"', SE_UID, "US-ASCII")
Trying to connect to '{outlook.office365.com:993/imap/ssl}INBOX'...
Found 1 email(s)...
+------ P A R S I N G ------+
From: =?iso-8859-1?Q?=C4pfel=20N=FCrnberg?= <=?iso-8859-1?Q?=C4pfel=20N=FCrnberg?= <[email protected] /cdn-cgi/l/email-protection>>
Subject: =?iso-8859-1?Q?Apfel_vs._=C4pfel?=

但是当我改为搜索带有 UTF-8 字符的单词时(在本例中äpfel),它找不到电子邮件:

imap_search($mbox_connection, 'FROM "äpfel"', SE_UID, "US-ASCII")

由于这个事实,我已经改回了字符集US-ASCII to UTF-8,但这只会在错误消息处再次结束[BADCHARSET (US-ASCII)].

我的代码很简单:

$mailbox = "{outlook.office365.com:993/imap/ssl}INBOX";
$mailbox_username = "[email protected] /cdn-cgi/l/email-protection";
$mailbox_password = "*******";

echo "Trying to connect to '$mailbox'...\n";

$mbox_connection = imap_open($mailbox, $mailbox_username, $mailbox_password);

$mailsIds = imap_search($mbox_connection, 'SUBJECT "äpfel"', SE_UID, "UTF-8");

if(!$mailsIds) {
    echo "No emails found!\n";
    imap_close($mbox_connection);
    die();
}

echo "Found " . count($mailsIds) . " email(s)...\n";

foreach($mailsIds as $mailId) {
    echo "+------ P A R S I N G ------+\n";

    $headersRaw = imap_fetchheader($mbox_connection, $mailId, FT_UID);
    $header = imap_rfc822_parse_headers($headersRaw);

    echo "From: " . $header->from[0]->personal . " <" . $header->fromaddress . ">\n";
    echo "Subject: " . $header->subject . "\n";
}

我已经尝试过这个解决方案,但这也返回没有匹配的电子邮件:

$str = "äpfel";
$str = preg_replace('/\=\?ISO\-8859\-1\?Q\?/i', '', mb_encode_mimeheader($str, "ISO-8859-1", "Q"));
$mailsIds = imap_search($mbox_connection, 'SUBJECT "'.$str.'"', SE_UID, 'US-ASCII');

任何想法,我如何在电子邮件字段中搜索非 ASCII 字符From, Subject and Body当 IMAP 服务器不支持时UTF-8我也不能在服务器端配置上更改它?

这似乎是所有 Microsoft Exchange 服务器的问题。据我通过谷歌发现,只有那些服务器有这个问题。


你可能不能。

Exchange 似乎没有实现 IMAP 的字符集感知搜索,并且这样做不是 RFC3501 的要求(仅必须支持 US-ASCII)。通常支持 UTF-8,但 Exchange 似乎不支持这种情况。

您必须切换协议(EAS、EWS、REST 服务等)或提取信息、自行解码并搜索。如果你缓存它,从长远来看这还不算太糟糕。由于它是标头,因此您可以一次获取所有内容。如果你需要搜查尸体,情况就困难得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP imap_search:Microsoft Exchange 邮件服务器上的 UTF-8/非 ASCII 字符 的相关文章

  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行
  • PHP cURL 重定向到本地主机

    我正在尝试使用带有 cURL 的 php 脚本登录外部网页 我是 cURL 的新手 所以我觉得我错过了很多东西 我找到了几个例子并修改了它们以允许访问https页面 最终 我的目标是能够登录页面并在登录后通过指定的链接下载 csv 到目前为
  • XP及PHP MYSQL 练级系统

    我已经查看了所有提出的问题和答案 但我似乎找不到最适合我的答案 我想做的是开发一个系统 当用户达到一定的 XP 限制时 系统会进入下一个级别 它显示了下一个 XP 之前需要多少 XP So lvl1 0 gt lvl2 256 gt lvl
  • 如何在 Laravel 5 中对合并集合进行分页?

    我正在创建一个包含两种类型的对象的流 BluePerson 和 RedPerson 为了创建流 我获取所有这两个对象 然后将它们合并到一个集合中 这样做之后 我需要对它们进行分页 但是分页似乎是针对雄辩的模型和数据库查询 而不是集合 我见过
  • 如何解析cURL返回的header?

    我正在尝试使用 cURL 与 API 进行通信 其中一种方法要求我传递ININ ICWS CSRF Token标题 即WAhtYWxoYXlla1dBY2NvUkRJWCQxZmUxZWFhZS0xZTE0LTQyNGYtYjdhZS0zN
  • 如何使用 jquery ajax 将锚点的值发送到 php

    我正在尝试使用 jquery 将几个锚点的值发送到 php 文件 但我没有从 php 脚本中得到回调 div class result div a href value class star Star 5 a a href value cl
  • 如何使用 php imap 将邮件消息移动到文件夹

    我似乎无法将邮件移至已保存的文件夹 这是我的代码 mbox imap open mail server mail port mail folder mail username mail password or die Error openi
  • 重定向而不是 404 错误页面 - 状态代码不起作用 (Nginx)

    我目前正在迁移到 nginx 服务器 我尝试将其放入名为的 404 ErrorDocument 中404 php 如果我现在尝试访问http mydomain com 404 php 这按预期工作 它将我重定向到 Google 但是一旦我尝
  • 知道何时调用 persist

    我正在使用 Doctrine 2 作为我的 ORM 一切进展顺利 但我一直想知道EntityManager persist 方法 这 持久实体 https www doctrine project org projects doctrine
  • 在 PHP 中拆分 XML

    我有一个带有根元素和多个项目子元素的合并 xml 像这样的东西
  • 如何在 PHP 中将默认日期设置为波斯日期?

    如何在 PHP 中将默认日期设置为波斯日期 说吧 如果我echo这个功能date Y m d 然后它会显示2018 03 05但我想要1396 12 14波斯日期 请检查 http php net manual en intldatefor
  • 用PHP动态生成二维码[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的网站上生成二维码 他们所要做的就是在其中包含一个 URL 我网站上的变量将提供该 URL
  • 维护 HttpUrlConnection 调用之间的会话(Native/Webview)

    让我从我做的开始desire 我想制作一个应用程序part native and part webviews Problem 维护本机和 webview 部分之间的会话 My 处理方法 this 我打算实现一个本机登录 其中我向用户展示两个
  • PHP 和 MySQL 的重音字符错误

    我的问题是 直接通过 PHP 编写的内容是正确重音的 但是当重音单词来自 MySQL 时 字母会像这样 我尝试使用html charset as ISO 8859 1它修复了 MySQL 字母 但破坏了其他字母 解决这一切的一种方法是设置我
  • Laravel 类邮件程序不存在

    我将应用程序从 5 更新到 5 2 现在 当我调用 Mail send 时 它会返回一个异常 Class mailer 不存在 Mail send emails mail data gt content function m use to
  • 如何检查一个值是否已经存在以避免重复?

    我有一个 URL 表 但我不想要任何重复的 URL 如何使用 PHP MySQL 检查给定 URL 是否已在表中 如果您不想重复 可以执行以下操作 添加唯一性约束 use REPLACE http dev mysql com doc ref
  • SQL Server默认字符编码

    默认情况下 Microsoft SQL Server 中数据库的字符编码集是什么 如何查看 SQL Server 中当前的字符编码 编码 In most cases SQL Server stores Unicode data i e th
  • 表单提交后显示 $_FILES['image']

    提交表单后如何显示上传的图片 提交表单后 它将是一个预览页面 因此我不会在 MySQLet 中存储图像类型 BLOB 如何显示 FILES image
  • PHP 中的简单 JSON 请求

    我有以下 json country code latitude 45 9390 longitude 24 9811 zoom 6 address city country Romania country code RO region 我只想
  • PHP 中的坏词过滤器?

    我正在用 PHP 编写一个坏词过滤器 我在数组中有一个坏词列表 方法 clean text 的写法如下 public static function cleanse text originalstring if self is sorted

随机推荐