Improved imapsync to use JMAP role for matching system folders

This commit is contained in:
the-djmaze 2022-12-15 16:27:02 +01:00
parent 9fb7cd881f
commit 99a3132023
2 changed files with 47 additions and 22 deletions

View file

@ -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
]);
} }
} }
} }

View file

@ -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'] ?? '');