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

imap_mail_copyCopy specified messages to a mailbox


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

Copies mail messages specified by message_nums to specified mailbox.

Elenco dei parametri


An IMAP\Connection instance.


message_nums is a range not just message numbers (as described in » RFC2060).


The mailbox name, see imap_open() for more information


Passing untrusted data to this parameter is insecure, unless imap.enable_insecure_rsh is disabled.


flags is a bitmask of one or more of

  • CP_UID - the sequence numbers contain UIDS
  • CP_MOVE - Delete the messages from the current mailbox after copying

Valori restituiti

Restituisce true in caso di successo, false in caso di fallimento.

Log delle modifiche

Versione Descrizione
8.1.0 The imap parameter expects an IMAP\Connection instance now; previously, a resource was expected.

Vedere anche:

add a note add a note

User Contributed Notes 5 notes

marcus at names dot co dot uk
19 years ago
If you are having problems getting imap_mail_copy and imap_mail_move to work, check you have installed imap_devel (the imap development libraries) as well as imap (the imap daemon). Without it, PHP appears to configure correctly --with-imap, but some functions do not work.

It took me about 12 hours to figure this out!!
jigar dot dhaduk79 at gmail dot com
6 years ago
When we want to copy more than one mail, we can write '(string)' before msg_num. Like..

$msg_num = "1,2,3,4,5,6,7";
$copy = imap_mail_copy($imap_stream, (string) $msg_num, '[Gmail]/Important', CP_UID);
8 years ago
If you use this function and you get the following notice:

Notice: Unknown: IMAP protocol error: Could not parse command (errflg=2) in Unknown on line 0

Notice: Unknown: Could not parse command (errflg=2) in Unknown on line 0

you should check the function parameters. This notice appears (according to what I found on the internet and my problems) when it gets an invalid $msglist. So be sure to give the right number (as a String!):
"$msg_num", $msg_num or (string) $msg_num.

Dont use '$msg_num' when calling the function, this will literally send the string $msg_num.
You can give a string like "1,3,5,7,8", which will work perfectly fine to move the given mails.

I had all my mailnumbers in an array ( $messageSet) and used

= implode ( "," , $messageSet );

imap_mail_copy( $imapStream, $messageSetImpl, $mailBox )

What I hadn't had thougt of was that my $messageSet was sometimes empty, that was when I got the notice. So you might want to check that by putting first:

if ( !( empty( $messageSet ) ) ) {

$messageSetImpl = implode ( "," , $messageSet );

imap_mail_copy( $imapStream, $messageSetImpl, $mailBox )


That should work.
hxlvt at hotmail dot com
20 years ago
After much fooling around, imap_mail_copy did work for me. One thing you might want to check, if you are having problems, is the new mailbox name. Make sure it is just a folder name, e.g. INBOX.haha without the server part.
richard dot oplustil at gmail dot com
9 years ago
imap_ mail_ move and imap_mail_copy don't work with sequence numbers on MS Exchange. imap_ uid in combination with CP_UID works fine.
To Top