php - imap - перемещение писем на другой аккаунт - PullRequest
0 голосов
/ 02 октября 2008

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

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

Так что мне нужно переместить почту (через код 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('Y-m-d 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");

?>

Ответы [ 3 ]

1 голос
/ 07 октября 2008

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

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

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

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

Не все серверы IMAP допускают использование общих папок.

У php есть функция imap_move, но я предполагаю, что он выполняет копирование / удаление.

1 голос
/ 29 апреля 2011

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

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

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

в imap_append () вы должны указать дату из emailheader. см. руководство по PHP: http://php.net/manual/en/function.imap-append.php

после этого у вас будет копия письма 1 на 1 на целевом IMAP-сервере.

0 голосов
/ 02 октября 2008

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

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

б) сохранить их в БД?

или даже

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...