fixed retry
This commit is contained in:
parent
3deaedc235
commit
d6f90f444b
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue