我花了很长时间才让这个工作,然后最终记起来我以只读方式打开了邮箱 - 显然您需要写入权限才能设置标记!
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_setflag_full — 设置邮件的标记
导致存储将指定的 flag
添加到为指定 sequence
中的邮件设置的标记中。
imap
一个 IMAP\Connection 实例。
sequence
一组邮件编号。您可以使用 X,Y
语法枚举所需的邮件,或者使用 X:Y
语法检索一个区间内的所有邮件。
flag
您可以设置的标记为 \Seen
、\Answered
、\Flagged
、\Deleted
和 \Draft
,如 » RFC2060 中定义。
options
一个位掩码,可能包含以下选项
ST_UID
- 序列参数包含 UID 而不是序列号
始终返回 true
。
如果 options
无效,则抛出 ValueError。
版本 | 描述 |
---|---|
8.1.0 | 现在 imap 参数需要一个 IMAP\Connection 实例;之前需要一个有效的 imap 资源。 |
8.0.0 | 现在,在 options 参数值无效时会抛出 ValueError。之前会发出警告,函数返回 false 。 |
示例 #1 imap_setflag_full() 示例
<?php
$mbox = imap_open("{imap.example.org:143}", "username", "password")
or die("can't connect: " . imap_last_error());
$status = imap_setflag_full($mbox, "2,5", "\\Seen \\Flagged");
echo gettype($status) . "\n";
echo $status . "\n";
imap_close($mbox);
?>
在可能的情况下,我会避免使用 POP3 帐户。我的主机允许我升级到 IMAP,它要容易得多。我认为用 POP3 精确创建任何形式的邮件客户端的唯一方法是将邮件下载到 SQL 数据库中,这从一开始就是一项艰巨的任务,考虑到 IMAP 标准已经内置了我们需要的功能。
我在 POP3 中尝试了标记设置,似乎它们根本没有保留,而且几乎不可能检索未读邮件的数量(即,已查看/未查看功能不起作用)。
转换为 IMAP 后它工作了 - 此部分中的大多数函数似乎都集中在 IMAP 上,并且通常不会与 POP3 一起使用。
如果您想取消设置 \Seen 标记,请使用 imap_clearflag_full 函数。
https://php.net/manual/en/function.imap-clearflag-full.php
更正 phpidiot at avanca-a dot de
<?php
imap_setflag_full($mbox, '1', 'label1');
?>
如果您的服务器支持 IMAP 4rev1,则可以使用 $label{label-nr} 添加“关键字”,也称为“标签”或“PERMANENTFLAGS”。
<?php
$mbox = imap_open("{imap.example.org:143}", "username", "password")
or die("can't connect: " . imap_last_error());
$status = imap_setflag_full($mbox, "2,5", "\$label1");
echo gettype($status) . "\n";
echo $status . "\n";
imap_close($mbox);
?>
确实,POP3 不支持指示邮件“新颖性”的标记。不过,还有其他方法可以解决这个问题。例如,我见过邮件传送系统,它会添加一个 Status: 标头字段来指示其状态(参见 RFC2076)。大多数邮件客户端和邮件获取程序似乎使用的是另一种方法,即保留一个已下载邮件的 UID 列表。在获取邮件时,可以将邮件的 UID 与此列表进行比较,以查看它是否已下载。POP3 支持 UIDL 命令来获取所有 UID 列表,但我怀疑 IMAP 库使用的是此命令。我知道唯一会破坏这种解决方法的是使用多个邮件客户端。如果另一个邮件客户端从服务器获取邮件,第一个客户端无法知道它已下载。
我终于设法让这个函数起作用了。以下是一些可能对某些人有帮助的代码。
$headers = imap_headers($link);
for($x=0; $x < count($headers); $x++) {
$id = substr($headers[$x],5,4);
imap_setflag_full($link,imap_uid($link,$id),'\\SEEN',SE_UID);
}
祝你好运。
imap_setflag_full 函数可以与 pop3 一起使用,只要连接未关闭。如果你执行
imap_setflag_full($mbox, imap_uid($mbox, 0), "\\Seen \\Flagged", ST_UID);
print_r( imap_headerinfo($mbox, 0) );
你可以看到标志已设置,但是如果你使用另一个脚本再次调用邮箱,标志又会为空。
我在 WinNT (*难看*) 上用 IIS 4.0 和运行的 POP3 服务器以及 PHP 4.3 测试过。
回复
[email protected]
13-Oct-2000 06:51
pop3 确实支持删除标志 - 我过去一周一直在使用 IMAP 函数连接到 POP3 服务器,幸运的是,它可以工作。