Вы сказали:
php imap возможно удалить помечать письма чтобы их удалить на сервере почтовом
Да, в PHP с использованием IMAP можно помечать письма для удаления, а затем удалять их с сервера. Это делается в два этапа:
IMAP в PHPphp$imap = imap_open("{imap.example.com:993/imap/ssl}INBOX", "username@example.com", "password");
php$emails = imap_search($imap, 'ALL');
phpif ($emails) {
foreach ($emails as $email_number) {
imap_delete($imap, $email_number);
}
}
Это не удаляет письма физически, а только помечает их как удалённые.
EXPUNGE):phpimap_expunge($imap);
phpimap_close($imap);
imap_delete() только помечает письмо как удалённое (\Deleted).
imap_expunge() фактически удаляет все письма, помеченные как \Deleted.
php<?php
$imap = imap_open("{imap.example.com:993/imap/ssl}INBOX", "username@example.com", "password");
$emails = imap_search($imap, 'ALL');
if ($emails) {
foreach ($emails as $email_number) {
imap_delete($imap, $email_number);
}
// Удаляем помеченные письма
imap_expunge($imap);
}
imap_close($imap);
?>
Если нужно удалить письма по какому-то условию (например, старше 30 дней или от определённого отправителя), можно использовать другие критерии в imap_search().
Хочешь пример для конкретного условия?
Чтобы физически удалить письмо по UID в PHP с использованием IMAP, нужно:
Получить сообщение по UID.
Пометить его как удалённое.
Выполнить expunge.
Сделать это через специальную опцию /imap/ssl/readonly НЕ должна использоваться, иначе изменения не применятся.
php<?php
// 1. Подключение к IMAP (замени параметры на свои)
$mailbox = imap_open("{imap.example.com:993/imap/ssl}INBOX", "username@example.com", "password");
// 2. UID, который нужно удалить
$uid = 12345;
// 3. Получаем внутренний номер сообщения по UID
$msgno = imap_msgno($mailbox, $uid);
if ($msgno) {
// 4. Помечаем письмо как удалённое
imap_delete($mailbox, $msgno, FT_UID);
// 5. Удаляем помеченные письма физически
imap_expunge($mailbox);
} else {
echo "Письмо с UID $uid не найдено.";
}
// 6. Закрываем соединение
imap_close($mailbox);
?>
imap_delete() по умолчанию работает с номерами сообщений, а не с UID.
Чтобы указать UID, нужно передать флаг FT_UID в imap_delete():
phpimap_delete($imap, $uid, FT_UID);
Только после вызова imap_expunge() письмо будет физически удалено с сервера.
Не подключайся с флагом /readonly, иначе не сможешь удалять.
Пример подключения с удалением:
php$imap = imap_open("{imap.example.com:993/imap/ssl}INBOX", "login", "pass");
// Без /readonly!
Если хочешь, могу помочь найти UID нужного письма по определённому фильтру (например, по теме или дате).
Да, нужно обязательно использовать оба:
👉 imap_delete(...) + imap_expunge(...) — если ты хочешь физически удалить письмо с сервера.
imap_delete($mailbox, $uid, FT_UID)Только помечает письмо как удалённое (\Deleted флаг в IMAP).
Само письмо ещё не удалено — оно просто отмечено для удаления.
imap_expunge($mailbox)Выполняет команду EXPUNGE, которая удаляет все письма, помеченные как \Deleted.
Без него письмо останется на сервере, хоть и помечено.
Если вызвать только imap_delete(...):
Письмо помечено как удалённое, но всё ещё можно:
Его увидеть в некоторых почтовых клиентах (например, Thunderbird с опцией «показать удалённые»).
Восстановить (если не был вызван EXPUNGE).
Если вызвать только imap_expunge(...) без помеченных писем — ничего не произойдёт.
| Шаг | Команда | Что делает |
|---|---|---|
| 1 | imap_delete($mailbox, $uid, FT_UID); | Помечает письмо |
| 2 | imap_expunge($mailbox); | Удаляет с сервера |
🔒 Убедись, что:
Подключение не через /readonly.
UID существует.
FT_UID передан корректно.
Если хочешь — могу показать пример, как проверить, удалилось ли письмо на самом деле.
Отличный вопрос!
Ответ зависит от почтового сервера и его настроек, но:
imap_delete + imap_expunge на практике:Не работает с "корзиной" как с отдельной папкой.
imap_delete(...) помечает письмо флагом \Deleted.
imap_expunge(...) физически удаляет письмо из текущей папки (например, INBOX).
🔻 Это значит:
Если ты вызываешь
imap_delete + imap_expunge, письмо будет безвозвратно удалено из текущей папки, и чаще всего не попадёт в корзину.
Корзина (Trash, Удалённые, Корзина) — это просто отдельная папка на сервере. Почтовые клиенты (например, Outlook, Thunderbird, Gmail) сами перемещают туда письма при удалении — это не поведение самого IMAP по умолчанию.
| Действие | Результат |
|---|---|
imap_delete + imap_expunge | Письмо полностью удаляется с сервера, в корзину не попадает |
Переместить в "Trash" вручную (через imap_mail_move) | Письмо попадёт в корзину, где может быть удалено позже |
Если хочешь переместить в "корзину", а не удалить навсегда:
phpimap_mail_move($imap, $uid, '[Gmail]/Trash', FT_UID);
imap_expunge($imap);
📌 Примечание: путь к корзине ([Gmail]/Trash) зависит от сервера. У разных провайдеров названия отличаются:
Gmail: [Gmail]/Trash
Яндекс: Trash или Удалённые
Outlook: Deleted Items
| Что ты хочешь | Как сделать |
|---|---|
| Удалить навсегда | imap_delete + imap_expunge |
| Переместить в корзину | imap_mail_move + imap_expunge |
Хочешь — скажи, какой у тебя почтовый сервер, и я подскажу точное имя папки для корзины.