php – imap – перемещение электронных писем на учетную запись antoher

Я работаю над сценарием, который загружает электронные письма и хранит их в db, я обычно получаю тысячи писем в этой учетной записи, после того как загруженные почтовые сообщения удалены.

Будучи параноиком, я хочу иметь как минимум один месяц резервное копирование своих писем, но я не могу загромождать свой основной почтовый ящик, оставляя их там.

Поэтому мне нужно переместить почту (через php-код) из одного почтового ящика в другой. Я придумал это решение, которое использует imap_append (). Это решение, однако, воссоздает электронную почту и на самом деле не перемещает ее.

Есть ли у вас какие-либо предложения или альтернативные способы сделать это?

Помните: это должно быть сделано в php, потому что мне нужно интегрировать его в мой скрипт readmail.

Я уже видел эту ветку, где было предложено решение fetchmail

Здесь следует код, который я написал для этой задачи

<?php /** * Conn params */ $fromMboxServerPath = "{imap.from.server/notls/imap:143}"; $fromMboxMailboxPath = "INBOX"; $fromMboxMailAddress = "login"; $fromMboxMailPass = "pass"; $toMboxServerPath = "{imap.to.server/notls/imap:143}"; $toMboxMailboxPath = "INBOX"; $toMboxMailAddress = "login"; $toMboxMailPass = "pass"; $fromMboxConnStr = $fromMboxServerPath.$fromMboxMailboxPath; $toMboxConnStr = $toMboxServerPath.$toMboxMailboxPath; $fetchStartSeq = 1; $fetchEndSeq = 10; function myLog($str) { echo "Log [".date('Ymd H:i:s')."]: $str\n"; } myLog("Connecting to mailbox"); function mboxConn($connstr,$addr,$pass) { if(!($mbox = @imap_open($connstr, $addr, $pass))) { myLog("Error: ".imap_last_error()); die; } else { myLog("Connected to: $addr $connstr"); return $mbox; } } function mboxCheck($mbox) { if(!($mbox_data = imap_check($mbox))) { myLog("Error: ".imap_last_error()); die; } else { myLog("Mailbox check ".$mbox_data->Mailbox." OK"); myLog($mbox_data->Nmsgs." messages present"); return $mbox_data->Nmsgs; } } $fromMbox = mboxConn($fromMboxConnStr, $fromMboxMailAddress, $fromMboxMailPass); $toMbox = mboxConn($toMboxConnStr, $toMboxMailAddress, $toMboxMailPass); $fromMboxCount = mboxCheck($fromMbox); $toMboxCount = mboxCheck($toMbox); /** * Loop on mails */ $fetchStartUID = imap_uid($fromMbox,$fetchStartSeq); if ($fromMboxCount < $fetchEndSeq) { $fetchEndSeq = $fromMboxCount; } $fetchEndUID = imap_uid($fromMbox,$fetchEndSeq); /** * Loop on mails */ myLog("Do stuff and backup from UID [$fetchStartUID] to UID [$fetchEndUID]"); for ($i=$fetchStartSeq;$i<=$fetchEndSeq;$i++) { $pfx = "Msg #$i : "; $h = imap_header($fromMbox, $i); $fh = imap_fetchheader($fromMbox, $i); $fb = imap_body($fromMbox, $i); $message = $fh.$fb; $msgUID = imap_uid($fromMbox,$i); $struct = imap_fetchstructure ($fromMbox, $i); /** * We do some logging */ myLog($pfx."UID [".$msgUID."] SEQ [".imap_msgno($fromMbox,$msgUID)."] Flags: [". $h->Unseen . $h->Recent . $h->Deleted . $h->Answered . $h->Draft . $h->Flagged."]"); myLog($pfx."From: [". htmlspecialchars($h->fromaddress) . "] To: [".htmlspecialchars($h->toaddress)."]"); myLog($pfx."Subject: [$h->subject]"); /** * Here you do whaterver you need with your email */ /** * Backup email */ if (!($ret = imap_append($toMbox,$toMboxServerPath.$toMboxMailboxPath,$message))) { myLog("Error: ".imap_last_error()); die; } else { myLog("everything ok, mail [$fetchStartUID:$fetchEndUID] downloaded and moved in $newMailboxNameMOVE"); } } /** * End */ imap_close($fromMbox); imap_close($toMbox); myLog("Connection closed"); ?> 

Во-первых, IMAP не имеет команды MOVE только для копирования, но даже если это возможно, вы можете напрямую копировать с одного сервера IMAP на другой.

Почему бы не использовать подпапку в учетной записи для резервного копирования. Загрузите их на свой локальный компьютер, затем скопируйте их в подпапку, а затем УДАЛИТЕ их из INBOX.

COPY и DELETE являются командами стороны imap-сервера, поэтому им не нужно оставлять сервер для выполнения «перемещения»,

Если обе учетные записи находятся на одном сервере, есть другой параметр, разрешите доступ к INBOX учетной записи резервного копирования для основного пользователя учетной записи. Затем вы можете использовать копию / удаление на стороне сервера, чтобы переместить его в папку резервного копирования.

Не все IMAP-серверы допускают общие папки.

php имеет функцию imap_move, но я предполагаю, что она копирует / удаляет.

Я не знаю другого решения, такого как PHP.

Но для вашего кода и тестирования вы должны использовать:

 $fromMboxServerPath = "{imap.from.server/notls/imap/readonly:143}"; //ReadOnly 

в imap_append () вы должны указать дату с помощью электронной почты. см. Руководство по PHP: http://php.net/manual/en/function.imap-append.php

после этого у вас будет копия 1to1 вашей почты в целевом IMAP-сервере.

Зачем нужен отдельный аккаунт и все хлопоты, которые будут задействованы? Вы не можете

a) резервное копирование учетной записи электронной почты с использованием стандартных средств резервного копирования, например, например. RDIFF резервного копирования?

б) поддержать их в db?

или даже

c) создать псевдоним, чтобы электронные письма переходили в обе учетные записи, и у вас есть разные критерии для удаления писем из обеих учетных записей (т. е. сохранить их еще на один месяц в резервной учетной записи)