bugfix for retry function
This commit is contained in:
parent
34393b0807
commit
d98a9086ca
|
|
@ -175,6 +175,7 @@ def retry_domain_emails(domain):
|
||||||
return jsonify({'error': 'Unauthorized'}), 401
|
return jsonify({'error': 'Unauthorized'}), 401
|
||||||
|
|
||||||
bucket = domain.replace('.', '-') + '-emails'
|
bucket = domain.replace('.', '-') + '-emails'
|
||||||
|
# 1) Sammle alle Keys, die noch nicht processed=true sind
|
||||||
unprocessed = []
|
unprocessed = []
|
||||||
paginator = s3_client.get_paginator('list_objects_v2')
|
paginator = s3_client.get_paginator('list_objects_v2')
|
||||||
for page in paginator.paginate(Bucket=bucket):
|
for page in paginator.paginate(Bucket=bucket):
|
||||||
|
|
@ -184,31 +185,62 @@ def retry_domain_emails(domain):
|
||||||
unprocessed.append(obj['Key'])
|
unprocessed.append(obj['Key'])
|
||||||
|
|
||||||
request_id = f"retry-{domain}-{int(time.time())}"
|
request_id = f"retry-{domain}-{int(time.time())}"
|
||||||
logger.info(f"[{request_id}] RETRY processing for domain={domain}, keys={unprocessed}")
|
logger.info(f"[{request_id}] RETRY for domain={domain}, keys={unprocessed}")
|
||||||
|
|
||||||
results = {'processed': [], 'failed': []}
|
results = {'processed': [], 'failed': []}
|
||||||
|
|
||||||
for key in unprocessed:
|
for key in unprocessed:
|
||||||
try:
|
try:
|
||||||
|
# E-Mail laden und 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)
|
||||||
from_addr = getaddresses(msg.get_all('from', []))[0][1] if msg.get_all('from') else f'retry@{domain}'
|
from_addr = (
|
||||||
|
getaddresses(msg.get_all('from', []))[0][1]
|
||||||
|
if msg.get_all('from') else f'retry@{domain}'
|
||||||
|
)
|
||||||
to_addrs = [addr for _n, addr in getaddresses(msg.get_all('to', []))]
|
to_addrs = [addr for _n, addr in getaddresses(msg.get_all('to', []))]
|
||||||
cc_addrs = [addr for _n, addr in getaddresses(msg.get_all('cc', []))]
|
cc_addrs = [addr for _n, addr in getaddresses(msg.get_all('cc', []))]
|
||||||
bcc_addrs = [addr for _n, addr in getaddresses(msg.get_all('bcc', []))]
|
bcc_addrs = [addr for _n, addr in getaddresses(msg.get_all('bcc', []))]
|
||||||
recipients = to_addrs + cc_addrs + bcc_addrs
|
recipients = to_addrs + cc_addrs + bcc_addrs
|
||||||
|
|
||||||
|
if not recipients:
|
||||||
|
# keine Empfänger → nichts markieren
|
||||||
|
results['failed'].append(f"{key}: no recipients")
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Versuch, die Mail zuzustellen
|
||||||
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)
|
||||||
|
|
||||||
if mark_email_as_processed(bucket, key):
|
# bei Erfolg → processed=true
|
||||||
|
mark_email_as_processed(bucket, key, 'true')
|
||||||
results['processed'].append(key)
|
results['processed'].append(key)
|
||||||
|
|
||||||
|
except smtplib.SMTPRecipientsRefused as e:
|
||||||
|
# bei abgelehnten Adressen → unknownUser vs unknownDomain
|
||||||
|
refused = e.recipients # dict: {addr: (code, msg), ...}
|
||||||
|
# check, ob eine abgelehnte Adresse zur eigenen Domain gehört
|
||||||
|
if any(addr.split('@')[-1] == domain for addr in refused):
|
||||||
|
status = 'unknownUser'
|
||||||
else:
|
else:
|
||||||
results['failed'].append(key)
|
status = 'unknownDomain'
|
||||||
|
|
||||||
|
mark_email_as_processed(bucket, key, status)
|
||||||
|
results['processed'].append(key)
|
||||||
|
results['failed'].append({key: refused})
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
# andere SMTP-/Verbindungs-Fehler → nicht markieren
|
||||||
|
results['failed'].append(f"{key}: {e}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
# Fehler beim Laden/Parsen der Objekte
|
||||||
results['failed'].append(f"{key}: {e}")
|
results['failed'].append(f"{key}: {e}")
|
||||||
|
|
||||||
return jsonify(results), 200
|
return jsonify(results), 200
|
||||||
|
|
||||||
|
|
||||||
@app.route('/health', methods=['GET'])
|
@app.route('/health', methods=['GET'])
|
||||||
def health_check():
|
def health_check():
|
||||||
return jsonify({'status': 'OK'}), 200
|
return jsonify({'status': 'OK'}), 200
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue