{"id":50901237,"url":"https://github.com/oscarhenriquezg/msgview","last_synced_at":"2026-06-16T03:01:13.769Z","repository":{"id":364404606,"uuid":"1267764100","full_name":"oscarhenriquezg/msgview","owner":"oscarhenriquezg","description":"Visor 100% offline de archivos .msg de Outlook para Linux y macOS — Open .msg files without Outlook","archived":false,"fork":false,"pushed_at":"2026-06-12T22:48:58.000Z","size":193,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T23:21:06.485Z","etag":null,"topics":["electron","email-viewer","linux","macos","msg","outlook"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oscarhenriquezg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-12T20:56:06.000Z","updated_at":"2026-06-12T22:49:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/oscarhenriquezg/msgview","commit_stats":null,"previous_names":["oscarhenriquezg/msgview"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/oscarhenriquezg/msgview","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscarhenriquezg%2Fmsgview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscarhenriquezg%2Fmsgview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscarhenriquezg%2Fmsgview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscarhenriquezg%2Fmsgview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oscarhenriquezg","download_url":"https://codeload.github.com/oscarhenriquezg/msgview/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscarhenriquezg%2Fmsgview/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34388669,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["electron","email-viewer","linux","macos","msg","outlook"],"created_at":"2026-06-16T03:01:13.057Z","updated_at":"2026-06-16T03:01:13.761Z","avatar_url":"https://github.com/oscarhenriquezg.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MSG Viewer\n\nVisor de escritorio ligero y multiplataforma (**Linux y macOS**) para archivos\n`.msg` de Microsoft Outlook. Funciona **100% offline**: el contenido del correo\nnunca abandona tu equipo.\n\n\u003e En macOS y Linux no hay forma nativa de abrir un `.msg` recibido desde un\n\u003e entorno corporativo Windows/Outlook sin instalar Outlook o subir el archivo\n\u003e a un servicio web de terceros. MSG Viewer cubre ese vacío.\n\n## Características\n\n### 📬 Visualización\n\n| Característica | Detalle |\n|---|---|\n| **Formatos de entrada** | `.msg` (Outlook), `.eml` (RFC 5322) y `.emlx` (Apple Mail), con **detección por contenido** (una extensión renombrada se abre igual) |\n| **Metadatos completos** | Asunto, remitente, destinatarios (Para/CC/CCO), fechas de envío y recepción |\n| **Cuerpo en cascada** | HTML nativo → RTF des-encapsulado (recupera el HTML original de Outlook) → RTF aproximado → texto plano |\n| **Imágenes incrustadas** | Las `cid:` se renderizan en su posición; las remotas se bloquean (placeholder) y solo se cargan con un clic, tras un aviso de rastreo |\n| **Mensajes anidados** | Un `.msg`/`.eml` adjunto se abre en **ventana propia** para comparar lado a lado |\n| **Direcciones de Exchange** | Resuelve el SMTP real en vez del DN X.500 interno (`/o=ExchangeLabs/...`) |\n| **Idioma y tema** | Español/inglés según el sistema · claro/oscuro automático |\n\n### 🔒 Seguridad y privacidad\n\n| Característica | Detalle |\n|---|---|\n| **Contenido hostil** | El cuerpo se sanitiza (DOMPurify) y se aísla en un iframe sandbox sin scripts + CSP restrictiva |\n| **Sin red** | Cero tráfico saliente automático: bloqueo en capa de sesión (verificable con `tcpdump`), cero telemetría. La única excepción es la descarga de una imagen remota que tú pidas explícitamente |\n| **Imágenes remotas** | Bloqueadas por defecto. Al pulsar el placeholder, un aviso explica el rastreo (píxel de seguimiento: IP, fecha/hora de lectura) antes de descargarla |\n| **Anti-phishing** | La URL real de cada enlace se ve al pasar el cursor; el clic exige confirmar antes de salir al navegador, y si el enlace es engañoso la propia advertencia lo explica |\n| **Enlaces engañosos** | Resaltado opcional de los enlaces cuyo texto aparenta un dominio distinto al destino real (`\u003ca\u003epaypal.com\u003c/a\u003e` → `evil.com`) |\n| **Unlink** | Un botón deja todos los enlaces inertes (tachados) para inspeccionar correos sospechosos sin riesgo |\n| **Adjuntos bajo control** | Solo se escriben a disco por acción explícita; los temporales de \"Abrir\" se purgan al salir |\n\n### 🛠️ Acciones y exportación\n\n| Característica | Detalle |\n|---|---|\n| **Barra de herramientas** | Iconos [Lucide](https://lucide.dev): Nuevo · Abrir · Guardar como · Copiar · Buscar · zoom del cuerpo · oscurecer el cuerpo · Unlink · resaltar enlaces engañosos · código fuente · Exportar · Acerca de (Imprimir sigue en el menú, Ctrl+P) |\n| **Exportar** (9 formatos) | **PDF** (A4/Carta), **EML**, **PNG** (+copiar al portapapeles), **HTML**, **TXT**, **Markdown**, **MHT** (web con imágenes embebidas), **JSON** (pipelines) y **ZIP** (correo + metadata + cuerpos + adjuntos) |\n| **Guardar como…** | Un diálogo con **los mismos formatos que Exportar** (+ el original); el formato se decide por la extensión elegida (Ctrl+S) |\n| **Copiar con formato** | Copia la selección (o todo el cuerpo) conservando texto enriquecido e imágenes |\n| **Adjuntos arrastrables** | Arrastra un adjunto fuera de la app para soltarlo en el gestor de archivos o en un correo nuevo |\n| **Accesibilidad** | Zoom del cuerpo y modo de alto contraste (fondo oscuro, texto claro) independientes de la ventana |\n| **Imprimir** | Diálogo del sistema sobre el mensaje y su cabecera (Ctrl+P) |\n| **Búsqueda** | En el cuerpo (Ctrl+F): resaltado, contador y desplazamiento a la coincidencia |\n| **Adjuntos** | Clic para Abrir con la app predeterminada o Guardar; \"Guardar todos\" con integridad verificada |\n| **Copiar** | Direcciones con un clic (o todas por campo) · metadatos como texto o JSON |\n| **Archivos recientes** | Últimos 10, persistentes, en el menú Archivo |\n| **Asociación con el SO** | Diálogo para elegir qué tipos (.msg/.eml/.emlx) abre la app (Linux vía xdg-mime; macOS guía de Finder) |\n\n### 🔬 Análisis técnico (vista de código fuente)\n\n| Característica | Detalle |\n|---|---|\n| **Resaltado de sintaxis** | Cabeceras, etiquetas/atributos HTML y bloques base64, con búsqueda, copiar, imprimir y exportar |\n| **Ruta del mensaje** | Cadena `Received` cronológica con la **demora entre saltos** y resultados **SPF/DKIM/DMARC** |\n| **Decodificador** | Selecciona base64 o quoted-printable y lo descodifica en el sitio |\n| **Propiedades MAPI crudas** | Tabla completa de PidTag del `.msg` (forense) |\n| **Diff de sanitización** | Lista exacta de scripts/manejadores que el correo traía y se eliminaron |\n\n## Instalación\n\n### Instalación rápida (una línea)\n\nFunciona en **Linux y macOS**; el script detecta el sistema y descarga el artefacto adecuado. Sin permisos de root:\n\n```bash\nbash -c \"$(curl -fsSL https://raw.githubusercontent.com/oscarhenriquezg/msgview/main/scripts/install.sh)\"\n```\n\n- **Linux** — deja el AppImage en `~/.local/bin` y crea la entrada en el menú de aplicaciones.\n- **macOS** — instala `MSG Viewer.app` en `~/Applications` y le quita la cuarentena de Gatekeeper (la app no está firmada).\n\n\u003e En Linux los AppImage requieren **FUSE2** (`libfuse2`). Si al arrancar ves un\n\u003e error de FUSE, instálalo (`sudo apt install libfuse2` / `sudo dnf install fuse\n\u003e fuse-libs`) o ejecuta con `~/.local/bin/MSGViewer.AppImage --appimage-extract-and-run`.\n\n### Descarga manual\n\nDescarga desde [Releases](https://github.com/oscarhenriquezg/msgview/releases):\n\n**Linux** — AppImage (recomendado, cualquier distro con glibc ≥ 2.35), `.deb` o `.rpm`:\n\n```bash\nchmod +x \"MSG Viewer-x.y.z-x86_64.AppImage\"\n./\"MSG Viewer-x.y.z-x86_64.AppImage\" correo.msg\n```\n\n**macOS** — monta el `.dmg` y arrastra la app a Aplicaciones (macOS 12+, binario universal).\n\n\u003e **App sin firmar:** MSG Viewer es gratuita (GPL) y no está firmada ni\n\u003e notarizada por Apple (el Developer Program cuesta 99 USD/año). macOS la\n\u003e bloqueará la primera vez con un aviso de desarrollador no identificado. Para\n\u003e abrirla:\n\u003e\n\u003e - **Opción A:** clic derecho sobre la app → **Abrir** → confirma **Abrir** en\n\u003e   el diálogo. Solo hace falta la primera vez.\n\u003e - **Opción B (Terminal):** quita el atributo de cuarentena y ábrela normal:\n\u003e\n\u003e   ```bash\n\u003e   xattr -dr com.apple.quarantine \"/Applications/MSG Viewer.app\"\n\u003e   ```\n\u003e\n\u003e Esto no compromete la seguridad: el código es abierto y la app funciona 100%\n\u003e offline. La firma se añadirá si en el futuro se costea la cuenta de Apple.\n\n## Limitaciones conocidas (por diseño)\n\n| | |\n|---|---|\n| RTF→HTML aproximado | Si el mensaje solo trae RTF puro (sin HTML nativo ni encapsulado), la conversión es una aproximación. |\n| EML reconstruido | El EML se genera desde las propiedades MAPI; no es byte-equivalente al mensaje SMTP original. |\n| Imágenes remotas | Bloqueadas por defecto (placeholder); cargables con un clic tras un aviso de rastreo. Las incrustadas sí se muestran. |\n| PNG ≤ 20.000 px | Para correos más largos, la app ofrece truncar o sugiere PDF. |\n| Tipos no soportados | Citas, contactos y tareas se informan como no soportados; S/MIME cifrado no puede mostrarse; las firmas se indican pero no se verifican. |\n\n## Desarrollo\n\n```bash\nnpm install\nnpm run fixtures      # genera el corpus de .msg de prueba (sintético)\nnpm run dev           # arranque con recarga automática\nnpm test              # unit tests (parser, EML, corpus adversarial)\nnpm run build \u0026\u0026 npx playwright test   # E2E sobre la app construida\nnpm run build:linux   # AppImage/deb/rpm en release/\nnpm run build:mac     # dmg/zip (requiere macOS)\n```\n\nPara probar con correos reales, copia archivos `.msg` a `tests/fixtures/real/`\n(directorio ignorado por git): la suite los recoge automáticamente y\n`npx vite-node scripts/report-real.ts` genera un informe de parseo.\n\n### Arquitectura\n\nElectron + TypeScript. El parsing (`@kenjiuno/msgreader` tras un adapter\npropio) ocurre en un worker thread del proceso main; el renderer recibe un\ndocumento serializado con HTML ya sanitizado y muestra el cuerpo en un iframe\nsandbox sin ejecución de scripts. El bloqueo de red, los diálogos nativos y la\nescritura a disco viven exclusivamente en main. Especificación completa en\n[SRS-visor-msg-v0.2.md](SRS-visor-msg-v0.2.md).\n\n## Licencia\n\n© 2026 Oscar Henríquez. Publicado bajo la **GNU General Public License v3.0\n(o posterior)**. El texto completo está en [LICENSE.md](LICENSE.md).\n\nPolítica de seguridad y reporte de vulnerabilidades: [SECURITY.md](SECURITY.md).\n\n### Software de terceros\n\nMSG Viewer usa las siguientes bibliotecas de código abierto. Todas sus\nlicencias son compatibles con la GPL-3.0. Cada una conserva su licencia y sus\nderechos de autor originales.\n\n| Dependencia | Uso | Licencia |\n| --- | --- | --- |\n| [Electron](https://github.com/electron/electron) | Entorno de ejecución de escritorio | MIT |\n| [@kenjiuno/msgreader](https://github.com/HiraokaHyperTools/msgreader) | Lectura de archivos `.msg` (CFBF/MAPI) | Apache-2.0 |\n| [@kenjiuno/decompressrtf](https://github.com/HiraokaHyperTools/decompressRTF) | Descompresión de RTF comprimido | BSD-2-Clause |\n| [rtf-stream-parser](https://github.com/mazira/rtf-stream-parser) | Des-encapsulación de HTML/RTF | MIT |\n| [mailparser](https://github.com/nodemailer/mailparser) | Lectura de archivos `.eml`/`.emlx` (MIME) | MIT |\n| [DOMPurify](https://github.com/cure53/DOMPurify) | Sanitización del HTML del correo | MPL-2.0 OR Apache-2.0 |\n| [jsdom](https://github.com/jsdom/jsdom) | DOM para DOMPurify en el proceso main | MIT |\n| [iconv-lite](https://github.com/ashtuchkin/iconv-lite) | Decodificación de juegos de caracteres heredados | MIT |\n| [archiver](https://github.com/archiverjs/node-archiver) | Generación de exportaciones ZIP | MIT |\n| [Lucide](https://lucide.dev) (`lucide-static`) | Iconos de la interfaz (inlineados en el build) | ISC |\n\n\u003e El listado completo de licencias de la cadena de dependencias —incluidas las\n\u003e de desarrollo— puede generarse con `npx license-checker --production`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foscarhenriquezg%2Fmsgview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foscarhenriquezg%2Fmsgview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foscarhenriquezg%2Fmsgview/lists"}