forked from extern/egroupware
fix / work around the possible problem of not retrieving the real internal imapdate when copying mails between servers/accounts, by using the mails date-header field value. hardening against target server problems by moving/copying mails one by one, renewing the connection every time
This commit is contained in:
parent
80549ae2aa
commit
6de6869c8c
@ -3492,42 +3492,62 @@ class emailadmin_imapbase
|
|||||||
$source->openMailbox($sourceFolder);
|
$source->openMailbox($sourceFolder);
|
||||||
$uidsToFetch = new Horde_Imap_Client_Ids();
|
$uidsToFetch = new Horde_Imap_Client_Ids();
|
||||||
$uidsToFetch->add($_messageUID);
|
$uidsToFetch->add($_messageUID);
|
||||||
|
|
||||||
$fquery = new Horde_Imap_Client_Fetch_Query();
|
$fquery = new Horde_Imap_Client_Fetch_Query();
|
||||||
$fquery->fullText(array('peek'=>true));
|
|
||||||
$fquery->flags();
|
$fquery->flags();
|
||||||
|
$fquery->headerText(array('peek'=>true));
|
||||||
|
$fquery->fullText(array('peek'=>true));
|
||||||
|
$fquery->imapDate();
|
||||||
$headersNew = $source->fetch($sourceFolder, $fquery, array(
|
$headersNew = $source->fetch($sourceFolder, $fquery, array(
|
||||||
'ids' => $uidsToFetch,
|
'ids' => $uidsToFetch,
|
||||||
));
|
));
|
||||||
|
|
||||||
//error_log(__METHOD__.' ('.__LINE__.') '.' Sourceserver:'.$source->ImapServerId.' mailheaders:'.array2string($headersNew));
|
//error_log(__METHOD__.' ('.__LINE__.') '.' Sourceserver:'.$source->ImapServerId.' mailheaders:'.array2string($headersNew));
|
||||||
|
|
||||||
if (is_object($headersNew)) {
|
if (is_object($headersNew)) {
|
||||||
$target = emailadmin_account::read($_targetProfileID)->imapServer();
|
|
||||||
$foldername = $target->getMailbox($_foldername);
|
|
||||||
//error_log(__METHOD__.' ('.__LINE__.') '.' Sourceserver:'.$source->ImapServerId.' TargetServer:'.$_targetProfileID.' TargetFolderObject:'.array2string($foldername));
|
|
||||||
$c=0;
|
$c=0;
|
||||||
$retUid = new Horde_Imap_Client_Ids();
|
$retUid = new Horde_Imap_Client_Ids();
|
||||||
// make sure the target folder is open and ready
|
|
||||||
$target->openMailbox($foldername);
|
|
||||||
// we copy chunks of 5 to avoid too much memory and/or server stress
|
// we copy chunks of 5 to avoid too much memory and/or server stress
|
||||||
|
// some servers seem not to allow/support the appendig of multiple messages. so we are down to one
|
||||||
foreach($headersNew as $id=>$_headerObject) {
|
foreach($headersNew as $id=>$_headerObject) {
|
||||||
$c++;
|
$c++;
|
||||||
$flags = $_headerObject->getFlags(); //unseen status seems to be lost when retrieving the full message
|
$flags = $_headerObject->getFlags(); //unseen status seems to be lost when retrieving the full message
|
||||||
|
$date = $_headerObject->getImapDate();
|
||||||
|
$currentDate = new Horde_Imap_Client_DateTime();
|
||||||
|
// if the internal Date of the message equals the current date; try using the header date
|
||||||
|
if ($date==$currentDate)
|
||||||
|
{
|
||||||
|
$headerForPrio = array_change_key_case($_headerObject->getHeaderText(0,Horde_Imap_Client_Data_Fetch::HEADER_PARSE)->toArray(), CASE_UPPER);
|
||||||
|
//error_log(__METHOD__.__LINE__.'#'.array2string($date).'#'.array2string($currentDate).'#'.$headerForPrio['DATE']);
|
||||||
|
$date = new Horde_Imap_Client_DateTime($headerForPrio['DATE']);
|
||||||
|
//error_log(__METHOD__.__LINE__.'#'.array2string($date).'#'.array2string($currentDate).'#');
|
||||||
|
}
|
||||||
//error_log(__METHOD__.' ('.__LINE__.') '.array2string($id));
|
//error_log(__METHOD__.' ('.__LINE__.') '.array2string($id));
|
||||||
//error_log(__METHOD__.' ('.__LINE__.') '.array2string($flags));
|
//error_log(__METHOD__.' ('.__LINE__.') '.array2string($flags));
|
||||||
$body = $_headerObject->getFullMsg();
|
$body = $_headerObject->getFullMsg();
|
||||||
$dataNflags[] = array('data'=>$body, 'flags'=>$flags, 'internaldate'=>$_headerObject->getImapDate());
|
$dataNflags[] = array('data'=>$body, 'flags'=>$flags, 'internaldate'=>$date);
|
||||||
if ($c==5)
|
if ($c==1)
|
||||||
{
|
{
|
||||||
|
$target = emailadmin_account::read($_targetProfileID)->imapServer();
|
||||||
|
//error_log(__METHOD__.' ('.__LINE__.') '.' Sourceserver:'.$source->ImapServerId.' TargetServer:'.$_targetProfileID.' TargetFolderObject:'.array2string($foldername));
|
||||||
|
$foldername = $target->getMailbox($_foldername);
|
||||||
|
// make sure the target folder is open and ready
|
||||||
|
$target->openMailbox($foldername);
|
||||||
$ret = $target->append($foldername,$dataNflags);
|
$ret = $target->append($foldername,$dataNflags);
|
||||||
$retUid->add($ret);
|
$retUid->add($ret);
|
||||||
unset($dataNflags);
|
unset($dataNflags);
|
||||||
time_nanosleep(0,500000);// sleep 500 miliseconds
|
// sleep 500 miliseconds; AS some sERVERs seem not to be capable of the load this is
|
||||||
|
// inflicting in them. they "reply" with an unspecific IMAP Error
|
||||||
|
time_nanosleep(0,500000);
|
||||||
$c=0;
|
$c=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($dataNflags))
|
if (isset($dataNflags))
|
||||||
{
|
{
|
||||||
|
$target = emailadmin_account::read($_targetProfileID)->imapServer();
|
||||||
|
//error_log(__METHOD__.' ('.__LINE__.') '.' Sourceserver:'.$source->ImapServerId.' TargetServer:'.$_targetProfileID.' TargetFolderObject:'.array2string($foldername));
|
||||||
|
$foldername = $target->getMailbox($_foldername);
|
||||||
|
// make sure the target folder is open and ready
|
||||||
|
$target->openMailbox($foldername);
|
||||||
$ret = $target->append($foldername,$dataNflags);
|
$ret = $target->append($foldername,$dataNflags);
|
||||||
$retUid->add($ret);
|
$retUid->add($ret);
|
||||||
unset($dataNflags);
|
unset($dataNflags);
|
||||||
|
Loading…
Reference in New Issue
Block a user