---
name: extract_emails
kind: function
lang: py
domain: cybersecurity
version: "1.0.0"
purity: pure
signature: "def extract_emails(text: str) -> list[dict]"
description: "Extrae direcciones de email (RFC 5322 simplificado) de un texto, con offsets start/end. No valida MX ni que el TLD exista — solo estructura sintactica."
tags: [ioc, email, regex, extract, cybersecurity, python]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: [re]
params:
  - name: text
    desc: "string de texto del que extraer emails"
output: "lista de dicts con {value, start, end, type='email'} por cada email encontrado"
tested: true
tests:
  - "Email simple"
  - "Multiples emails con caracteres validos en local part"
  - "No matchea texto sin @"
test_file_path: "python/functions/cybersecurity/tests/test_extract_iocs.py"
file_path: "python/functions/cybersecurity/extract_emails.py"
---

## Ejemplo

```python
extract_emails("Contact: alice@example.com or bob+work@sub.test.org")
# [{"value": "alice@example.com", "start": 9, "end": 26, "type": "email"},
#  {"value": "bob+work@sub.test.org", "start": 30, "end": 51, "type": "email"}]
```

## Notas

Acepta `._%+-` en parte local. El dominio exige al menos un punto y termina en componente alfanumerico de 1+ chars. No valida MX ni que el TLD aparezca en lista de TLDs validos — para extraer dominios independientemente, ver `extract_domains_py_cybersecurity`.
