#23: show real data, unify the surfaces and make enrolment scannable
The interface was reporting things that were not true. Several screens were
mockups wired to nothing, and a reader with the console in Portuguese was
served a mixture of two languages.
Fabricated data, removed:
- The outbound queue was two invented jobs held in component state. Retry and
Freeze only edited that local array, so the screen showed the same two rows
on every deployment and reported success for actions that never happened.
"Freeze" named an operation the backend has never implemented. It now reads
/api/v1/admin/queue, which was already serving the real thing, and offers
retry and cancel, which exist.
- Every dashboard KPI fell back to an invented constant (1420 received, 890
sent, 3 queued, 18.4% disk), so an unreachable API produced a dashboard of
plausible traffic for a server that might have delivered nothing. Two of
those fields were never returned by the endpoint at all, so the fake disk
figure was what everyone always saw. DMARC did the same with 1250/98%/97%.
- The domains screen showed thirteen DNS records for example.com, all marked
VERIFIED, and posted {domain_id: "default-domain"} to endpoints expecting a
real id. DKIM rotation sends "domain", not "domain_id", so its 400 was
swallowed and a made-up TXT record displayed as though a key had been
issued: rotation had never once worked from this screen.
- The TLS panel asserted a Let's Encrypt RSA 4096 certificate and verified
DANE from static markup, on a deployment currently serving a self-signed
one. It now reads the cert watcher via /api/v1/admin/tls.
- The readiness scorecard printed "10 / 10 all checks passed" regardless of
what preflight reported, including failures.
- A message trace that found nothing invented a five-step delivery - TLS 1.3
accepted, SPF pass, spam score 0.8 - for a message that does not exist.
- Both sidebars showed a fixed admin@lambdamail.local with a hardcoded
"SUPER_ADMIN (2FA)", claiming a second factor whether or not one existed.
- Settings seeded a "[Boletim]" Sieve rule. Saving posts the whole list, so
the first edit wrote that invented filter into the account's real script.
The reconcile endpoint itself answered {records_verified: 13, status:
"VERIFIED"} for any domain id, including one that does not exist, without
resolving a name. It now reports what it does, which is record the request.
Surfaces:
The root was a chooser listing webmail and the console side by side, which
asked visitors a question they should not have to answer and advertised cookie
names and audiences to anonymous readers. It now redirects into the mail
client. Accounts that may administer the server get a link to the console from
inside the app - a link to /admin/login, so crossing over still costs the
second factor the admin audience requires - and the console gets a plain link
back, since the webmail session was never given up to get there.
Enrolment:
Both enrolment screens printed the base32 secret as text and left the operator
to type 32 characters into their phone. The enrol endpoint already returned an
otpauth:// URI; it simply was not drawn. Added a shared component that renders
it as a QR locally - the seed is already in the page, and sending it to an
image service would put it in another request log for nothing.
The recovery-code step rendered its own "sign in" button while the form's
submit button stayed visible below it: two identical buttons, and no way to
copy the codes it insisted you save. It is now terminal, with copy and
continue.
Language:
translate() had no interpolation, so "Undo Send ({seconds}s remaining)" showed
the placeholder and a second hardcoded countdown was appended after it. It now
substitutes, leaving an unmatched token visible rather than blanking it.
The pt-BR bundle had lost its diacritics - "Destinatario", "Ultimo erro",
"Acoes" - from the ASCII-source rule being applied to the translations, which
are data. Restored, and the three bundles are back in key parity at 270 each,
with roughly 120 strings that were hardcoded in the source now keyed.
Healthchecks:
web had none, despite being the only service users reach directly: a wedged
Next process kept its container running and Traefik kept routing to it. Added,
using node's own fetch since the image ships no curl. rspamd and clamav gained
the timeouts and start_periods whose absence would fail them during startup.
migrate stays without one and says why: it is a one-shot job, and a probe
would report unhealthy exactly when it has succeeded.
Verified: 36 webmail tests and 41 auth tests against a real Postgres, both new
admin/me cases confirmed to fail without the route (404). lang-lint clean,
production build clean, 0 vulnerabilities, compose validates.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f7e93275d5
commit
ee240ae227
29 files changed
+2201
-1221
No files matched your search
+271
-133
@@ -1,148 +1,286 @@
|
||||
{
|
||||
"common": {
|
||||
"appName": "LambdaMail",
|
||||
"userPortal": "Webmail",
|
||||
"adminPortal": "Management Console",
|
||||
"loading": "Loading...",
|
||||
"save": "Save Changes",
|
||||
"cancel": "Cancel",
|
||||
"delete": "Delete",
|
||||
"confirm": "Confirm",
|
||||
"search": "Search",
|
||||
"status": "Status",
|
||||
"actions": "Actions",
|
||||
"refresh": "Refresh",
|
||||
"logout": "Log Out"
|
||||
"admin": {
|
||||
"addAlias": "Add alias",
|
||||
"aliasesTitle": "Aliases",
|
||||
"auditLog": "Audit log",
|
||||
"backToWebmail": "Back to webmail",
|
||||
"cancelJob": "Cancel",
|
||||
"certificateState": "Certificate",
|
||||
"checksPassed": "{passed} of {total} passed",
|
||||
"createAccount": "Create account",
|
||||
"createAlias": "Create a routing alias",
|
||||
"csvPreview": "Preview",
|
||||
"dashboardSubtitle": "Live figures read from the database.",
|
||||
"dashboardTitle": "Overview",
|
||||
"dkimAlgorithm": "Key type",
|
||||
"dkimOverlap": "Both keys sign outbound mail for {days} days so nothing fails while DNS propagates.",
|
||||
"dkimPublishRecord": "Publish this record in DNS:",
|
||||
"dkimRotate": "Generate a new key",
|
||||
"dkimSelector": "Selector",
|
||||
"dkimTitle": "DKIM key rotation",
|
||||
"dmarcSubtitle": "Breakdown of the aggregate XML reports that have been ingested.",
|
||||
"dmarcTitle": "DMARC reports",
|
||||
"dnsRecordsFor": "DNS records for {domain}",
|
||||
"dnsStatusDrift": "Drift",
|
||||
"dnsStatusPartial": "Partial",
|
||||
"dnsStatusVerified": "Verified",
|
||||
"domainName": "Domain name",
|
||||
"domainsTitle": "Domains",
|
||||
"expiresInDays": "Expires in {days} days",
|
||||
"freezeDomain": "Freeze domain",
|
||||
"greylistScore": "Greylist score",
|
||||
"headerScore": "Header-tagging score",
|
||||
"jobCancelled": "Job {id} was cancelled.",
|
||||
"jobRetried": "Job {id} was queued for another attempt.",
|
||||
"lastChecked": "Last checked: {when}",
|
||||
"lastReload": "Last reload",
|
||||
"mailHost": "Mail host",
|
||||
"mailboxCount": "{count} mailboxes",
|
||||
"mailboxesSubtitle": "Accounts, aliases, CSV import and the second-factor policy.",
|
||||
"mailboxesTitle": "Mailboxes",
|
||||
"mfaAdmins": "Required for admins",
|
||||
"mfaEveryone": "Required for everyone",
|
||||
"mfaOptional": "Optional",
|
||||
"mfaPolicyIntro": "Choose how strictly this domain requires a second factor.",
|
||||
"mfaPolicyTitle": "Second-factor requirement",
|
||||
"noCertificate": "No certificate is loaded for this host.",
|
||||
"noChecks": "No checks reported.",
|
||||
"noDomains": "No domains have been onboarded yet.",
|
||||
"onboardIntro": "Creates the domain and its standard RFC 2142 aliases, pointed at your address.",
|
||||
"onboardTitle": "Add a domain",
|
||||
"openAdmin": "Admin console",
|
||||
"preflightTitle": "Readiness checks",
|
||||
"queueEmpty": "The outbound queue is empty.",
|
||||
"queueSubtitle": "Inspect the outbound queue, retry a job, or cancel one.",
|
||||
"queueTitle": "Outbound queue",
|
||||
"readinessIntro": "Checks the server reports about itself before it carries production mail.",
|
||||
"reconcileDns": "Reconcile DNS",
|
||||
"reconcileNotImplemented": "Per-record DNS verification is not implemented yet: this records the request and re-reads the stored status, it does not query a resolver.",
|
||||
"rejectScore": "Reject score",
|
||||
"retryJob": "Retry",
|
||||
"rspamdIntro": "Scores that trigger greylisting, header tagging and rejection.",
|
||||
"rspamdSaved": "Thresholds saved.",
|
||||
"saveThresholds": "Save thresholds",
|
||||
"securitySubtitle": "Readiness checks, TLS state, spam thresholds and the audit trail.",
|
||||
"securityTitle": "Security",
|
||||
"tabAudit": "Audit trail",
|
||||
"tabReadiness": "Readiness",
|
||||
"tabRspamd": "Spam thresholds",
|
||||
"tabTls": "TLS",
|
||||
"tlsMode": "TLS mode",
|
||||
"tlsTitle": "Certificate and transport",
|
||||
"traceNoResults": "No trace found for that queue ID.",
|
||||
"tracePlaceholder": "Queue ID",
|
||||
"traceTitle": "Trace a message",
|
||||
"unknownSni": "Unknown SNI requests",
|
||||
"watcherHealthy": "Certificate watcher"
|
||||
},
|
||||
"auth": {
|
||||
"userLoginTitle": "Webmail Sign In",
|
||||
"adminLoginTitle": "Admin Console Sign In",
|
||||
"emailLabel": "Email Address",
|
||||
"passwordLabel": "Password",
|
||||
"signInButton": "Sign In",
|
||||
"totpCodeLabel": "6-Digit Authenticator Code",
|
||||
"verifyCodeButton": "Verify Code",
|
||||
"adminLoginTitle": "Admin console",
|
||||
"adminStepUpNote": "The admin console asks for your second factor again, even though you are already signed in to webmail.",
|
||||
"authFailed": "Authentication failed",
|
||||
"cantScanQr": "Cannot scan? Enter this key manually:",
|
||||
"emailLabel": "Email address",
|
||||
"enrolmentFailed": "Could not start the second-factor setup",
|
||||
"enrolmentIntro": "The admin console requires a second factor. Set one up now to continue.",
|
||||
"genericError": "Something went wrong",
|
||||
"invalidCredentials": "Invalid email or password",
|
||||
"mfaRequired": "Two-factor authentication code required"
|
||||
"mfaRequired": "Enter the six-digit code from your authenticator app.",
|
||||
"passwordLabel": "Password",
|
||||
"qrCodeAlt": "QR code for two-factor setup",
|
||||
"scanQr": "Scan this code with Google Authenticator, Aegis, Authy or 1Password.",
|
||||
"signInButton": "Sign in",
|
||||
"signOutOfAdmin": "Leave admin",
|
||||
"totpCodeLabel": "Authentication code",
|
||||
"userLoginTitle": "Sign in to your mailbox",
|
||||
"verificationFailed": "Verification failed",
|
||||
"verifyCodeButton": "Verify code"
|
||||
},
|
||||
"mail": {
|
||||
"inbox": "Inbox",
|
||||
"sent": "Sent",
|
||||
"drafts": "Drafts",
|
||||
"trash": "Trash",
|
||||
"junk": "Spam",
|
||||
"archive": "Archive",
|
||||
"compose": "Compose Email",
|
||||
"noMessages": "No messages in this folder",
|
||||
"unreadCount": "{count, plural, =0 {No unread messages} one {# unread message} other {# unread messages}}",
|
||||
"loadImages": "Load Remote Images",
|
||||
"reply": "Reply",
|
||||
"forward": "Forward",
|
||||
"undoSend": "Undo Send ({seconds}s remaining)"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Account Settings",
|
||||
"security": "Security & 2FA",
|
||||
"appPasswords": "App Passwords",
|
||||
"sessions": "Active Sessions",
|
||||
"mfaStatus": "Two-Factor Authentication Status",
|
||||
"mfaEnabled": "2FA is Active",
|
||||
"mfaDisabled": "2FA is Disabled",
|
||||
"enableMfa": "Enable 2FA",
|
||||
"generateAppPassword": "Generate App Password",
|
||||
"recoveryCodesTitle": "Recovery Codes",
|
||||
"saveRecoveryCodes": "Save these recovery codes in a safe place. They will not be shown again.",
|
||||
"language": "Language",
|
||||
"signOut": "Sign out",
|
||||
"langEn": "English",
|
||||
"langPtBR": "Portuguese (Brazil)",
|
||||
"langEs": "Spanish"
|
||||
},
|
||||
"admin": {
|
||||
"dashboardTitle": "System Dashboard",
|
||||
"domainsTitle": "Domains & DNS (13 Records)",
|
||||
"mailboxesTitle": "Mailboxes & Accounts",
|
||||
"aliasesTitle": "Aliases & Routing",
|
||||
"queueTitle": "Outbound Delivery Queue",
|
||||
"dmarcTitle": "DMARC Analytics",
|
||||
"securityTitle": "Security & Audit Log",
|
||||
"preflightTitle": "Preflight Diagnostics",
|
||||
"reconcileDns": "Reconcile DNS Records",
|
||||
"dnsStatusVerified": "VERIFIED",
|
||||
"dnsStatusDrift": "DRIFT DETECTED",
|
||||
"dnsStatusPartial": "PARTIAL",
|
||||
"retryJob": "Retry Delivery",
|
||||
"cancelJob": "Cancel Job",
|
||||
"freezeDomain": "Freeze Destination"
|
||||
"common": {
|
||||
"actions": "Actions",
|
||||
"add": "Add",
|
||||
"adminPortal": "Admin",
|
||||
"appName": "LambdaMail",
|
||||
"back": "Back",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"continue": "Continue",
|
||||
"copied": "Copied",
|
||||
"copy": "Copy",
|
||||
"delete": "Delete",
|
||||
"loading": "Loading...",
|
||||
"logout": "Sign out",
|
||||
"never": "Never",
|
||||
"none": "None",
|
||||
"refresh": "Refresh",
|
||||
"retry": "Retry",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"status": "Status",
|
||||
"unavailable": "Unavailable",
|
||||
"userPortal": "Webmail"
|
||||
},
|
||||
"errors": {
|
||||
"unauthorized": "Session expired or unauthorized",
|
||||
"forbidden": "Access forbidden for this account surface",
|
||||
"serverError": "Internal server error occurred"
|
||||
"forbidden": "You do not have access to this",
|
||||
"loadFailed": "Could not load the data",
|
||||
"serverError": "Something went wrong on the server",
|
||||
"unauthorized": "Please sign in again"
|
||||
},
|
||||
"mail": {
|
||||
"addFiles": "Add files...",
|
||||
"allMessages": "All",
|
||||
"archive": "Archive",
|
||||
"attachments": "Attachments ({count})",
|
||||
"attachmentsFilter": "With attachments",
|
||||
"attachmentsUnsupported": "Attachments are listed by name only; file upload is not wired up yet.",
|
||||
"backToList": "Back to the message list",
|
||||
"bold": "Bold",
|
||||
"bulletList": "Bulleted list",
|
||||
"compose": "Compose",
|
||||
"discard": "Discard",
|
||||
"draftSaved": "Draft saved automatically",
|
||||
"drafts": "Drafts",
|
||||
"forward": "Forward",
|
||||
"hideCcBcc": "- Hide Cc/Bcc",
|
||||
"inbox": "Inbox",
|
||||
"insertLink": "Insert link",
|
||||
"insertUrl": "Enter the URL:",
|
||||
"italic": "Italic",
|
||||
"junk": "Spam",
|
||||
"loadImages": "Load images",
|
||||
"noMessages": "No messages",
|
||||
"numberedList": "Numbered list",
|
||||
"reply": "Reply",
|
||||
"sendMessage": "Send message",
|
||||
"sending": "Sending...",
|
||||
"sent": "Sent",
|
||||
"showCcBcc": "+ Add Cc/Bcc",
|
||||
"strikethrough": "Strikethrough",
|
||||
"trash": "Trash",
|
||||
"underline": "Underline",
|
||||
"undoSend": "Sending in {seconds}s",
|
||||
"undoSendAction": "Undo",
|
||||
"unreadCount": "{count} unread",
|
||||
"unreadFilter": "Unread"
|
||||
},
|
||||
"settings": {
|
||||
"actionDiscard": "Discard",
|
||||
"actionFlag": "Flag message",
|
||||
"actionMove": "Move to Archive",
|
||||
"addRule": "Add rule",
|
||||
"appPasswordPlaceholder": "Thunderbird / Outlook Mobile",
|
||||
"appPasswords": "App passwords",
|
||||
"autoReplySaveFailed": "Could not save the auto-reply",
|
||||
"enableMfa": "Enable two-factor",
|
||||
"fieldFrom": "From",
|
||||
"fieldHeader": "Header",
|
||||
"fieldSubject": "Subject",
|
||||
"generateAppPassword": "Generate",
|
||||
"langEn": "English",
|
||||
"langEs": "Español",
|
||||
"langPtBR": "Português (Brasil)",
|
||||
"language": "Language",
|
||||
"matchContains": "contains",
|
||||
"matchEquals": "is exactly",
|
||||
"matchRegex": "matches regex",
|
||||
"mfaDisabled": "Disabled",
|
||||
"mfaEnabled": "Enabled",
|
||||
"mfaStatus": "Two-factor status",
|
||||
"recoveryCodesTitle": "Recovery codes",
|
||||
"ruleIf": "IF",
|
||||
"ruleThen": "THEN",
|
||||
"saveAutoReply": "Save auto-reply",
|
||||
"saveRecoveryCodes": "Save these somewhere safe. Each one works once, and they are shown only now.",
|
||||
"security": "Security",
|
||||
"sessions": "Sessions",
|
||||
"settingsSaved": "Settings saved.",
|
||||
"sieveIntro": "Rules that sort incoming mail automatically.",
|
||||
"sieveTitle": "Filters (Sieve)",
|
||||
"signOut": "Sign out",
|
||||
"signatureIntro": "Appended automatically to the messages you compose.",
|
||||
"signaturePlaceholder": "Kind regards,\nYour name\nYour role",
|
||||
"signatureSaveFailed": "Could not save the signature",
|
||||
"signatureSaved": "Signature saved.",
|
||||
"signatureTitle": "Email signature",
|
||||
"sixDigitCode": "Six-digit code",
|
||||
"subtitle": "Two-factor authentication, filters, auto-reply and your signature.",
|
||||
"title": "Settings",
|
||||
"twoFactorIntro": "Protect your account with Google Authenticator, Aegis, Authy or 1Password.",
|
||||
"vacationBodyLabel": "Reply message",
|
||||
"vacationDefaultBody": "Thank you for your message. I am currently away and will reply when I return.",
|
||||
"vacationDefaultSubject": "Out of office",
|
||||
"vacationIntro": "Reply automatically to incoming mail while you are away.",
|
||||
"vacationSubjectLabel": "Reply subject",
|
||||
"vacationTitle": "Out-of-office auto-reply",
|
||||
"valuePlaceholder": "Value to match..."
|
||||
},
|
||||
"ui": {
|
||||
"accountStatus": "Account Status",
|
||||
"accountStatus": "Account status",
|
||||
"actions": "Actions",
|
||||
"active": "ACTIVE",
|
||||
"activeSessions": "Active Webmail Sessions",
|
||||
"actor": "Actor / Account",
|
||||
"actualRecord": "Actual DNS Record (Cloudflare)",
|
||||
"allChecksPassed": "ALL CHECKS PASSED",
|
||||
"appPasswordGenerated": "App Password Generated:",
|
||||
"appPasswordsSection": "App Passwords (IMAP / SMTP Clients)",
|
||||
"active": "Active",
|
||||
"activeSessions": "Active sessions",
|
||||
"actor": "Actor",
|
||||
"actualRecord": "Actual value",
|
||||
"allChecksPassed": "All checks passed",
|
||||
"appPasswordGenerated": "App password generated",
|
||||
"appPasswordsSection": "App passwords",
|
||||
"attempts": "Attempts",
|
||||
"clientIp": "Client IP",
|
||||
"copyPasswordNow": "Copy this password now. It will not be shown again.",
|
||||
"coreInfra": "Core Infrastructure Status",
|
||||
"currentSession": "Current Webmail Browser Session",
|
||||
"daneVerified": "DANE / MTA-STS verified",
|
||||
"destination": "Destination",
|
||||
"diskUsed": "Disk Capacity Used",
|
||||
"dkimResult": "DKIM Result",
|
||||
"dkimAlignment": "DKIM Signature Alignment",
|
||||
"dmarcEnforcement": "DMARC Policy Enforcement",
|
||||
"domainVerification": "Domain Verification Status",
|
||||
"emailAddress": "Email Address",
|
||||
"eventAction": "Event Action",
|
||||
"expectedValue": "Expected Specification Value",
|
||||
"healthy": "HEALTHY",
|
||||
"imapEngine": "IMAP Protocol Engine (143/993)",
|
||||
"inboundVolume": "Inbound Volume (24h)",
|
||||
"jobId": "Job ID",
|
||||
"lastError": "Last Error",
|
||||
"liveMetrics": "Live operational metrics for LambdaMail mail node.",
|
||||
"localDisk": "Local disk storage driver",
|
||||
"preflightTitle": "Mail Server Preflight Diagnostics",
|
||||
"messageBody": "Message Body",
|
||||
"messageVolume": "Message Volume",
|
||||
"noAppPasswords": "No app passwords generated yet.",
|
||||
"online": "ONLINE",
|
||||
"outboundDelivered": "Outbound Delivered (24h)",
|
||||
"queueDepth": "Outbound Queue Depth",
|
||||
"postgresRunner": "Postgres job runner active",
|
||||
"provisionMailbox": "Provision New Mailbox Account",
|
||||
"recipient": "Recipient",
|
||||
"recordName": "Record Name",
|
||||
"reportingOrg": "Reporting Organization",
|
||||
"scanners": "Rspamd Anti-Spam Scanner & ClamAV",
|
||||
"sender": "Sender",
|
||||
"smtpListener": "SMTP Protocols Listener (25/587/465)",
|
||||
"sourceIp": "Source IP",
|
||||
"spfRatio": "SPF Alignment Pass Ratio",
|
||||
"spfResult": "SPF Result",
|
||||
"storageQuota": "Storage Quota",
|
||||
"subject": "Subject",
|
||||
"targetObject": "Target Object",
|
||||
"timestamp": "Timestamp",
|
||||
"toRecipients": "To (Recipients)",
|
||||
"totalEvaluated": "Total Evaluated Messages",
|
||||
"twoFactorSection": "Two-Factor Authentication (TOTP RFC 6238)",
|
||||
"watching": "WATCHING",
|
||||
"passwordChanged": "Password changed",
|
||||
"signOutOthers": "Sign out other sessions",
|
||||
"bounceRate": "Bounce rate",
|
||||
"changePassword": "Change password",
|
||||
"clientIp": "Client IP",
|
||||
"copyPasswordNow": "Copy it now. It is not shown again.",
|
||||
"coreInfra": "Core services",
|
||||
"currentPassword": "Current password",
|
||||
"newPassword": "New password (min. 12 characters)",
|
||||
"toggleMenu": "Toggle navigation menu"
|
||||
"currentSession": "This device",
|
||||
"daneVerified": "DANE verified",
|
||||
"destination": "Destination",
|
||||
"diskUsed": "Storage used",
|
||||
"dkimAlignment": "DKIM alignment",
|
||||
"dkimResult": "DKIM",
|
||||
"dmarcEnforcement": "DMARC policy",
|
||||
"domainVerification": "Domain verification",
|
||||
"domainsVerified": "Domains verified",
|
||||
"emailAddress": "Email address",
|
||||
"eventAction": "Action",
|
||||
"expectedValue": "Expected value",
|
||||
"healthy": "Healthy",
|
||||
"imapEngine": "IMAP service",
|
||||
"inboundVolume": "Received (24h)",
|
||||
"jobId": "Job",
|
||||
"lastError": "Last error",
|
||||
"liveMetrics": "Live metrics",
|
||||
"localDisk": "Local disk",
|
||||
"mailboxesActive": "Active mailboxes",
|
||||
"messageBody": "Message",
|
||||
"messageVolume": "Messages",
|
||||
"newPassword": "New password",
|
||||
"noAppPasswords": "No app passwords yet.",
|
||||
"noData": "No data yet",
|
||||
"online": "Online",
|
||||
"outboundDelivered": "Sent (24h)",
|
||||
"passwordChanged": "Password changed.",
|
||||
"postgresRunner": "Postgres-backed queue",
|
||||
"preflightTitle": "Readiness",
|
||||
"provisionMailbox": "Create mailbox",
|
||||
"queueDepth": "Queue depth",
|
||||
"recipient": "Recipient",
|
||||
"recordName": "Record",
|
||||
"reportingOrg": "Reporting organisation",
|
||||
"scanners": "Spam and virus scanning",
|
||||
"sender": "Sender",
|
||||
"signOutOthers": "Sign out other devices",
|
||||
"smtpListener": "SMTP service",
|
||||
"sourceIp": "Source IP",
|
||||
"spfRatio": "SPF pass rate",
|
||||
"spfResult": "SPF",
|
||||
"storageQuota": "Storage quota",
|
||||
"subject": "Subject",
|
||||
"targetObject": "Target",
|
||||
"timestamp": "Time",
|
||||
"toRecipients": "To",
|
||||
"toggleMenu": "Toggle menu",
|
||||
"totalEvaluated": "Messages evaluated",
|
||||
"twoFactorSection": "Two-factor authentication",
|
||||
"watching": "Watching"
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user