+ {running ? t("status_imported", { count: p.imported }) : null} +
++ {status} +
+ {!running && ( +{t("summary_folders", { count: p.foldersCreated })}
} + {skipped.length > 0 && ( +{t("summary_skipped")}
+{t("summary_failed", { count: p.failed })}
+{t("cancelled_hint")}
} + {p.phase === "failed" && p.error &&{p.error}
} +{t("pst_note")}
}{t("quota_note")}
@@ -240,6 +241,14 @@ export function MailImportDialog({ request }: { request: ImportRequest }) { type T = ReturnType{t("cancelled_hint")}
} - {p.phase === "failed" && p.error &&{p.error}
} + {p.phase === "failed" && p.error &&{errorText(t, p.error)}
} )} diff --git a/components/mail-transfer/start-import.ts b/components/mail-transfer/start-import.ts index 9544bcd54..649f7cdcd 100644 --- a/components/mail-transfer/start-import.ts +++ b/components/mail-transfer/start-import.ts @@ -25,7 +25,10 @@ export function startImport(input: StartImportInput): void { controller, progress: { phase: "running", imported: 0, failed: 0, skipped: {}, failures: [], fraction: 0, foldersCreated: 0 }, }); + const hasPst = input.files.some((f) => f.format === "pst"); void (async () => { + // The PST reader (and its worker) load only for an Outlook file. + const openPst = hasPst ? (await import("@/lib/mail-import/pst-source")).openPstSource : undefined; const result = await runImport({ client, accountId: input.accountId, @@ -36,6 +39,7 @@ export function startImport(input: StartImportInput): void { resume: input.resume, signal: controller.signal, onProgress: (progress) => useMailTransferStore.getState().updateProgress(progress), + openPst, }); useMailTransferStore.getState().updateProgress(result); // Show what arrived, if the same account is still the one on screen. diff --git a/lib/mail-import/__tests__/fixtures/Outlook.pst b/lib/mail-import/__tests__/fixtures/Outlook.pst new file mode 100644 index 0000000000000000000000000000000000000000..6d0dae3b8f74d05366294736dfec3e24cc4242df GIT binary patch literal 1287168 zcmeD^2|$$9)^`wbNrfCmQ^Y~sa%r^*QIqRZ#v4t=wOnvq(;_Mi>?w?dM7fq`WR~Vq z6ZuN9#auBpDc980(o)HUz|4$HP2@l4yXOouA2S0Mz1Mp`SBLxEbI(0@-_AYv+>mZP z`Wz0K5fs(CfiMb#VOvI8*%xEIL?0jUAK;VIQygh52WX8Rv49QyT4{<-A4!(1rDWji$u(Y5Vx|sT}{pH
zqx}`)q53_Gi|PA6VI>v+XN?VtXH0vQ^SowX_`H0-DzE=USyaYZSpt uyS?{=de{`0wui
zmHsZM=f|4d%?X$bJQ4f_?9e=Q;x{KRPCH$}S2wX?d73L?;no$l?5c1J3->qo?q8Yj
zd;6Bx8Vw%Vsg7~s#<|@e`k)ASsu|f2Xtw9aqQ2jBs_L|aQKCWH3)LT+-1ZJ2R*El!
zBgVJH(0SzeH~r(ljW9I$jb2zE^<^Wd6I?&z4XuUdW9BtpN9F;B58BUPa&g7`#Q*Sg
z{&C9)*u6Q)Ur+zro`1{%=7c+m=@NKFoPU&1b3OkkfpaR#lE41)_O<=1JT!pLKdPCF
zpTast!z06=Yxhirb)x^Ty449hYPd~@6BDKT5G85+WGij`IZXZt{h}7!Lo}LqnNvUp
zz8dt57{lzEAyc06pGEh_hE@Ok^mm4rYV_Xm;fw~YlVed=WB-U|!#2IYbx`#>CPUZt
zZ?!{xjhiMto%DI<;ce&5&6-p5(7}tSvvEMPOSc7$%stro;B(*pG;s6Xco*hy(M!|2
zHvB^P3{P5fSN`yhcwgw}v_1Q3|MUKX^R07UxYc+_;48G)my;mX2Vfd286C_1^7Z-V
z&hZh`A3jd!mlc101{aVugZ2#g-T%6BSJe60Yq!;ZCavZ1#wxF2?#>Su;x+QYz<_k+
zzgqHuj|%)$b11IkfUnvD*JEjL?u~kVL8h|>t_RcLemkz$(qv%^T)!F3yIbJ84(=MX
zQ0v4oE!6unc`a}qXEYCQ0qek|G=2Otz=;Zzvv|JF?0{
zF?>#@=b!ZQ^Au9SO`^|h!>eu0??ZUo{sjMs
W#n#ig$Ri&7z(MtZdZt0Lj$!JcNLa
zdLFQ@QP)Er*r@vfnFD`Re
V@y8SYF{iyMe=H9y?>&E8{$rR2{$mNeBKVIb)Li+G
zCGhg{A3tuG)pX@+VYL6R`29;S+P|Q^7k_P_3c*y={^e%hT