--- 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`.