AWS Lambda python для отправки тела письма в виде HTML из ответа событий DynamoDB - PullRequest
0 голосов
/ 25 марта 2020

Мы пытаемся создать лямбда-функцию AWS, чтобы создать электронное письмо с телом HTML, чтобы предупредить команды об изменяемых записях.

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

Поскольку электронное письмо - это просто строка, упомянутая в HTML. В общем, я должен получить переменную, которая ему присвоена.

import boto3
import json
from datetime import datetime
import smtplib  
import email.utils
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


def lambda_handler(event, context):

    #print(event)
    RecordInfo = event['Records']
    RecordDetails = RecordInfo[0]
    EventName = RecordDetails['eventName']

    Dyna = RecordDetails['dynamodb']
    Modtime = Dyna['ApproximateCreationDateTime']
    ModifiedTime=datetime.fromtimestamp(Modtime).strftime("%B %d, %Y %I:%M:%S")


    if (EventName == 'MODIFY'):

        OldData = Dyna['OldImage']
        OldAppKey=OldData['Application']
        OldApp=OldAppKey['S']

        OldAppServerKey=OldData['App_Server']
        OldAppServer=OldAppServerKey['S']

        OldAppUserKey=OldData['App_User']
        OldAppUser=OldAppUserKey['S']

        OldAppIPKey=OldData['App_IP']
        OldAppIP=OldAppIPKey['S']

        OldAppPwdKey=OldData['App_Pwd']
        OldAppPwd=OldAppPwdKey['S']

        OldAppPortKey=OldData['App_Port']
        OldAppPort=OldAppPortKey['S']

        #If Eventname is 'Modify' then above inserted value of Sub will be overridden
        # The subject line of the email.
        SUBJECT = "Table Name:DBTest - Updated on " + ModifiedTime

        Message1 = Message1 + "\nOld Record Details:\n" + "Application:" + OldApp + "\tApp_IP:" + OldAppIP + "\tApp_User:" + OldAppUser + "\tApp_Pwd:" + OldAppPwd + "\tApp_Port:" + OldAppPort
        # The HTML body of the email.
        BODY_HTML = BODY_HTML + print ("

        Old Record Details:

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>html title</title>
        <style type="text/css" media="screen">
            table{
                background-color: #AAD373;
                empty-cells:hide;
            }
            td.cell{
                background-color: white;
            }
        </style>

        <table style="border: black 1px solid;">
        <tbody>
        <tr>
            <td class="cell">Application</td>
            <td class="cell">App_IP</td>
            <td class="cell">App_User</td>
            <td class="cell">App_Pwd</td>
            <td class="cell">App_Port</td>
        </tr>
        <tr>
            <td class="cell">{OldApp}</td>
            <td class="cell">{OldAppIP}</td>
            <td class="cell">{OldAppUser}</td>
            <td class="cell">{OldAppPwd}</td>
            <td class="cell">{OldAppPort}</td>
        </tr>
        </tbody>
        </table>
        ")


    # The email body for recipients with non-HTML email clients.
    BODY_TEXT = (Message1)

    SENDER = 'xx'  
    SENDERNAME = 'AWS DynamoDB Alert'
    RECIPIENT  = 'xx'
    USERNAME_SMTP = "XX"
    PASSWORD_SMTP = "xx/xx"
    # (Optional) the name of a configuration set to use for this message
    HOST = "email-smtp.ap-south-1.amazonaws.com"
    PORT = 25
    # Create message container - the correct MIME type is multipart/alternative.
    msg = MIMEMultipart('alternative')
    msg['Subject'] = SUBJECT
    msg['From'] = email.utils.formataddr((SENDERNAME, SENDER))
    msg['To'] = RECIPIENT

    part1 = MIMEText(BODY_TEXT, 'plain')
    part2 = MIMEText(BODY_HTML, 'html')

    msg.attach(part1)
    msg.attach(part2)

    try:  
        server = smtplib.SMTP(HOST, PORT)
        server.ehlo()
        server.starttls()

        server.ehlo()
        server.login(USERNAME_SMTP, PASSWORD_SMTP)
        server.sendmail(SENDER, RECIPIENT, msg.as_string())
        server.close()

    except Exception as e:
        print ("Error: ", e)
    else:
        print ("Email sent!")

1 Ответ

1 голос
/ 26 марта 2020

Похоже, что вы хотите, чтобы подобные строки заменяли переменные:

<td class="cell">{OldApp}</td>

Чтобы сделать это в Python 3.6+, вы должны использовать f-string, например:

BODY_HTML = f"...<td class="cell">{OldApp}</td>..."

Обратите внимание на f перед открывающей кавычкой, которая говорит Python подставлять выражения, содержащиеся в {curly brackets}.

Кроме того, оператор print() должен не быть в этом назначении переменной:

BODY_HTML = BODY_HTML + print ("...

Еще несколько советов ..

Вы можете сократить это:

RecordInfo = event['Records']
RecordDetails = RecordInfo[0]
EventName = RecordDetails['eventName']

в:

EventName = event['Records'][0]['eventName']

Аналогичным образом вы можете сократить:

OldAppIPKey=OldData['App_IP']
OldAppIP=OldAppIPKey['S']

на:

OldAppIP=OldData['App_IP']['S']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...