To mark an email message as unread, you must disable the \Seen flag in this message.
You can use the imap_clearflag_full function to clear message flags.
// Unset desired flag imap_clearflag_full($imap_connection, $message_number, "//Seen"); // Confirm changes imap_close($imap_connection, CL_EXPUNGE);
Note:
"I check mail using some IMAP functions that return messages as read"
You can set the FT_PEEK flag when reading messages, this will not set the \Seen flag if it is not already set.
// This will not mark a message as seen $body = imap_body($imap_stream, $msg_number, FT_PEEK);
source share