mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-09-07 16:37:02 +03:00
Improved imapsync to use JMAP role for matching system folders
This commit is contained in:
parent
9fb7cd881f
commit
99a3132023
2 changed files with 47 additions and 22 deletions
|
|
@ -27,11 +27,19 @@ class Sync
|
||||||
if (!$aTargetFolders) {
|
if (!$aTargetFolders) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
$sTargetINBOX = 'INBOX';
|
|
||||||
$sTargetDelimiter = '';
|
$sTargetDelimiter = '';
|
||||||
|
$sTargetRoles = [
|
||||||
|
'inbox' => false,
|
||||||
|
'sent' => false,
|
||||||
|
'drafts' => false,
|
||||||
|
'junk' => false,
|
||||||
|
'trash' => false,
|
||||||
|
'archive' => false
|
||||||
|
];
|
||||||
foreach ($aTargetFolders as $sFullName => $oImapFolder) {
|
foreach ($aTargetFolders as $sFullName => $oImapFolder) {
|
||||||
if ($oImapFolder->IsInbox()) {
|
$role = $oImapFolder->Role();
|
||||||
$sTargetINBOX = $sFullName;
|
if ($role && empty($sTargetRoles[$role])) {
|
||||||
|
$sTargetRoles[$role] = $sFullName;
|
||||||
}
|
}
|
||||||
if (!$sTargetDelimiter) {
|
if (!$sTargetDelimiter) {
|
||||||
$sTargetDelimiter = $oImapFolder->Delimiter();
|
$sTargetDelimiter = $oImapFolder->Delimiter();
|
||||||
|
|
@ -44,7 +52,6 @@ class Sync
|
||||||
if (!$aSourceFolders) {
|
if (!$aSourceFolders) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
$sSourceINBOX = 'INBOX';
|
|
||||||
|
|
||||||
$isCli = false !== \stripos(\php_sapi_name(), 'cli');
|
$isCli = false !== \stripos(\php_sapi_name(), 'cli');
|
||||||
if ($isCli) {
|
if ($isCli) {
|
||||||
|
|
@ -60,27 +67,38 @@ class Sync
|
||||||
\ignore_user_abort(true);
|
\ignore_user_abort(true);
|
||||||
foreach ($aSourceFolders as $sSourceFolderName => $oImapFolder) {
|
foreach ($aSourceFolders as $sSourceFolderName => $oImapFolder) {
|
||||||
++$fi;
|
++$fi;
|
||||||
if ($isCli) {
|
|
||||||
echo \str_pad($fi, 3, ' ', STR_PAD_LEFT) . " folder: {$sSourceFolderName}\n";
|
|
||||||
} else {
|
|
||||||
\SnappyMail\HTTP\Stream::JSON([
|
|
||||||
'index' => $fi,
|
|
||||||
'folder' => $sSourceFolderName
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
if ($oImapFolder->Selectable()) {
|
if ($oImapFolder->Selectable()) {
|
||||||
if ($oImapFolder->IsInbox()) {
|
$role = $oImapFolder->Role();
|
||||||
$sSourceINBOX = $sSourceFolderName;
|
if ('all' === $role) {
|
||||||
|
// Don't duplicate all mail
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
// Set mailbox delimiter
|
// Detect mailbox name based on role
|
||||||
$sTargetFolderName = $sSourceFolderName;
|
if (!$sTargetRootFolderName && $role && !empty($sTargetRoles[$role])) {
|
||||||
if ($sTargetDelimiter) {
|
$sTargetFolderName = $sTargetRoles[$role];
|
||||||
$sTargetFolderName = \str_replace($oImapFolder->Delimiter(), $sTargetDelimiter, $sTargetFolderName);
|
|
||||||
$sTargetRootFolderName = \str_replace($sTargetDelimiter, '-', $sTargetRootFolderName);
|
|
||||||
}
|
}
|
||||||
if ($sTargetRootFolderName) {
|
// Else just do a name match
|
||||||
$sTargetFolderName = $sTargetRootFolderName . ($sTargetDelimiter?:'-') . $sTargetFolderName;
|
else {
|
||||||
|
if ($sTargetDelimiter) {
|
||||||
|
$sTargetFolderName = \str_replace($oImapFolder->Delimiter(), $sTargetDelimiter, $sSourceFolderName);
|
||||||
|
$sTargetRootFolderName = \str_replace($sTargetDelimiter, '-', $sTargetRootFolderName);
|
||||||
|
} else {
|
||||||
|
$sTargetFolderName = $sSourceFolderName;
|
||||||
|
}
|
||||||
|
if ($sTargetRootFolderName) {
|
||||||
|
$sTargetFolderName = $sTargetRootFolderName . ($sTargetDelimiter?:'-') . $sTargetFolderName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if ($isCli) {
|
||||||
|
echo \str_pad($fi, 3, ' ', STR_PAD_LEFT) . " folder: {$sSourceFolderName} => {$sTargetFolderName}\n";
|
||||||
|
} else {
|
||||||
|
\SnappyMail\HTTP\Stream::JSON([
|
||||||
|
'index' => $fi,
|
||||||
|
'folder' => $sSourceFolderName,
|
||||||
|
'target' => $sTargetFolderName
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
// Create mailbox if not exists
|
// Create mailbox if not exists
|
||||||
if (!isset($aTargetFolders[$sTargetFolderName])) {
|
if (!isset($aTargetFolders[$sTargetFolderName])) {
|
||||||
$this->oImapTarget->FolderCreate(
|
$this->oImapTarget->FolderCreate(
|
||||||
|
|
@ -208,6 +226,13 @@ class Sync
|
||||||
echo "\n";
|
echo "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if ($isCli) {
|
||||||
|
echo \str_pad($fi, 3, ' ', STR_PAD_LEFT) . " folder: {$sSourceFolderName}\n";
|
||||||
|
} else {
|
||||||
|
\SnappyMail\HTTP\Stream::JSON([
|
||||||
|
'index' => $fi,
|
||||||
|
'folder' => $sSourceFolderName
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -120,4 +120,4 @@ $oSync = new \SnappyMail\Imap\Sync;
|
||||||
$oSync->oImapSource = getImapClient(1);
|
$oSync->oImapSource = getImapClient(1);
|
||||||
$oSync->oImapTarget = getImapClient(2);
|
$oSync->oImapTarget = getImapClient(2);
|
||||||
|
|
||||||
$oSync->import($options['rootfolder'] ?: 'test');
|
$oSync->import($options['rootfolder'] ?? '');
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue