diff --git a/email_api/email_api/app.py b/email_api/email_api/app.py index 33bbdb9..bcd2955 100644 --- a/email_api/email_api/app.py +++ b/email_api/email_api/app.py @@ -168,6 +168,7 @@ def process_email(domain): # Keine Markierung hier mehr; übernimmt Lambda return jsonify({'message': 'Email forwarded', 'recipients': recipients}), 200 + @app.route('/retry/', methods=['GET']) def retry_domain_emails(domain): auth = request.headers.get('Authorization') @@ -177,7 +178,6 @@ def retry_domain_emails(domain): bucket = domain.replace('.', '-') + '-emails' paginator = s3_client.get_paginator('list_objects_v2') - # keys, die noch nicht processed='true' sind unprocessed = [] for page in paginator.paginate(Bucket=bucket): for obj in page.get('Contents', []): @@ -192,7 +192,6 @@ def retry_domain_emails(domain): for key in unprocessed: try: - # Datei und E-Mail parsen body = s3_client.get_object(Bucket=bucket, Key=key)['Body'].read() msg = BytesParser(policy=default).parsebytes(body) @@ -206,46 +205,65 @@ def retry_domain_emails(domain): recipients = to_addrs + cc_addrs + bcc_addrs if not recipients: - # keine Empfänger → nur als failed markieren results['failed'].append({'key': key, 'error': 'no recipients'}) continue + # **Neu: Domain-Match prüfen** + domains = {addr.split('@')[-1].lower() for addr in recipients} + if domain.lower() not in domains: + # niemals zur eigenen Domain adressiert → unknownDomain + mark_email_as_processed(bucket, key, 'unknownDomain') + results['processed'].append(key) + results['failed'].append({ + 'key': key, + 'status': 'unknownDomain', + 'from': from_addr, + 'to': recipients + }) + continue + + # mindestens ein passender Empfänger → Sendeversuch try: - # Zustellen with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as smtp: smtp.sendmail(from_addr, recipients, body) - - # Erfolg mark_email_as_processed(bucket, key, 'true') results['processed'].append(key) except smtplib.SMTPRecipientsRefused as e: - # Einzelne Adressen abgelehnt - refused = e.recipients # dict { addr: (code, msg_bytes) } - # bestimme Status + refused = e.recipients status = ( 'unknownUser' - if any(addr.split('@')[-1] == domain for addr in refused) + if any(addr.split('@')[-1].lower() == domain.lower() for addr in refused) else 'unknownDomain' ) - # bytes → string - clean = {} - for addr, (code, msg) in refused.items(): - msg_str = msg.decode('utf-8', errors='ignore') if isinstance(msg, bytes) else str(msg) - clean[addr] = {'code': code, 'message': msg_str} + # bytes → str + clean = {addr: {'code': code, 'message': (msg.decode('utf-8', 'ignore') + if isinstance(msg, bytes) else str(msg))} + for addr, (code, msg) in refused.items()} mark_email_as_processed(bucket, key, status) results['processed'].append(key) - results['failed'].append({'key': key, 'refused': clean}) + results['failed'].append({ + 'key': key, + 'status': status, + 'from': from_addr, + 'to': recipients, + 'refused': clean + }) except Exception as e: - # andere SMTP-Fehler + # andere SMTP-Fehler behandeln wie unknownDomain mark_email_as_processed(bucket, key, 'unknownDomain') results['processed'].append(key) - results['failed'].append({'key': key, 'error': str(e)}) + results['failed'].append({ + 'key': key, + 'status': 'unknownDomain', + 'from': from_addr, + 'to': recipients, + 'error': str(e) + }) except Exception as e: - # Fehler beim Laden/Parsen results['failed'].append({'key': key, 'error': str(e)}) return jsonify(results), 200