@@ -14,6 +14,47 @@ Usa **Google Gemini Flash 2.5** para extracción inteligente de datos.
1414- 📬 Mueve y marca correos automáticamente
1515- ⚠️ Validación: solo procesa documentos válidos (ignora publicidad)
1616- 💰 Costo mínimo (~ $0.001 por documento)
17+ - 🧩 Arquitectura modular para agregar nuevos processors
18+
19+ ## 🚀 Instalación Rápida
20+
21+ ### Opción 1: App con Wizard (Recomendada)
22+
23+ 1 . ** Descarga** ` Mail Processors.app ` de [ Releases] ( https://github.com/rmichelena/apple_mail_processors/releases )
24+ 2 . ** Mueve** la app a ` /Applications ` o donde prefieras
25+ 3 . ** Abre** la app y sigue el wizard
26+
27+ El wizard automáticamente:
28+ - ✅ Verifica/instala Python y qpdf
29+ - ✅ Te permite seleccionar qué processors activar
30+ - ✅ Configura carpetas de Mail, API key, y directorio de salida
31+ - ✅ Crea las carpetas necesarias en Mail.app
32+ - ✅ Instala las dependencias Python
33+ - ✅ Compila e instala los AppleScripts
34+
35+ ### Opción 2: Instalación Manual (Desarrolladores)
36+
37+ ``` bash
38+ git clone https://github.com/rmichelena/apple_mail_processors.git
39+ cd apple_mail_processors
40+ ./install.sh
41+ nano config/config.toml # Configurar API key, passwords, etc.
42+ ```
43+
44+ ## 📋 Requisitos
45+
46+ - ** macOS 11 Big Sur o superior**
47+ - ** Python 3.11+**
48+ - ** API Key de Google Gemini** - [ Obtener gratis] ( https://aistudio.google.com/app/apikey )
49+ - ** qpdf** - Para descifrar PDFs (se instala automáticamente)
50+
51+ | macOS | Soporte |
52+ | -------| ---------|
53+ | 14 Sonoma | ✅ |
54+ | 13 Ventura | ✅ |
55+ | 12 Monterey | ✅ |
56+ | 11 Big Sur | ✅ |
57+ | 10.15 o anterior | ❌ |
1758
1859## 🏗️ Arquitectura
1960
@@ -24,273 +65,127 @@ Mail.app
2465 │ │
2566 │ ├─ Extrae PDF del .eml
2667 │ ├─ Quita password (qpdf)
27- │ ├─ Valida con Gemini (¿es EECC real?)
68+ │ ├─ Valida con Gemini
2869 │ ├─ Si válido: genera CSVs/JSON
2970 │ └─ Si válido: mueve a EECC/
3071 │
3172 └─ Regla: Taxi → AppleScript → Python
3273 │
3374 ├─ Convierte HTML a Markdown
34- ├─ Valida con Gemini (¿es recibo real?)
75+ ├─ Valida con Gemini
3576 ├─ Si válido: agrega a CSV
3677 └─ Si válido: mueve a Taxis/
3778```
3879
39- > ** Nota:** Si el documento no es válido (publicidad, otro tipo de correo ), el mensaje
40- > queda sin procesar para revisión manual. Solo se mueven los correos procesados exitosamente.
80+ > ** Nota:** Si el documento no es válido (publicidad, etc. ), el mensaje
81+ > queda sin procesar para revisión manual.
4182
42- ## 📁 Estructura del Proyecto
83+ ## 📁 Estructura
4384
4485```
45- mail-processors/
46- ├── config/
47- │ └── config.toml # 🔒 Configuración real (NO en git)
48- ├── scripts/
49- │ ├── config.py # Carga configuración
50- │ ├── mail_actions.py # Read+move mensajes vía osascript
51- │ ├── extract_movements.py # Extractor de estados de cuenta
52- │ ├── extract_from_email.py # Procesa .eml de EECC
53- │ └── extract_taxi_trip.py # Procesa .eml de taxis
54- ├── applescripts/
55- │ ├── procesar_eecc.applescript # Código fuente (texto, versionable)
56- │ └── procesar_taxi.applescript # Código fuente (texto, versionable)
57- ├── config.example.toml # ✅ Template (SÍ en git)
58- ├── requirements.txt
59- ├── install.sh
60- ├── .gitignore
86+ apple_mail_processors/
87+ ├── Mail Processors.app/ # 🆕 App con wizard de instalación
88+ │ └── Contents/
89+ │ └── Resources/
90+ │ ├── processors/ # Processors modulares
91+ │ │ ├── eecc/
92+ │ │ ├── taxi/
93+ │ │ └── amazon/ # (próximamente)
94+ │ └── lib/ # Módulos Python compartidos
95+ ├── scripts/ # Scripts para instalación manual
96+ ├── applescripts/ # Fuentes AppleScript (texto)
97+ ├── config.example.toml # Template de configuración
98+ ├── install.sh # Instalador alternativo (CLI)
6199└── README.md
62100```
63101
64- ### Nota sobre AppleScripts
102+ ## ⚙️ Configuración Post-Instalación
65103
66- Los archivos ` .applescript ` son ** código fuente en texto ** (versionables en git).
104+ Después de ejecutar el wizard, solo necesitas crear las ** reglas en Mail.app ** :
67105
68- El script ` install.sh ` los compila a ` .scpt ` (binarios) y los instala en:
69- ```
70- ~/Library/Application Scripts/com.apple.mail/
71- ```
106+ 1 . Mail → Preferencias → Reglas → Agregar regla
107+ 2 . ** Para Estados de Cuenta:**
108+ - Condición: "From contains" + remitentes de tus bancos
109+ - Acción: "Run AppleScript" → ` Mail_Processors_EECC.scpt `
110+ 3 . ** Para Taxis:**
111+ - Condición: "From contains" + uber, cabify, etc.
112+ - Acción: "Run AppleScript" → ` Mail_Processors_Taxi.scpt `
72113
73- Esta es la carpeta requerida por Mail.app para ejecutar scripts desde reglas.
74-
75- ## 📋 Requisitos
76-
77- - ** macOS 11 Big Sur o superior** (probado en Sonoma/Ventura/Monterey)
78- - ** Python 3.11+** (probado con 3.14)
79- - ** qpdf** - para descifrar PDFs (se instala automáticamente si tienes Homebrew)
80- - ** API Key de Google Gemini** - obtener gratis en [ AI Studio] ( https://aistudio.google.com/app/apikey )
81-
82- ### Compatibilidad macOS
83-
84- | Versión | Soporte |
85- | ---------| ---------|
86- | macOS 14 Sonoma | ✅ Completo |
87- | macOS 13 Ventura | ✅ Completo |
88- | macOS 12 Monterey | ✅ Completo |
89- | macOS 11 Big Sur | ✅ Debería funcionar |
90- | macOS 10.15 Catalina | ⚠️ Sin soporte oficial de Homebrew |
91- | macOS 10.14 o anterior | ❌ No soportado |
92-
93- ### Dependencias Python (se instalan automáticamente)
94- - ` google-genai ` - SDK de Google Gemini AI
95- - ` pydantic ` - Validación de datos
96- - ` beautifulsoup4 ` - Procesamiento HTML
97- - ` markdownify ` - Conversión HTML→Markdown
98-
99- ## 🚀 Instalación
100-
101- ### 1. Clonar/Descargar
102-
103- ``` bash
104- git clone https://github.com/rmichelena/apple_mail_processors.git
105- cd apple_mail_processors
106- ```
107-
108- ### 2. Ejecutar instalador
109-
110- ``` bash
111- ./install.sh
112- ```
113-
114- El instalador automáticamente:
115- - ✅ Detecta Python y actualiza la configuración
116- - ✅ Instala qpdf via Homebrew (si está disponible)
117- - ✅ Detecta paths y los configura
118- - ✅ Crea ` config/config.toml ` desde el template
119- - ✅ Instala dependencias Python
120- - ✅ Compila e instala los AppleScripts
121-
122- ### 3. Editar configuración
123-
124- ``` bash
125- nano config/config.toml
126- ```
127-
128- Solo necesitas configurar manualmente:
129- - ` gemini.api_key ` - Obtener en https://aistudio.google.com/app/apikey
130- - ` pdf.password ` - Password de tus PDFs bancarios
131- - ` paths.output_folder ` - Dónde guardar CSVs/PDFs
132-
133- > ** Nota:** ` python_path ` y ` qpdf_path ` se detectan automáticamente durante la instalación.
134-
135- ### 5. Crear carpetas en Mail.app
136-
137- Crea dos carpetas en tu buzón:
138- - ` EECC ` - Para estados de cuenta procesados
139- - ` Taxis ` - Para correos de taxi procesados
140-
141- ### 6. Configurar reglas en Mail.app
142-
143- ** Regla para Estados de Cuenta:**
144- - Menú: Mail → Preferencias → Reglas → Agregar regla
145- - Nombre: "Procesar EECC"
146- - Condición: "From contains" + remitentes de tus bancos
147- - Acción: "Run AppleScript" → selecciona ` procesar_eecc.scpt `
148- (aparecerá automáticamente si está en ` ~/Library/Application Scripts/com.apple.mail/ ` )
149- - ⚠️ NO agregues "Move Message" ni "Mark as Read"
150-
151- ** Regla para Taxis:**
152- - Similar, pero con remitentes de Uber, Cabify, etc.
153- - AppleScript: ` procesar_taxi.scpt `
154-
155- ## ⚙️ Configuración
156-
157- ### config.toml
158-
159- ``` toml
160- [gemini ]
161- api_key = " AIzaSy..." # API key de Google Gemini
162-
163- [paths ]
164- output_folder = " ~/Dropbox/estados-cuenta" # Dónde guardar archivos
165- python_path = " /Library/Frameworks/Python.framework/Versions/3.14/bin/python3"
166- qpdf_path = " /opt/homebrew/bin/qpdf"
167- eml_temp_folder = " ~/Library/MailEML"
168-
169- [mail ]
170- eecc_folder = " EECC" # Carpeta destino en Mail
171- taxi_folder = " Taxis" # Carpeta destino en Mail
172-
173- [pdf ]
174- password = " 12345678" # Password de PDFs bancarios
175-
176- [logging ]
177- eecc_log = " ~/Library/Logs/MailEECCRule.log"
178- taxi_log = " ~/Library/Logs/MailTaxiRule.log"
179- ```
114+ ⚠️ ** Importante:** NO agregues "Move Message" ni "Mark as Read" en las reglas.
180115
181116## 📤 Salida
182117
183118### Estados de Cuenta
184119
185- Por cada PDF procesado genera:
120+ Por cada PDF genera:
186121- ` Visa Interbank 2025-05 PEN.csv ` - Movimientos en soles
187- - ` Visa Interbank 2025-05 USD.csv ` - Movimientos en dólares (si aplica)
188- - ` Visa Interbank 2025-05.json ` - Datos completos con metadata
122+ - ` Visa Interbank 2025-05 USD.csv ` - Movimientos en dólares
123+ - ` Visa Interbank 2025-05.json ` - Metadata completa
189124- ` Visa Interbank 2025-05.pdf ` - PDF renombrado
190125
191- ** Formato CSV:**
192126``` csv
193127fecha,descripcion,monto,tipo
1941282025-05-01,WONG SURCO,125.50,consumo
1951292025-05-02,NETFLIX.COM,44.90,consumo
196- 2025-05-15,PAGO RECIBIDO,-500.00,pago
197130```
198131
199132### Viajes de Taxi
200133
201- Un CSV consolidado: ` viajes taxi.csv `
134+ CSV consolidado: ` viajes taxi.csv `
202135
203136``` csv
204137fecha,hora,empresa,origen,destino,moneda,precio
205- 2025-05-01,08:30,Uber,Av. Javier Prado 123,Aeropuerto Jorge Chávez,PEN,45.00
206- 2025-05-02,19:15,Cabify,Centro Comercial Jockey,Miraflores,PEN,22.50
138+ 2025-05-01,08:30,Uber,Av. Prado 123,Aeropuerto,PEN,45.00
207139```
208140
209141## 📋 Logs
210142
211- - Estados de cuenta: ` ~/Library/Logs/MailEECCRule.log `
212- - Taxis: ` ~/Library/Logs/MailTaxiRule.log `
213- - Errores Python: ` {output_folder}/errores.log `
214-
215- Ver logs en tiempo real:
216143``` bash
217- tail -f ~ /Library/Logs/MailEECCRule.log
144+ # Ver logs en tiempo real
145+ tail -f ~ /Library/Logs/MailProcessors_EECC.log
146+ tail -f ~ /Library/Logs/MailProcessors_Taxi.log
218147```
219148
220149## 🛠️ Uso Manual
221150
222- ### Procesar un PDF directamente
223-
224151``` bash
225- cd scripts
226- python3 extract_movements.py " /ruta/al/estado-cuenta.pdf"
227- ```
228-
229- ### Procesar un .eml
230-
231- ``` bash
232- python3 extract_from_email.py " /ruta/al/correo.eml"
233- ```
152+ # Procesar PDF directamente
153+ python3 scripts/extract_movements.py " /ruta/al/estado-cuenta.pdf"
234154
235- ### Procesar correo de taxi
155+ # Procesar .eml de estado de cuenta
156+ python3 scripts/extract_from_email.py " /ruta/al/correo.eml"
236157
237- ``` bash
238- python3 extract_taxi_trip.py " /ruta/al/correo.eml"
158+ # Procesar .eml de taxi
159+ python3 scripts/ extract_taxi_trip.py " /ruta/al/correo.eml"
239160```
240161
241162## 🐛 Troubleshooting
242163
243164### El script no se ejecuta
244-
245- 1 . Verifica permisos de automatización:
246- - Preferencias del Sistema → Privacidad → Automatización
247- - Mail debe poder controlar "System Events"
248-
249- 2 . Verifica que Python está en el path correcto:
250- ``` bash
251- which python3
252- ```
253-
254- 3 . Revisa los logs:
255- ``` bash
256- tail -50 ~ /Library/Logs/MailEECCRule.log
257- ```
165+ - Verifica permisos: Preferencias → Privacidad → Automatización
166+ - Revisa logs: ` tail -50 ~/Library/Logs/MailProcessors_EECC.log `
258167
259168### Error de qpdf
260-
261169``` bash
262- # Verificar instalación
263- qpdf --version
264-
265- # Reinstalar si es necesario
266170brew reinstall qpdf
267171```
268172
269173### Error de API Gemini
270-
271- - Verifica que la API key sea correcta
272- - Verifica que no hayas excedido el límite gratuito
273- - Revisa https://aistudio.google.com/ para ver tu uso
274-
275- ### PDFs no se descifran
276-
277- - Verifica el password en ` config/config.toml `
278- - Algunos bancos usan formatos de password diferentes
174+ - Verifica la API key en ` ~/.config/mail_processors/config.toml `
175+ - Revisa tu uso en https://aistudio.google.com/
279176
280177## 💰 Costos
281178
282- Google Gemini Flash 2.5 es muy económico:
283- - ~ $0.001 por estado de cuenta procesado
179+ - ~ $0.001 por estado de cuenta
284180- ~ $0.0002 por correo de taxi
285-
286- Con uso normal (5-10 correos/mes), el costo es prácticamente $0.
181+ - Con uso normal: prácticamente $0/mes
287182
288183## 🔐 Seguridad
289184
290- - ** NUNCA ** subas ` config/config.toml ` a git (contiene API keys y passwords)
291- - El archivo ` .gitignore ` ya lo excluye automáticamente
292- - Usa ` config.example.toml ` como template en el repositorio
185+ - La configuración se guarda en ` ~/. config/mail_processors/ config.toml`
186+ - ** NUNCA ** subas archivos de configuración a git
187+ - El ` .gitignore ` ya excluye archivos sensibles
293188
294189## 📜 Licencia
295190
296- MIT License - Usa como quieras.
191+ MIT License
0 commit comments