AWS Lambda не может отправить электронное письмо через AWS SES - PullRequest
0 голосов
/ 05 августа 2020

Я проверил следующее

  1. AWS SES не находится в песочнице. Я могу отправлять электронную почту через консоль на неподтвержденные идентификаторы электронной почты.
  2. Моя функция Lambda имеет прикрепленную роль с полным доступом к SES и Lambda (поскольку ее первоначальное базовое c тестирование давало полные разрешения)

Ниже приведен базовый c код из AWS документации, просто жестко закодированный мой электронный идентификатор. Но я не могу получить электронную почту. Лямбда-код работает успешно, но я не получаю электронные письма.

import json
import os
import boto3
from botocore.exceptions import ClientError
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

print('Loading function')


def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    #print("value1 = " + event['key1'])
    #print("value2 = " + event['key2'])
    #print("value3 = " + event['key3'])
    #return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')
    SENDER = "[redacted email]"
    RECIPIENT = event['email']
    CONFIGURATION_SET = "ConfigSet"
    AWS_REGION = "us-east-2"
    SUBJECT = "Contact Us Form Details"
    # The email body for recipients with non-HTML email clients.
BODY_TEXT = "Hello,\r\nPlease see the attached file for a list of customers to contact."

# The HTML body of the email.
BODY_HTML = """\
<html>
<head></head>
<body>
<h1>Hello!</h1>
<p>Please see the attached file for a list of customers to contact.</p>
</body>
</html>
"""

# The character encoding for the email.
CHARSET = "utf-8"

# Create a new SES resource and specify a region.
client = boto3.client('ses',region_name='us-east-2')

# Create a multipart/mixed parent container.
msg = MIMEMultipart('mixed')
# Add subject, from and to lines.
msg['Subject'] = "Contact Us Form Details" 
msg['From'] ="[redacted email]" 
msg['To'] = "[redacted email]"

# Create a multipart/alternative child container.
msg_body = MIMEMultipart('alternative')

# Encode the text and HTML content and set the character encoding. This step is
# necessary if you're sending a message with characters outside the ASCII range.
textpart = MIMEText(BODY_TEXT.encode(CHARSET), 'plain', CHARSET)
htmlpart = MIMEText(BODY_HTML.encode(CHARSET), 'html', CHARSET)

# Add the text and HTML parts to the child container.
msg_body.attach(textpart)
msg_body.attach(htmlpart)

# Define the attachment part and encode it using MIMEApplication.
#att = MIMEApplication(open(ATTACHMENT, 'rb').read())

# Add a header to tell the email client to treat this part as an attachment,
# and to give the attachment a name.
#att.add_header('Content-Disposition','attachment',filename=os.path.basename(ATTACHMENT))

# Attach the multipart/alternative child container to the multipart/mixed
# parent container.
msg.attach(msg_body)

# Add the attachment to the parent container.
#msg.attach(att)
print(msg)
try:
    #Provide the contents of the email.
    response = client.send_raw_email(
        Source="[redacted email]",
        Destinations=[
            "[redacted email]"
        ],
        RawMessage={
            'Data':msg.as_string(),
        },
        #ConfigurationSetName=CONFIGURATION_SET
    )
# Display an error if something goes wrong. 
except ClientError as e:
    print(e.response['Error']['Message'])
else:
    print("Email sent! Message ID:"),
    print(response['MessageId'])

Прикрепление журналов облачных часов для справки

введите описание изображения здесь

Ответы [ 2 ]

4 голосов
/ 05 августа 2020

Если ваш код действительно является тем, что вы нам показали, то причина того, что он не отправляет электронное письмо, заключается в том, что половина вашего кода не выполняется.

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    #print("value1 = " + event['key1'])
    #print("value2 = " + event['key2'])
    #print("value3 = " + event['key3'])
    #return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')
    SENDER = "[redacted email]"
    RECIPIENT = event['email']
    CONFIGURATION_SET = "ConfigSet"
    AWS_REGION = "us-east-2"
    SUBJECT = "Contact Us Form Details"
    # The email body for recipients with non-HTML email clients.
BODY_TEXT = "Hello,\r\nPlease see the attached file for a list of customers to contact."

Когда AWS Lambda выполняется функция, она вызывает lambda_handler(). В соответствии с форматированием Python он будет выполнять все строки с отступом , поскольку они являются частью функции. Сюда входит ваш оператор print ().

Однако, начиная со строки BODY_TEXT = ..., отступы отсутствуют. Это означает, что код является частью «основной» программы, а не частью функции lambda_handler(). Он будет выполнен при первом создании экземпляра контейнера Lambda, но не при запуске функции.

Нижняя строка: Если это ваш фактический код, вам нужно чтобы исправить отступы.

0 голосов
/ 05 августа 2020

Если вы не получаете никаких ошибок при выполнении лямбда-выражения, то, скорее всего, вы не используете SES API. Судя по тому, что я вижу в вашем коде, вам не хватает идентификатора ключа доступа и секретного ключа доступа. Попробуйте настроить свой клиент boto следующим образом:

client = boto3.client(
    'ses',
    region_name=region,
    aws_access_key_id='aws_access_key_string',
    aws_secret_access_key='aws_secret_key_string'
)

Также убедитесь, что ваша лямбда развернута в том же регионе, что и ваш SES. Я вижу, вы используете нас-восток-2. Еще одно несоответствие, которое я вижу, которое также присутствует в документации, заключается в том, что в официальной документации AWS Destinations на самом деле Destination. Попробуйте без "s". Можете ли вы также вставить журналы облачных часов для лямбда. Я вижу, что в случае успеха он должен напечатать идентификатор сообщения. Есть ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...