feat(mailbox): support mailbox cleanup #96

This commit is contained in:
rustmailer
2026-01-05 18:27:40 +08:00
parent c69ada32ef
commit e56fe5ebea
29 changed files with 455 additions and 55 deletions
+6
View File
@@ -34,4 +34,10 @@ export interface MailboxData {
export const list_mailboxes = async (accountId: number, remote: boolean) => {
const response = await axiosInstance.get<MailboxData[]>(`/api/v1/list-mailboxes/${accountId}?remote=${remote}`);
return response.data;
};
export const delete_mailbox = async (accountId: number, mailboxId: string) => {
const response = await axiosInstance.delete(`/api/v1/delete-mailbox/${accountId}/${mailboxId}`);
return response.data;
};
@@ -0,0 +1,105 @@
//
// Copyright (c) 2025 rustmailer.com (https://rustmailer.com)
//
// This file is part of the Bichon Email Archiving Project
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import { IconAlertTriangle } from '@tabler/icons-react';
import { toast } from '@/hooks/use-toast';
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
import { ConfirmDialog } from '@/components/confirm-dialog';
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useMailboxContext } from '../context';
import { useTranslation } from 'react-i18next';
import { delete_mailbox } from '@/api/mailbox/api';
interface Props {
open: boolean;
onOpenChange: (open: boolean) => void;
}
export function MailBoxDeleteDialog({ open, onOpenChange }: Props) {
const queryClient = useQueryClient();
const { selectedAccountId, deleteMailboxId, setDeleteMailboxId } = useMailboxContext();
const { t } = useTranslation();
const deleteMutation = useMutation({
mutationFn: ({ accountId, mailboxId }: { accountId: number; mailboxId: string }) =>
delete_mailbox(accountId, mailboxId),
retry: false,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['account-mailboxes', `${selectedAccountId}`] });
onOpenChange(false);
setDeleteMailboxId(undefined);
toast({
title: t('mailbox.deleteMailboxDialog.successTitle'),
description: t('mailbox.deleteMailboxDialog.successDesc'),
});
},
onError: (error: any) => {
toast({
title: t('mailbox.deleteMailboxDialog.errorTitle'),
description: error.message || "Delete failed",
variant: 'destructive',
});
},
});
const handleDelete = () => {
if (selectedAccountId && deleteMailboxId) {
deleteMutation.mutate({
accountId: selectedAccountId,
mailboxId: deleteMailboxId
});
}
};
const isLoading = deleteMutation.isPending;
return (
<ConfirmDialog
open={open}
onOpenChange={(isOpen) => {
onOpenChange(isOpen);
if (!isOpen) setDeleteMailboxId(undefined);
}}
handleConfirm={handleDelete}
className="max-w-xl"
isLoading={isLoading}
title={
<span className="text-destructive">
<IconAlertTriangle
className="mr-1 inline-block stroke-destructive"
size={18}
/>{' '}
{t('mailbox.deleteMailboxDialog.title')}
</span>
}
desc={
<div className="space-y-4">
<p className="mb-2">
{t('mailbox.deleteMailboxDialog.desc')}
</p>
<Alert variant="destructive">
<AlertTitle>{t('mailbox.deleteMailboxDialog.warningTitle')}</AlertTitle>
<AlertDescription>{t('mailbox.deleteMailboxDialog.warningDesc')}</AlertDescription>
</Alert>
</div>
}
confirmText={t('mailbox.deleteMailboxDialog.confirm')}
destructive
/>
);
}
+71 -28
View File
@@ -49,8 +49,12 @@ import { styled } from "@mui/material/styles"
import { animated, useSpring } from "@react-spring/web"
import { TransitionProps } from "@mui/material/transitions"
import Collapse from "@mui/material/Collapse"
import { FolderIcon } from "lucide-react"
import { FolderIcon, MoreVertical, Trash2 } from "lucide-react"
import { RestoreMessageDialog } from "./restore-message-dialog"
import { Button } from "@/components/ui/button"
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
import { useTranslation } from "react-i18next"
import { MailBoxDeleteDialog } from "./delete-mailbox-dialog"
interface MailProps {
@@ -79,15 +83,14 @@ const useListMessages = ({ accountId, mailboxId, page, page_size }: ListMessages
});
};
interface CustomLabelProps {
exists?: number;
attributes?: { attr: string; extension: string | null }[],
children: React.ReactNode;
id: string;
icon?: React.ElementType;
expandable?: boolean;
onDelete: (id: string) => void;
}
function CustomLabel({
@@ -95,8 +98,11 @@ function CustomLabel({
exists,
attributes,
children,
id,
onDelete,
...other
}: CustomLabelProps) {
const { t } = useTranslation()
return (
<TreeItemLabel
{...other}
@@ -109,27 +115,39 @@ function CustomLabel({
<span className="font-medium text-sm text-inherit">
{children}
</span>
{/* <div className="flex gap-2 ml-auto mr-3 opacity-70 text-xs">
{attributes?.map((attr) => {
const text =
attr.attr === 'Extension'
? attr.extension
: attr.attr;
return (
<span key={attr.attr} className="text-inherit">
{text}
</span>
);
})}
<div className="ml-auto flex items-center">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant="ghost"
size="icon"
className="h-6 w-6 p-0 hover:bg-muted rounded-md"
onMouseDown={(e) => e.stopPropagation()}
onClick={(e) => {
e.stopPropagation();
e.preventDefault();
}}
>
<MoreVertical className="h-4 w-4" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" className="w-20">
<DropdownMenuItem
className="text-destructive focus:text-destructive"
onClick={(e) => {
e.stopPropagation();
}}
onSelect={(e) => {
e.preventDefault();
onDelete(id);
}}
>
<Trash2 className="mr-2 h-4 w-4" />
<span>{t('common.delete')}</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
{exists !== undefined && (
<span
className="text-sm opacity-60 min-w-[40px] text-right text-inherit"
>
{exists}
</span>
)} */}
</TreeItemLabel>
);
}
@@ -172,6 +190,8 @@ export function Mail({
const [pageSize, setPageSize] = React.useState(30);
const [deleteIds, setDeleteIds] = React.useState<Set<number>>(() => new Set());
const [selected, setSelected] = React.useState<Set<number>>(() => new Set());
const [deleteMailboxId, setDeleteMailboxId] = React.useState<string | undefined>(undefined);
const { theme } = useTheme()
const { data: mailboxes, isLoading: isMailboxesLoading } = useQuery({
@@ -225,6 +245,11 @@ export function Mail({
}
};
const handleDeleteClick = (id: string) => {
setDeleteMailboxId(id);
setOpen('delete');
};
const CustomTreeItem = React.useMemo(() => {
return React.forwardRef(function CustomTreeItem(
props: CustomTreeItemProps,
@@ -257,6 +282,8 @@ export function Mail({
<CustomLabel
{...getLabelProps({
exists: item.exists,
id: item.id,
onDelete: handleDeleteClick,
attributes: item.attributes,
expandable: status.expandable && status.expanded,
})}
@@ -270,11 +297,22 @@ export function Mail({
});
}, [theme]);
return (
<MailboxProvider value={{ open, setOpen, currentMailbox: selectedMailbox, selectedAccountId, setCurrentMailbox: setSelectedMailbox, currentEnvelope: selectedEvelope, setCurrentEnvelope: setSelectedEvelope, deleteIds, setDeleteIds, selected, setSelected }}>
<MailboxProvider value={{
open,
setOpen,
currentMailbox: selectedMailbox,
selectedAccountId,
setCurrentMailbox: setSelectedMailbox,
currentEnvelope: selectedEvelope,
setCurrentEnvelope: setSelectedEvelope,
deleteIds,
setDeleteIds,
selected,
setSelected,
deleteMailboxId,
setDeleteMailboxId
}}>
<TooltipProvider delayDuration={0}>
<ResizablePanelGroup
direction="horizontal"
@@ -409,6 +447,11 @@ export function Mail({
open={open === 'restore'}
onOpenChange={() => setOpen('restore')}
/>
<MailBoxDeleteDialog
key='mailbox-delete'
open={open === 'delete'}
onOpenChange={() => setOpen('delete')}
/>
</MailboxProvider >
)
+3 -1
View File
@@ -21,7 +21,7 @@ import React from 'react'
import { MailboxData } from '@/api/mailbox/api'
import { EmailEnvelope } from '@/api'
export type MailboxDialogType = 'mailbox' | 'display' | 'move-to-trash' | 'filters' | 'restore'
export type MailboxDialogType = 'mailbox' | 'display' | 'move-to-trash' | 'filters' | 'restore' | 'delete'
interface MailboxContextType {
open: MailboxDialogType | null
@@ -30,6 +30,8 @@ interface MailboxContextType {
currentMailbox: MailboxData | undefined
currentEnvelope: EmailEnvelope | undefined
setCurrentMailbox: React.Dispatch<React.SetStateAction<MailboxData | undefined>>
deleteMailboxId: string | undefined,
setDeleteMailboxId: React.Dispatch<React.SetStateAction<string | undefined>>
setCurrentEnvelope: React.Dispatch<React.SetStateAction<EmailEnvelope | undefined>>
deleteIds: Set<number>
setDeleteIds: React.Dispatch<React.SetStateAction<Set<number>>>
-2
View File
@@ -34,10 +34,8 @@ export function buildTree(items: MailboxData[]): TreeViewBaseItem<ExtendedTreeIt
for (const mb of items) {
if (!mb.name) continue;
const delimiter = mb.delimiter ?? '/';
const parts = mb.name.split(delimiter);
let currentFullName = '';
for (let i = 0; i < parts.length; i++) {
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "فعّل هذا الخيار فقط إذا كنت تتصل بخادم IMAP يستخدم شهادة TLS صادرة عن CA عام أو شهادة موقعة ذاتياً قد لا يتعرف عليها نظامك. هذا الإعداد يتجاوز عملية التحقق الاعتيادية من الشهادة، وقد يعرض الاتصال لهجمات “رجل في الوسط” — فعّله فقط إذا كنت تدرك المخاطر."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "حذف مجلد البريد",
"desc": "هل أنت متأكد من رغبتك في حذف مجلد البريد هذا؟ لا يمكن التراجع عن هذا الإجراء.",
"warningTitle": "تحذير",
"warningDesc": "سيؤدي حذف هذا المجلد أيضًا إلى إزالة جميع رسائل البريد الإلكتروني المؤرشفة والمجلدات الفرعية الموجودة بداخله نهائيًا.",
"confirm": "حذف نهائي",
"successTitle": "تم الحذف بنجاح",
"successDesc": "تمت إزالة مجلد البريد ومحتوياته بنجاح.",
"errorTitle": "فشل الحذف"
},
"title": "صندوق البريد",
"folders": "المجلدات",
"messages": "الرسائل",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Aktivér denne indstilling kun hvis du opretter forbindelse til en IMAPserver, der bruger et offentligt CAcertifikat eller et selvsigneret certifikat, som dit system måske ikke genkender. Denne indstilling omgår standard certificeringsvalidering og kan gøre dig sårbar over for maninthemiddleangreb — aktiver kun hvis du forstår risikoen."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Slet postkassemappe",
"desc": "Er du sikker på, at du vil slette denne postkassemappe? Denne handling kan ikke fortrydes.",
"warningTitle": "Advarsel",
"warningDesc": "Sletning af denne mappe vil også permanent fjerne alle arkiverede e-mails og undermapper i den.",
"confirm": "Slet permanent",
"successTitle": "Sletning lykkedes",
"successDesc": "Postkassemappen og dens indhold er blevet fjernet.",
"errorTitle": "Sletning mislykkedes"
},
"title": "Mailboks",
"folders": "Mapper",
"messages": "Meddelelser",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Aktivieren Sie diese Option nur, wenn Sie sich mit einem IMAPServer verbinden, der ein öffentliches CAZertifikat oder ein selbstsigniertes Zertifikat verwendet, das Ihr System möglicherweise nicht erkennt. Diese Einstellung umgeht die StandardZertifikatsprüfung und kann Sie für ManintheMiddleAngriffe anfällig machen aktivieren Sie nur, wenn Sie die Risiken verstehen."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Postfachordner löschen",
"desc": "Sind Sie sicher, dass Sie diesen Postfachordner löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"warningTitle": "Warnung",
"warningDesc": "Das Löschen dieses Ordners entfernt auch dauerhaft alle darin enthaltenen archivierten E-Mails und Unterordner.",
"confirm": "Dauerhaft löschen",
"successTitle": "Erfolgreich gelöscht",
"successDesc": "Der Postfachordner und sein Inhalt wurden erfolgreich entfernt.",
"errorTitle": "Löschen fehlgeschlagen"
},
"title": "Postfach",
"folders": "Ordner",
"messages": "Nachrichten",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Enable this option only if you are connecting to an IMAP server with a public or self-signed certificate that may not be recognized by your system. Using this setting bypasses standard certificate validation, which can expose you to man-in-the-middle attacks. Only enable if you understand the risks."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Delete Mailbox Folder",
"desc": "Are you sure you want to delete this mailbox folder? This action cannot be undone.",
"warningTitle": "Warning",
"warningDesc": "Deleting this folder will also permanently remove all archived emails and subfolders contained within it.",
"confirm": "Delete Permanently",
"successTitle": "Deleted successfully",
"successDesc": "The mailbox folder and its contents have been successfully removed.",
"errorTitle": "Delete failed"
},
"title": "Mailbox",
"folders": "Folders",
"messages": "Messages",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Activa esta opción solo si te estás conectando a un servidor IMAP que utiliza un certificado público o autofirmado, el cual puede no ser reconocido por tu sistema. Esta opción omite la validación estándar del certificado y puede exponerte a ataques de tipo “maninthemiddle” — actívala solo si entiendes los riesgos."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Eliminar carpeta de correo",
"desc": "¿Está seguro de que desea eliminar esta carpeta de correo? Esta acción no se puede deshacer.",
"warningTitle": "Advertencia",
"warningDesc": "Eliminar esta carpeta también eliminará permanentemente todos los correos electrónicos archivados y las subcarpetas que contenga.",
"confirm": "Eliminar permanentemente",
"successTitle": "Eliminado con éxito",
"successDesc": "La carpeta de correo y su contenido han sido eliminados correctamente.",
"errorTitle": "Error al eliminar"
},
"title": "Buzón",
"folders": "Carpetas",
"messages": "Mensajes",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Ota tämä vaihtoehto käyttöön vain, jos IMAP-palvelin käyttää julkista CA:ta tai itse allekirjoitettua sertifikaattia, jonka järjestelmä ei tunnista. Tämä ohittaa normaalin sertifikaattitarkistuksen, ja voi altistaa Man-in-the-Middle -hyökkäyksille. Käytä vain, jos ymmärrät riskin."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Poista postilaatikon kansio",
"desc": "Oletko varma, että haluat poistaa tämän postilaatikon kansion? Tätä toimintoa ei voi peruuttaa.",
"warningTitle": "Varoitus",
"warningDesc": "Tämän kansion poistaminen poistaa pysyvästi myös kaikki sen sisältämät arkistoidut sähköpostit ja alikansiot.",
"confirm": "Poista pysyvästi",
"successTitle": "Poisto onnistui",
"successDesc": "Postilaatikon kansio ja sen sisältö on poistettu onnistuneesti.",
"errorTitle": "Poisto epäonnistui"
},
"title": "Sähköposti",
"folders": "Kansiot",
"messages": "Viestit",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Activez cette option seulement si vous vous connectez à un serveur IMAP utilisant un certificat public ou autosigné que votre système pourrait ne pas reconnaître. Cette option contourne la vérification standard des certificats, ce qui peut vous exposer à des attaques de type hommedumilieu — nactivez que si vous comprenez les risques."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Supprimer le dossier de messagerie",
"desc": "Êtes-vous sûr de vouloir supprimer ce dossier de messagerie ? Cette action est irréversible.",
"warningTitle": "Avertissement",
"warningDesc": "La suppression de ce dossier supprimera également de façon permanente tous les e-mails archivés et sous-dossiers qu'il contient.",
"confirm": "Supprimer définitivement",
"successTitle": "Suppression réussie",
"successDesc": "Le dossier de messagerie et son contenu ont été supprimés avec succès.",
"errorTitle": "Échec de la suppression"
},
"title": "Boîte aux lettres",
"folders": "Dossiers",
"messages": "Messages",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Abilita questa opzione solo se ti connetti a un server IMAP che utilizza un certificato pubblico o autofirmato che il tuo sistema potrebbe non riconoscere. Questa impostazione salta la verifica standard del certificato e può esporre la connessione ad attacchi “maninthemiddle” — attivala solo se comprendi i rischi."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Elimina cartella casella postale",
"desc": "Sei sicuro di voler eliminare questa cartella? L'azione non può essere annullata.",
"warningTitle": "Avvertimento",
"warningDesc": "L'eliminazione di questa cartella rimuoverà permanentemente anche tutte le e-mail archiviate e le sottocartelle in essa contenute.",
"confirm": "Elimina permanentemente",
"successTitle": "Eliminazione completata",
"successDesc": "La cartella e il suo contenuto sono stati rimossi con successo.",
"errorTitle": "Eliminazione fallita"
},
"title": "Posta in arrivo",
"folders": "Cartelle",
"messages": "Messaggi",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "このオプションを有効にすると、公開 CA または自己署名証明書を使用している IMAP サーバーに対して、システムが証明書を認識していない場合でも接続できます。ただし、標準の証明書検証をバイパスするため、中間者攻撃 (MITM) のリスクがあり — リスクを理解した上でのみ有効にしてください。"
},
"mailbox": {
"deleteMailboxDialog": {
"title": "メールボックスフォルダの削除",
"desc": "このメールボックスフォルダを削除してもよろしいですか?この操作は取り消せません。",
"warningTitle": "警告",
"warningDesc": "このフォルダを削除すると、その中に含まれるすべてのアーカイブメールとサブフォルダも永久に削除されます。",
"confirm": "永久に削除",
"successTitle": "削除完了",
"successDesc": "メールボックスフォルダとその内容が正常に削除されました。",
"errorTitle": "削除失敗"
},
"title": "メールボックス",
"folders": "フォルダー",
"messages": "メッセージ",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "공개 CA 인증서 또는 자체 서명 인증서를 사용하는 IMAP 서버에 연결할 때, 시스템에서 인증서를 신뢰하지 않아도 이 옵션을 켜면 무시할 수 있습니다. 하지만 표준 인증서 검증을 무시하기 때문에 중간자 공격에 노출될 수 있습니다 — 위험을 이해한 경우에만 사용하세요"
},
"mailbox": {
"deleteMailboxDialog": {
"title": "메일함 폴더 삭제",
"desc": "이 메일함 폴더를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
"warningTitle": "경고",
"warningDesc": "이 폴더를 삭제하면 그 안에 포함된 모든 아카이브된 이메일과 하위 폴더도 영구적으로 삭제됩니다.",
"confirm": "영구 삭제",
"successTitle": "삭제 성공",
"successDesc": "메일함 폴더와 그 내용이 성공적으로 제거되었습니다.",
"errorTitle": "삭제 실패"
},
"title": "받은 편지함",
"folders": "폴더",
"messages": "메시지",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Schakel deze optie alleen in als je verbinding maakt met een IMAPserver die een openbaar CA of een selfsigned certificaat gebruikt dat door je systeem mogelijk niet wordt vertrouwd. Deze instelling omzeilt standaard certificaatverificatie en kan je blootstellen aan maninthemiddleaanvallen — activeer alleen als je de risicos begrijpt."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Postvakmap verwijderen",
"desc": "Weet u zeker dat u deze postvakmap wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.",
"warningTitle": "Waarschuwing",
"warningDesc": "Het verwijderen van deze map zal ook permanent alle gearchiveerde e-mails und submappen erin verwijderen.",
"confirm": "Permanent verwijderen",
"successTitle": "Succesvol verwijderd",
"successDesc": "De postvakmap en de inhoud ervan zijn succesvol verwijderd.",
"errorTitle": "Verwijderen mislukt"
},
"title": "Postvak In",
"folders": "Mappen",
"messages": "Berichten",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Aktiver dette alternativet kun hvis IMAPserveren bruker et offentlig CAsertifikat eller et selvsignert sertifikat som systemet ditt ikke gjenkjenner. Innstillingen hopper over vanlig sertifikatvalidering, noe som kan utsette deg for maninthemiddleangrep bruk kun hvis du forstår risikoen."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Slett postkassemappe",
"desc": "Er du sikker på at du vil slette denne postkassemappen? Denne handlingen kan ikke angres.",
"warningTitle": "Advarsel",
"warningDesc": "Sletting av denne mappen vil også fjerne alle arkiverte e-poster og undermapper i den permanent.",
"confirm": "Slett permanent",
"successTitle": "Sletting fullført",
"successDesc": "Postkassemappen og innholdet er fjernet.",
"errorTitle": "Sletting mislyktes"
},
"title": "Postkasse",
"folders": "Mapper",
"messages": "Meldinger",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Włącz tę opcję tylko wtedy, gdy łączysz się z serwerem IMAP z certyfikatem publicznym lub samopodpisanym, który może nie być rozpoznawany przez Twój system. Użycie tego ustawienia pomija standardową walidację certyfikatu, co może narażać na ataki typu man-in-the-middle. Włącz tę opcję tylko wtedy, gdy rozumiesz związane z tym ryzyko."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Usuń folder skrzynki",
"desc": "Czy na pewno chcesz usunąć ten folder skrzynki? Tej operacji nie można cofnąć.",
"warningTitle": "Ostrzeżenie",
"warningDesc": "Usunięcie tego folderu spowoduje również trwałe usunięcie wszystkich zarchiwizowanych wiadomości e-mail i podfolderów w nim zawartych.",
"confirm": "Usuń na stałe",
"successTitle": "Usunięto pomyślnie",
"successDesc": "Folder skrzynki i jego zawartość zostały pomyślnie usunięte.",
"errorTitle": "Błąd usuwania"
},
"title": "Skrzynka pocztowa",
"folders": "Foldery",
"messages": "Wiadomości",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Ative esta opção apenas se estiver a conectar a um servidor IMAP que use um certificado público ou autoassinado que o seu sistema possa não reconhecer. Esta opção ignora a verificação normal de certificados e pode expor a ligação a ataques maninthemiddle — ative apenas se compreender os riscos."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Excluir pasta de correio",
"desc": "Tem certeza de que deseja excluir esta pasta de correio? Esta ação não pode ser desfeita.",
"warningTitle": "Aviso",
"warningDesc": "A exclusão desta pasta também removerá permanentemente todos os e-mails arquivados e subpastas nela contidos.",
"confirm": "Excluir permanentemente",
"successTitle": "Excluído com sucesso",
"successDesc": "A pasta de correio e seu conteúdo foram removidos com sucesso.",
"errorTitle": "Falha ao excluir"
},
"title": "Caixa de Entrada",
"folders": "Pastas",
"messages": "Mensagens",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Включите этот параметр только если IMAP‑сервер использует публичный CA‑сертификат или самоподписанный сертификат, который система может не распознавать. Это отключает стандартную проверку сертификатов и может подвергнуть соединение атакам «человек‑посередине» — активируйте только если вы понимаете риски."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Удалить папку почтового ящика",
"desc": "Вы уверены, что хотите удалить эту папку? Это действие невозможно отменить.",
"warningTitle": "Предупреждение",
"warningDesc": "Удаление этой папки также навсегда удалит все заархивированные электронные письма и подпапки, содержащиеся в ней.",
"confirm": "Удалить навсегда",
"successTitle": "Успешно удалено",
"successDesc": "Папка почтового ящика и ее содержимое были успешно удалены.",
"errorTitle": "Ошибка удаления"
},
"title": "Почтовый ящик",
"folders": "Папки",
"messages": "Сообщения",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "Aktivera detta alternativ endast om IMAPservern använder ett offentligt eller självsignerat certifikat som inte är betrott av ditt system. Denna inställning kringgår standardverifiering av certifikat, vilket kan utsätta dig för manimittenattacker — slå på endast om du förstår riskerna."
},
"mailbox": {
"deleteMailboxDialog": {
"title": "Ta bort brevlådemapp",
"desc": "Är du säker på att du vill ta bort den här mappen? Denna åtgärd kan inte ångras.",
"warningTitle": "Varning",
"warningDesc": "Om du tar bort den här mappen raderas även alla arkiverade e-postmeddelanden och undermappar i den permanent.",
"confirm": "Ta bort permanent",
"successTitle": "Borttagen",
"successDesc": "Brevlådemappen och dess innehåll har raderats.",
"errorTitle": "Kunde inte ta bort"
},
"title": "Brevlåda",
"folders": "Mappar",
"messages": "Meddelanden",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "僅當你連線的 IMAP 伺服器使用公開根憑證或自簽憑證,且系統無法驗證該憑證時才啟用此選項。本選項會略過標準憑證驗證流程,可能導致中間人攻擊等安全風險 — 請確認你了解並接受這些風險後再啟用。"
},
"mailbox": {
"deleteMailboxDialog": {
"title": "刪除郵箱資料夾",
"desc": "您確定要刪除此郵箱資料夾嗎?此操作無法撤銷。",
"warningTitle": "警告",
"warningDesc": "刪除此資料夾將永久移除其中包含的所有歸檔郵件及子資料夾。",
"confirm": "永久刪除",
"successTitle": "刪除成功",
"successDesc": "郵箱資料夾及其內容已被成功移除。",
"errorTitle": "刪除失敗"
},
"title": "信箱",
"folders": "資料夾",
"messages": "訊息",
+10
View File
@@ -358,6 +358,16 @@
"useDangerousDescription": "如果你连接的 IMAP 服务器使用公开 CA 或者自签证书,而系统不认可该证书时,启用此选项可绕过标准证书校验。但请注意,这样可能使你的连接容易受到中间人攻击 —— 仅当你完全理解风险时才启用。"
},
"mailbox": {
"deleteMailboxDialog": {
"title": "删除邮箱文件夹",
"desc": "您确定要删除此邮箱文件夹吗?此操作无法撤销。",
"warningTitle": "警告",
"warningDesc": "删除此文件夹将永久移除其中包含的所有归档邮件及子文件夹。",
"confirm": "永久删除",
"successTitle": "删除成功",
"successDesc": "邮箱文件夹及其内容已被成功移除。",
"errorTitle": "删除失败"
},
"title": "邮箱",
"folders": "文件夹",
"messages": "消息",