fixed retry

This commit is contained in:
Andreas Knuth 2025-06-15 13:27:44 -05:00
parent 3deaedc235
commit d6f90f444b
1 changed files with 37 additions and 19 deletions

View File

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