Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

postula

Envía correos de postulación personalizados, uno por empresa, con tu CV adjunto. Pensado para pocos correos y bien dirigidos, no para bombardear.

La regla de la herramienta: nada sale sin que veas antes el texto completo de cada correo.

Por qué existe

Escribirle a 15 empresas a mano significa 15 oportunidades de pegar el nombre equivocado, olvidar el adjunto, o escribirle dos veces a la misma. Esto lo automatiza sin quitarte el control de lo que se dice.

Empezar

Solo necesitas Python 3.11 o superior. No hay que instalar dependencias.

git clone https://github.com/angelfvargas/postula.git
cd postula

cp ejemplos/postula.toml.ejemplo postula.toml
cp ejemplos/destinatarios.ejemplo.csv destinatarios.csv

Edita postula.toml con tus datos y tu plantilla, y destinatarios.csv con las empresas. Después:

python3 postula.py estado     # cuántos pendientes hay
python3 postula.py revisar    # muestra los correos completos, sin enviar nada
python3 postula.py enviar     # los muestra, pregunta s/n, y envía

Ni postula.toml ni destinatarios.csv se suben al repositorio: están en .gitignore. Tus datos y tu lista de empresas se quedan en tu máquina.

La lista de destinatarios

Un CSV con estas columnas:

empresa,correo,nombre_contacto,asunto,cuerpo,estado
Empresa Uno,contacto@empresa-uno.com,,,,
Empresa Dos,talento@empresa-dos.com,María Gómez,,,
Empresa Tres,rrhh@empresa-tres.com,,,,omitir
  • nombre_contacto — si lo pones, el correo saluda a esa persona; si no, saluda al equipo de talento de la empresa.
  • asunto y cuerpo — déjalos vacíos para usar la plantilla. Si los llenas, esa fila usa ese texto en vez de la plantilla.
  • estadoomitir salta la fila. enviado lo pone el programa solo.

La plantilla

Vive en postula.toml. Acepta los marcadores {saludo}, {empresa}, {nombre_contacto} y {correo}:

[plantilla]
asunto = "Estudiante de Ing. de Sistemas busca práctica — hoja de vida adjunta"
cuerpo = """
Hola {saludo}:

Me gustaría hacer mi práctica en {empresa}. Adjunto mi hoja de vida.
"""

Si escribes un marcador que no existe, queda vacío en vez de reventar a mitad de un envío.

La contraseña

Nunca va en el código ni como argumento del comando (los argumentos quedan en el historial del shell y se ven en la lista de procesos).

python3 postula.py guardar-clave   # la valida contra el servidor y la guarda
python3 postula.py olvidar-clave

Se guarda en ~/.config/postula/smtp_pass con permisos 600. También puede venir de la variable de entorno POSTULA_SMTP_PASS, que tiene prioridad.

Con Gmail necesitas una contraseña de aplicación de 16 letras, no tu contraseña normal, y tener activa la verificación en 2 pasos.

Decisiones de diseño

  • No reenviar es más importante que enviar. Cada fila se marca como enviada apenas sale, no al final del lote. Si el proceso se corta en el correo 3 de 10, los dos primeros quedan marcados y la siguiente corrida no los repite. Esta versión nació justamente de ese error.
  • Pausa entre correos. 45 segundos por defecto. Una ráfaga de correos idénticos es la forma más rápida de terminar en spam.
  • Un fallo no tumba el lote. Si un correo es rechazado, se registra y el resto continúa. Al final se reporta qué falló y por qué.
  • El transporte es reemplazable, así que el lote completo —incluido el marcado de estado y el registro— se prueba sin abrir un solo socket. Un programa que le escribe a empresas reales no se puede probar "a ver qué pasa".
  • Cero dependencias. Se clona y se corre.

Estructura

src/postula/
  config.py         lee y valida postula.toml (tomllib, de la estándar)
  destinatarios.py  CSV: lectura, filtrado por estado y marcado
  correo.py         plantilla, personalización y adjunto
  envio.py          transporte SMTP, envío del lote y registro
  credenciales.py   contraseña: entorno, archivo 600 o preguntar
  cli.py            interfaz de línea de comandos
tests/              32 pruebas, ninguna abre una conexión de red
ejemplos/           configuración y lista de ejemplo

Pruebas

python3 -m unittest discover -s tests -v

Instalar como comando

pip install --user .
postula revisar

Licencia

MIT.

About

Envia correos de postulacion personalizados con CV adjunto. Te muestra cada correo antes de enviarlo y nunca le escribe dos veces a la misma empresa. Python puro.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages