要获得 imap_mail_move/imap_mail_copy 的正确文件夹名称,不要猜测,而是使用 imap_list
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_mail_move — 将指定邮件移动到邮箱
将由 message_nums
指定的邮件移动到指定的 mailbox
。请注意,邮件实际上是复制到 mailbox
,并且原始邮件被标记为删除。这意味着 mailbox
中的邮件将被分配新的 UID。
imap
一个 IMAP\Connection 实例。
message_nums
message_nums
是一个范围,而不仅仅是邮件号(如 » RFC2060 中所述)。
mailbox
邮箱名称,有关更多信息,请参见 imap_open()
除非 imap.enable_insecure_rsh 被禁用,否则将不可信数据传递到此参数是不安全的。
flags
flags
是一个位掩码,可以包含以下选项
CP_UID
- 序列号包含 UID
版本 | 说明 |
---|---|
8.1.0 | 现在,imap 参数需要一个 IMAP\Connection 实例;以前,需要一个有效的 imap 资源。 |
注意:
imap_mail_move() 将用删除标志标记原始邮件,为了成功删除它,必须调用 imap_expunge() 函数。
我在弄清楚邮件列表应该是什么方面遇到了最大的麻烦。有一个来自 [email protected] 的评论,但我仍然非常困惑。所以我搜索了又搜索。我阅读了 rfc2060 超过 10 次。然后 BAM!我的兄弟在这里找到了它
http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc2060.html#sec-6.4.7
这是重要的内容。
另一个重要的字段是 SEQUENCE,它通过从 1 到 n 的连续数字来标识一组邮件,其中 n 是邮箱中的邮件数量。一个序列可以包含单个数字,以冒号分隔的数字对(等效于这两个数字之间的所有数字),或单个数字或数字对的列表。例如,序列 2,4:7,9,12:15 等效于
2,4,5,6,7,9,12,13,14,15 并标识所有这些邮件。
这就是我对它的了解。BAM!
要将 Gmail 中的邮件复制/移动到特定文件夹,如 Starred/Spam/Drafts/Trash
使用以下语句,不要忘记在之后调用 CL_EXPUNGE 或 imap_expunge($mbox)。
<?php
imap_mail_copy($mbox,'16','[Gmail]/Starred'); // 16 是邮件号,也可以是范围。(例如:'1:15')
imap_close($mbox,CL_EXPUNGE);
?>
如果你想将其发送到个人创建的标签/文件夹(例如:Test),请使用..
<?php
imap_mail_copy($mbox,'16','Test');
imap_expunge($mbox);
imap_close($mbox);
?>
使用 imap_mail_move、imap_mail_copy 或 imap_delete 后,需要调用 imap_expunge() 函数。
为了完成之前的示例,如果 mbox/文件夹名称为
{imap.free.fr}INBOX
{imap.free.fr}INBOX/draft
{imap.free.fr}INBOX/test
并且你想要从 INBOX 复制/移动到 INBOX/test,这是语法
$mbox = imap_open("{imap.free.fr}INBOX",$mailuser,$mailpass)
or die("can't connect: ".imap_last_error());
...
imap_mail_move($mbox,$messageset,"INBOX/test");
希望这能有所帮助!
此函数有效,只是不像 PHP3 中的其他 IMAP 函数一样... 而不是向服务器提供 {server.ext/type:port}folder,而是提供文件夹名称。
要通过 Exchange Server 上的 IMAP 将邮件移动到“Gel?schte Objekte”,请使用
imap_mail_move($mbox, $delmsg, "Gel&APY-schte Objekte");
我花了些时间进行 tcpdump,才弄清楚这一点,因为
imap_utf7_encode 和
imap_utf8
没有正确地翻译它。
Guardn
请注意,此函数返回 TRUE 并不一定意味着实际发生了什么。
如果所有与你提供的范围匹配的邮件都被移动,则它算作“成功”;但是,这包括如果 _没有_ 匹配的邮件需要移动。
所以,假设你提供了一个无效的序列号或 UID,例如,因为它不再存在于源文件夹中
<?php
$res = imap_mail_move($stream, '99999', 'DestFolder', CP_UID);
var_dump($res); // bool(true)
?>
你需要在移动之前和/或之后验证所需的邮件。
我提供以下示例,因为我花了几个小时才弄清楚这一点
<?php
$this->mailInBox = imap_open($this->mailConnectString."INBOX", $this->accountLogin, $this->accountPassword);
$this->messageCount = imap_num_msg($this->mailInBox);
echo "正在处理 " . $this->messageCount . " 条邮件:<Br>";
for ($i = 1; $i <= $this->messageCount; ++$i) {
$header = imap_header($this->mailInBox, $i);
$prettydate = date("jS F Y", $header->udate);
$fromHost = $header->from[0]->host;
if (isset($header->from[0]->personal)) {
$personal = $header->from[0]->personal;
} else {
$personal = $header->from[0]->mailbox;
}
$body = imap_fetchbody($this->mailInBox, $i, "1.1");
if ($body == "") {
$body = imap_fetchbody($this->mailInBox, $i, "1");
}
$move = "INBOX.processed" . date("Ymd");
echo "尝试移动: " . $i . "<br>";
@imap_mail_move($this->mailInBox, $i, $move);
}
?>
这个问题一直困扰着我。很多有配额的 IMAP 服务器没有正确实现“移动”操作 - 它们实际上是“复制并删除”,却没有意识到这与它们的配额实现冲突。所以,如果你试图移动一条大邮件,即使移动邮件不会增加你的邮箱的总大小,你也会超出配额。这不是 PHP 特有的问题,但我敢打赌,除了我之外,还会有人遇到这个问题,所以这里就说一下。
邮件列表的语法在 RFC2060 中定义。
它是一个字符串,包含一个由逗号分隔的邮件编号和范围列表(中间没有空格)。例如,“1,2,5,11:15,19”会被 imap_mail_copy 或 imap_mail_move 接受。
邮件范围由两个用冒号分隔的邮件编号定义(例如,“1:10”)。此外,可以利用“*”来表示邮箱中的最后一条邮件。(例如,“1:*”表示所有邮件)
注意不要对源文件夹和目标文件夹使用同一个邮箱,尤其是在你之后立即清空邮箱的情况下;邮件会被复制(回到它自身),被标记为已删除(由 imap_mail_move 函数完成),然后被清空。
以下代码将 $msg_no[] 数组中的邮件从 $mbox_name 文件夹移动到 $newmbox_name 文件夹:($mbox 是一个已打开的 imap 流)
<?php
if ($mbox_name != $newmbox_name) {
reset($msg_no);
$messageset = implode (",",$msg_no);
imap_mail_move($mbox,$messageset,$newmbox_name);
imap_expunge($mbox);
}
?>