Json Парсинг для отказов электронной почты в python в AWS SES - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь написать лямбда-функцию для AWS SNS, чтобы перехватывать отклоненные электронные письма.Я мог успешно поймать детали для типа уведомления "Доставка", но не для типа "отказов".Некоторые проблемы с синтаксисом в Python, я не знаю Python, но в SES нет другого варианта.Мой код ниже.

def lambda_handler(event, context):

message = event.get("Records")[0].get("Sns").get("Message")
parsed_message = json.loads(message)
status = parsed_message.get("notificationType")
event_date = parsed_message.get("mail").get("timestamp")
recipients = []

if (status == "Bounce"):
    for r in parsed_message.get("bounce").get("bouncedRecipients"):
        parsed_r = json.loads(r)
        recipients.append(parsed_r[0].get("emailAddress"))
elif (status == "Complaint"):
    for r in parsed_message.get("complaint").get("complainedRecipients"):
        recipients.append(r)
elif (status == "Delivery"):
    for r in parsed_message.get("delivery").get("recipients"):
        recipients.append(r)

conn = make_conn()
cur = conn.cursor()
cur.execute("insert into email_event (email_status, event_date, email_address, event_json) values (%s, %s, %s, %s)", (status, event_date, ";".join(recipients), json.dumps(event)))
conn.commit()
cur.close()
conn.close()

Json для parsed_message ниже

 {
   "notificationType": "Bounce",
   "bounce": {
      "bounceType": "Permanent",
      "bounceSubType": "Suppressed",
      "bouncedRecipients": [
         {
            "emailAddress": "email@email.com",
            "action": "failed",
            "status": "5.1.1",
            "diagnosticCode": "Amazon SES has suppressed sending to this address because it has a recent history of bouncing as an invalid address. "
         }
      ],

   },

Я получаю сообщение об ошибке, подобное этому объект JSON должен быть str, bytes или bytearray, а не 'dict': TypeError

Я пытался, как показано ниже

for r in parsed_message.get("bounce").get("bouncedRecipients")[0].get("emailAddress")
recipients.append(r)

, но это сохраняется в БД как e; m; a; i; l; @; e; m; a; i; l;.; с; а; м

1 Ответ

0 голосов
/ 10 сентября 2018

«bounceRecipients» указывает на список диктовок, по одному на каждого отскочившего получателя.

Чтобы перебрать этот список, а затем получить адрес электронной почты, должен выглядеть так:

for r in parsed_message.get("bounce").get("bouncedRecipients"):
    recipients.append(r.get("emailAddress"))

Или меньше как Java, а больше как Python:

for r in parsed_message["bounce"]["bouncedRecipients"]:
    recipients.append(r["emailAddress"])

Который также можно записать в виде списка:

recipients = [r["emailAddress"] for r in parsed_message["bounce"]["bouncedRecipients"]]
...