imap_mail_move

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_mail_move将指定邮件移动到邮箱

说明

imap_mail_move(
    IMAP\Connection $imap,
    string $message_nums,
    string $mailbox,
    int $flags = 0
): bool

将由 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

返回值

成功时返回 true,失败时返回 false

变更日志

版本 说明
8.1.0 现在,imap 参数需要一个 IMAP\Connection 实例;以前,需要一个有效的 imap 资源

注释

注意:

imap_mail_move() 将用删除标志标记原始邮件,为了成功删除它,必须调用 imap_expunge() 函数。

参见

添加注释

用户贡献的注释 13 个注释

FredN
3 年前
要获得 imap_mail_move/imap_mail_copy 的正确文件夹名称,不要猜测,而是使用 imap_list
juuuugroid at yahoo dot com
22 年前
我在弄清楚邮件列表应该是什么方面遇到了最大的麻烦。有一个来自 [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!
ThEDocTor
13 年前
要将 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);
?>
alex at bestgames dot ro
18 年前
使用 imap_mail_move、imap_mail_copy 或 imap_delete 后,需要调用 imap_expunge() 函数。
laurent dot penou at gadz dot org
22 年前
为了完成之前的示例,如果 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");

希望这能有所帮助!
portico dot nospam at neverwas dot net
24 年前
此函数有效,只是不像 PHP3 中的其他 IMAP 函数一样... 而不是向服务器提供 {server.ext/type:port}folder,而是提供文件夹名称。
php at guardn dot de
21 年前
要通过 Exchange Server 上的 IMAP 将邮件移动到“Gel?schte Objekte”,请使用

imap_mail_move($mbox, $delmsg, "Gel&APY-schte Objekte");

我花了些时间进行 tcpdump,才弄清楚这一点,因为
imap_utf7_encode 和
imap_utf8

没有正确地翻译它。

Guardn
phpmanual at NOSPAMPLEASE dot headbank dot co dot uk
3 年前
请注意,此函数返回 TRUE 并不一定意味着实际发生了什么。

如果所有与你提供的范围匹配的邮件都被移动,则它算作“成功”;但是,这包括如果 _没有_ 匹配的邮件需要移动。

所以,假设你提供了一个无效的序列号或 UID,例如,因为它不再存在于源文件夹中

<?php
$res
= imap_mail_move($stream, '99999', 'DestFolder', CP_UID);

var_dump($res); // bool(true)
?>

你需要在移动之前和/或之后验证所需的邮件。
jim dot bodine at comcast dot net
17 年前
我提供以下示例,因为我花了几个小时才弄清楚这一点

<?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);

}

?>
vlad (php.net)
21 年前
这个问题一直困扰着我。很多有配额的 IMAP 服务器没有正确实现“移动”操作 - 它们实际上是“复制并删除”,却没有意识到这与它们的配额实现冲突。所以,如果你试图移动一条大邮件,即使移动邮件不会增加你的邮箱的总大小,你也会超出配额。这不是 PHP 特有的问题,但我敢打赌,除了我之外,还会有人遇到这个问题,所以这里就说一下。
ian at showstar dot com
24 年前
邮件列表的语法在 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);
}
?>
matt at bonneau dot net
24 年前
这个函数复制邮件,然后将源邮件标记为已删除。为了看到更改,你必须清空源邮箱。
dinter at gmx dot de
21 年前
我使用了点号
imap_mail_move($mbox,$movmsgid,'INBOX.send');
而不是
INBOX/test
它工作正常。
To Top