Quiet Mail

Professional Email & Link Tools

Everything you need for email signatures, link management, and formatting

Email Signature Builder

Create professional HTML email signatures with multiple templates

UTM Link Builder

Add tracking parameters to your links for campaign analytics

Tracking Cleaner

Remove tracking parameters from URLs for clean sharing

mailto: Link Builder

Create clickable email links with pre-filled content

Plain-Text Formatter

Format plain text emails with proper line wrapping and bullets

Subject Line Tester

Test email subject lines for length and risky words

Email Validator

Validate email addresses for format and domain structure

Spam Phrase Checker

Scan email content for common spam trigger words

`; }; document.getElementById('qtExportBtn')?.addEventListener('click', () => { const activeTool = getActiveTool(); const signatureData = collectSignatureData(); const signatureHtml = document.getElementById('sig-preview')?.innerHTML || ''; const templateExport = buildSignatureTemplate(signatureData, signatureHtml); const payload = { schemaVersion: 1, toolName, exportedAt: new Date().toISOString(), data: (state.data && Object.keys(state.data).length) ? state.data : collectLegacyData(), snapshot: { activeTool, signature: signatureData, outputs: { utm: document.getElementById('utm-output')?.textContent || '', tracking: document.getElementById('tracking-output')?.value || '', mailto: document.getElementById('mailto-output')?.textContent || '', formattedText: document.getElementById('format-output')?.value || '' } } }; const blob = new Blob([JSON.stringify(payload, null, 2)], { type: 'application/json' }); downloadBlob(blob, `${toolSlug}-export.json`); if (templateExport) { const templateBlob = new Blob([templateExport], { type: 'text/html' }); downloadBlob(templateBlob, `${toolSlug}-signature.html`); } else { showToast('No signature template ready yet. Exported JSON only.'); } }); document.getElementById('qtImportBtn')?.addEventListener('click', () => { const input = document.createElement('input'); input.type = 'file'; input.accept = 'application/json'; input.addEventListener('change', () => { const file = input.files[0]; if (!file) return; file.text().then((text) => { try { const payload = JSON.parse(text); if (payload.schemaVersion !== 1 || payload.toolName !== toolName) { alert('This export does not match this tool.'); return; } const data = payload.data || {}; Object.entries(data).forEach(([key, value]) => { localStorage.setItem(key, value); }); state.data = data; state.migrated = true; QuietTools.saveState(storageKey, state, 0); setIndicator('Saved'); } catch (err) { alert('Invalid import file.'); } }); }); input.click(); }); document.getElementById('qtResetBtn')?.addEventListener('click', () => { if (!confirm('Reset this tool? This clears only QuietTools storage for this tool.')) return; localStorage.removeItem(storageKey); setIndicator('Saved'); }); if (window.QTActions) { window.QTActions.register('export', () => document.getElementById('qtExportBtn')?.click()); window.QTActions.register('import', () => document.getElementById('qtImportBtn')?.click()); window.QTActions.register('reset', () => document.getElementById('qtResetBtn')?.click()); } saveState(); })();