Files
LambdaMail/services/webmail/messages/es.json
T
Lucas RayanandClaude Opus 5 d8e2de2e11 #24: deliver what the composer wrote, keep a copy, and store drafts
Four faults, all in the path between the compose screen and the mailbox.

**Every message sent from the webmail had an empty body.** The HTTP handler
read a field named "body"; the composer has always sent "html". The two never
matched, so the payload handed to the queue contained headers and nothing
else. The handler now reads html and text, and still accepts body so an older
client is not broken. Sending was otherwise working, which is why this went
unnoticed: the mail left, it just said nothing.

**Bcc was discarded.** The field was absent from the request struct and from
ComposeInput, so a blind copy typed into the webmail reached nobody. It now
joins the envelope recipients and is deliberately kept out of the headers,
which is what makes it blind.

**HTML was labelled text/plain.** Even once the body was carried, the composer
produces markup and the message declared text/plain, so a recipient would see
raw tags. Messages with HTML now go out as multipart/alternative with a
plain-text part derived from the markup and ordered first per RFC 2046 5.1.4.
An empty or missing text alternative is itself a spam signal.

**Sent mail left no trace.** Nothing wrote to the Sent folder, so a delivered
message vanished from the sender's view entirely. A copy is now filed after
the message is durably queued - not before, or a send refused by the rate
limit would still leave a copy - reusing the inbound persistence path so it
gets a real IMAP UID and appears over IMAP too. A failure to file is logged
and swallowed: the mail is already on its way, and reporting failure would
invite the user to send it twice.

**Drafts were never saved.** There was no endpoint at all. The composer showed
"draft saved automatically" from a setTimeout with no request behind it, so
closing the tab lost the message the screen had just promised was safe. Adds
POST /api/v1/mail/draft, storing the draft as a whole RFC 5322 message in the
Drafts folder, and debounces the composer onto it.

The composer also navigated to Sent whether or not the send succeeded, which
is how a rejected message disappears silently. It now reports the error and
stays put.

**Delay notifications were being filed as spam.** A DSN this server writes is
injected through the same inbound path as mail from the internet, but without
a client IP - so SPF can only be "none" - and its bounce-shaped content scores
highly. The warning telling you your mail was delayed landed in your own Junk
folder. Messages the server generates itself now skip content scanning; the
exemption is narrow, and a test covers that ordinary mail is still scanned so
this cannot become a way past the filter. The DSN also declared
Auto-Submitted: auto-replied, which belongs to vacation responders; a delivery
report is auto-generated (RFC 3834 section 5), and filters read that header.

Not fixed here, because it is not a code fault: outbound port 25 is blocked by
the provider, which is what the delay notification was reporting
("i/o timeout" to Google's MX - a timeout, not a refusal, is the signature of
a block). Receiving is unaffected and queued mail keeps retrying. Documented
with the two ways out, including the relay path, which is verified working
code rather than another stub.

Verified: 22 Go packages pass, 5 new compose tests and 3 for the DSN handling.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 19:56:59 -03:00

289 lines
12 KiB
JSON

{
"admin": {
"addAlias": "Añadir apelido",
"aliasesTitle": "Alias",
"auditLog": "Registro de auditoría",
"backToWebmail": "Volver al webmail",
"cancelJob": "Cancelar",
"certificateState": "Certificado",
"checksPassed": "{passed} de {total} aprobadas",
"createAccount": "Crear cuenta",
"createAlias": "Crear un alias de enrutamiento",
"csvPreview": "Vista previa",
"dashboardSubtitle": "Cifras en vivo leídas de la base de datos.",
"dashboardTitle": "Resumen",
"dkimAlgorithm": "Tipo de clave",
"dkimOverlap": "Ambas claves firman el correo saliente durante {days} días para que nada falle mientras el DNS se propaga.",
"dkimPublishRecord": "Publique este registro en DNS:",
"dkimRotate": "Generar una nueva clave",
"dkimSelector": "Selector",
"dkimTitle": "Rotación de clave DKIM",
"dmarcSubtitle": "Desglose de los informes XML agregados procesados.",
"dmarcTitle": "Informes DMARC",
"dnsRecordsFor": "Registros DNS de {domain}",
"dnsStatusDrift": "Divergente",
"dnsStatusPartial": "Parcial",
"dnsStatusVerified": "Verificado",
"domainName": "Nombre del dominio",
"domainsTitle": "Dominios",
"expiresInDays": "Caduca en {days} días",
"freezeDomain": "Congelar dominio",
"greylistScore": "Puntuación de greylist",
"headerScore": "Puntuación de etiquetado de cabecera",
"jobCancelled": "El trabajo {id} fue cancelado.",
"jobRetried": "El trabajo {id} se volvió a poner en cola para otro intento.",
"lastChecked": "Última comprobación: {when}",
"lastReload": "Última recarga",
"mailHost": "Host de correo",
"mailboxCount": "{count} buzones",
"mailboxesSubtitle": "Cuentas, alias, importación CSV y la política de segundo factor.",
"mailboxesTitle": "Buzones",
"mfaAdmins": "Obligatorio para administradores",
"mfaEveryone": "Obligatorio para todos",
"mfaOptional": "Opcional",
"mfaPolicyIntro": "Elija con qué rigor este dominio exige un segundo factor.",
"mfaPolicyTitle": "Requisito de segundo factor",
"noCertificate": "No hay certificado cargado para este host.",
"noChecks": "No se informaron verificaciones.",
"noDomains": "Aún no se ha dado de alta ningún dominio.",
"onboardIntro": "Crea el dominio y sus alias estándar RFC 2142, apuntados a su dirección.",
"onboardTitle": "Añadir un dominio",
"openAdmin": "Consola de administración",
"preflightTitle": "Verificaciones de preparación",
"queueEmpty": "La cola de salida está vacía.",
"queueSubtitle": "Inspeccione la cola de salida, reintente un trabajo o cancele uno.",
"queueTitle": "Cola de salida",
"readinessIntro": "Verificaciones que el servidor informa sobre sí mismo antes de transportar correo en producción.",
"reconcileDns": "Reconciliar DNS",
"reconcileNotImplemented": "La verificación de registros DNS individuales aún no está implementada: esto registra la solicitud y relee el estado almacenado, no consulta un resolutor.",
"rejectScore": "Puntuación de rechazo",
"retryJob": "Reintentar",
"rspamdIntro": "Puntuaciones que activan greylisting, etiquetado de cabecera y rechazo.",
"rspamdSaved": "Umbrales guardados.",
"saveThresholds": "Guardar umbrales",
"securitySubtitle": "Verificaciones de preparación, estado TLS, umbrales de spam y el registro de auditoría.",
"securityTitle": "Seguridad",
"tabAudit": "Registro de auditoría",
"tabReadiness": "Preparación",
"tabRspamd": "Umbrales de spam",
"tabTls": "TLS",
"tlsMode": "Modo TLS",
"tlsTitle": "Certificado y transporte",
"traceNoResults": "No se encontró rastro para ese ID de cola.",
"tracePlaceholder": "ID de la cola",
"traceTitle": "Rastrear un mensaje",
"unknownSni": "Solicitudes SNI desconocidas",
"watcherHealthy": "Monitor de certificado"
},
"auth": {
"adminLoginTitle": "Consola de administración",
"adminStepUpNote": "La consola de administración vuelve a pedir su segundo factor, aunque ya haya iniciado sesión en el webmail.",
"authFailed": "Fallo en la autenticación",
"cantScanQr": "¿No puede escanear? Introduzca esta clave manualmente:",
"emailLabel": "Dirección de correo",
"enrolmentFailed": "No se pudo iniciar la configuración del segundo factor",
"enrolmentIntro": "La consola de administración requiere un segundo factor. Configure uno ahora para continuar.",
"genericError": "Algo salió mal",
"invalidCredentials": "Correo o contraseña inválidos",
"mfaRequired": "Introduzca el código de seis dígitos de su aplicación de autenticación.",
"passwordLabel": "Contraseña",
"qrCodeAlt": "Código QR para configurar la verificación en dos pasos",
"scanQr": "Escanee este código con Google Authenticator, Aegis, Authy o 1Password.",
"signInButton": "Iniciar sesión",
"signOutOfAdmin": "Salir de administración",
"totpCodeLabel": "Código de autenticación",
"userLoginTitle": "Acceda a su buzón",
"verificationFailed": "Fallo en la verificación",
"verifyCodeButton": "Verificar código"
},
"common": {
"actions": "Acciones",
"add": "Añadir",
"adminPortal": "Administración",
"appName": "LambdaMail",
"back": "Volver",
"cancel": "Cancelar",
"confirm": "Confirmar",
"continue": "Continuar",
"copied": "Copiado",
"copy": "Copiar",
"delete": "Eliminar",
"loading": "Cargando...",
"logout": "Cerrar sesión",
"never": "Nunca",
"none": "Ninguno",
"refresh": "Actualizar",
"retry": "Reintentar",
"save": "Guardar",
"search": "Buscar",
"status": "Estado",
"unavailable": "No disponible",
"userPortal": "Webmail"
},
"errors": {
"forbidden": "No tiene acceso a esto",
"loadFailed": "No se pudieron cargar los datos",
"serverError": "Algo salió mal en el servidor",
"unauthorized": "Inicie sesión de nuevo"
},
"mail": {
"addFiles": "Añadir archivos...",
"allMessages": "Todas",
"archive": "Archivo",
"attachments": "Adjuntos ({count})",
"attachmentsFilter": "Con adjuntos",
"attachmentsUnsupported": "Los adjuntos se listan solo por nombre; la subida de archivos aún no está implementada.",
"backToList": "Volver a la lista de mensajes",
"bold": "Negrita",
"bulletList": "Lista con viñetas",
"compose": "Redactar",
"discard": "Descartar",
"draftSaveFailed": "No se pudo guardar el borrador",
"draftSaved": "Borrador guardado automáticamente",
"draftSaving": "Guardando borrador...",
"drafts": "Borradores",
"forward": "Reenviar",
"hideCcBcc": "- Ocultar Cc/Cco",
"inbox": "Bandeja de entrada",
"insertLink": "Insertar enlace",
"insertUrl": "Introduzca la URL:",
"italic": "Cursiva",
"junk": "Spam",
"loadImages": "Cargar imágenes",
"noMessages": "Sin mensajes",
"numberedList": "Lista numerada",
"reply": "Responder",
"sendMessage": "Enviar mensaje",
"sending": "Enviando...",
"sent": "Enviados",
"showCcBcc": "+ Añadir Cc/Cco",
"strikethrough": "Tachado",
"trash": "Papelera",
"underline": "Subrayado",
"undoSend": "Enviando en {seconds}s",
"undoSendAction": "Deshacer",
"unreadCount": "{count} sin leer",
"unreadFilter": "Sin leer"
},
"settings": {
"actionDiscard": "Descartar",
"actionFlag": "Marcar mensaje",
"actionMove": "Mover al Archivo",
"addRule": "Añadir regla",
"appPasswordPlaceholder": "Thunderbird / Outlook Mobile",
"appPasswords": "Contraseñas de aplicación",
"autoReplySaveFailed": "No se pudo guardar la respuesta automática",
"enableMfa": "Activar verificación en dos pasos",
"fieldFrom": "De",
"fieldHeader": "Cabecera",
"fieldSubject": "Asunto",
"generateAppPassword": "Generar",
"langEn": "English",
"langEs": "Español",
"langPtBR": "Português (Brasil)",
"language": "Idioma",
"matchContains": "contiene",
"matchEquals": "es exactamente",
"matchRegex": "coincide con regex",
"mfaDisabled": "Desactivada",
"mfaEnabled": "Activada",
"mfaStatus": "Estado de la verificación en dos pasos",
"recoveryCodesTitle": "Códigos de recuperación",
"ruleIf": "SI",
"ruleThen": "ENTONCES",
"saveAutoReply": "Guardar respuesta automática",
"saveRecoveryCodes": "Guárdelos en un lugar seguro. Cada uno funciona una sola vez y solo se muestran ahora.",
"security": "Seguridad",
"sessions": "Sesiones",
"settingsSaved": "Configuración guardada.",
"sieveIntro": "Reglas que organizan el correo entrante automáticamente.",
"sieveTitle": "Filtros (Sieve)",
"signOut": "Cerrar sesión",
"signatureIntro": "Se añade automáticamente a los mensajes que redacta.",
"signaturePlaceholder": "Saludos cordiales,\nSu nombre\nSu cargo",
"signatureSaveFailed": "No se pudo guardar la firma",
"signatureSaved": "Firma guardada.",
"signatureTitle": "Firma de correo",
"sixDigitCode": "Código de seis dígitos",
"subtitle": "Verificación en dos pasos, filtros, respuesta automática y su firma.",
"title": "Configuración",
"twoFactorIntro": "Proteja su cuenta con Google Authenticator, Aegis, Authy o 1Password.",
"vacationBodyLabel": "Mensaje de la respuesta",
"vacationDefaultBody": "Gracias por su mensaje. Estoy ausente en este momento y responderé a mi regreso.",
"vacationDefaultSubject": "Fuera de la oficina",
"vacationIntro": "Responde automáticamente al correo entrante mientras esté ausente.",
"vacationSubjectLabel": "Asunto de la respuesta",
"vacationTitle": "Respuesta automática de ausencia",
"valuePlaceholder": "Valor a coincidir..."
},
"ui": {
"accountStatus": "Estado de la cuenta",
"actions": "Acciones",
"active": "Activo",
"activeSessions": "Sesiones activas",
"actor": "Autor",
"actualRecord": "Valor actual",
"allChecksPassed": "Todas las verificaciones pasaron",
"appPasswordGenerated": "Contraseña de aplicación generada",
"appPasswordsSection": "Contraseñas de aplicación",
"attempts": "Intentos",
"bounceRate": "Tasa de rebote",
"changePassword": "Cambiar contraseña",
"clientIp": "IP del cliente",
"copyPasswordNow": "Cópiela ahora. No se mostrará de nuevo.",
"coreInfra": "Servicios principales",
"currentPassword": "Contraseña actual",
"currentSession": "Este dispositivo",
"daneVerified": "DANE verificado",
"destination": "Destino",
"diskUsed": "Almacenamiento usado",
"dkimAlignment": "Alineación DKIM",
"dkimResult": "DKIM",
"dmarcEnforcement": "Política DMARC",
"domainVerification": "Verificación de dominio",
"domainsVerified": "Dominios verificados",
"emailAddress": "Dirección de correo",
"eventAction": "Acción",
"expectedValue": "Valor esperado",
"healthy": "Correcto",
"imapEngine": "Servicio IMAP",
"inboundVolume": "Recibidas (24h)",
"jobId": "Trabajo",
"lastError": "Último error",
"liveMetrics": "Métricas en vivo",
"localDisk": "Disco local",
"mailboxesActive": "Buzones activos",
"messageBody": "Mensaje",
"messageVolume": "Mensajes",
"newPassword": "Nueva contraseña",
"noAppPasswords": "Aún no hay contraseñas de aplicación.",
"noData": "Aún sin datos",
"online": "En línea",
"outboundDelivered": "Enviadas (24h)",
"passwordChanged": "Contraseña cambiada.",
"postgresRunner": "Cola basada en Postgres",
"preflightTitle": "Preparación",
"provisionMailbox": "Crear buzón",
"queueDepth": "Tamaño de la cola",
"recipient": "Destinatario",
"recordName": "Registro",
"reportingOrg": "Organización informante",
"scanners": "Análisis de spam y virus",
"sender": "Remitente",
"signOutOthers": "Cerrar sesión en otros dispositivos",
"smtpListener": "Servicio SMTP",
"sourceIp": "IP de origen",
"spfRatio": "Tasa de aprobación SPF",
"spfResult": "SPF",
"storageQuota": "Cuota de almacenamiento",
"subject": "Asunto",
"targetObject": "Objetivo",
"timestamp": "Hora",
"toRecipients": "Para",
"toggleMenu": "Alternar menú",
"totalEvaluated": "Mensajes evaluados",
"twoFactorSection": "Verificación en dos pasos",
"watching": "Vigilando"
}
}