Сообщение об ошибке при попытке отправить уведомление по электронной почте нескольким людям с использованием AWS Lambda, ⇐ Python
Сообщение об ошибке при попытке отправить уведомление по электронной почте нескольким людям с использованием AWS Lambda,
Я хочу спроектировать систему с использованием AWS Lambda, S3, SNS, SES для образовательного учреждения. При этом всякий раз, когда учитель-предметник загружает свое предметное задание в корзину S3 для определенного класса и раздела, уведомление по электронной почте о загрузке задания должно автоматически отправляться директору учреждения, учителю-предметнику, всем учащимся этого класса и раздела, а также родители всех учащихся данного класса и секции. К электронному уведомлению также должно быть прикреплено загруженное задание.
Для этого у меня есть две лямбда-функции: одна — лямбда-функция «assignmentupload», а другая — лямбда-функция «assignmentnotification». Когда учитель загружает задание в корзину S3, это запускает лямбда-функцию загрузки «задания», и тема SNS будет использоваться в качестве места назначения для этой функции. Эта тема SNS активирует вторую лямбда-функцию «уведомление о назначении», и эта функция отправит уведомление по электронной почте о загрузке задания в виде вложения каждому человеку, как описано ранее. Когда я тестирую эту систему, загружая файл задания. Пусть имя файла заданий — «Maths_10_A_mathsassignment». Я снова и снова получаю следующие две ошибки. [ОШИБКА] KeyError: «ключ»
Обратная связь (последний вызов):
Файл "/var/task/assignmentnotificationlambda.py", строка 18, в лямбда_обработчике
parts = message['key'].split('_') # Разделите имя файла с помощью подчеркивания Другая ошибка: Ошибка отправки электронной почты: имя «class_section» не определено
Мой код Python лямбда-функции 'assignmentupload': импортировать бото3 импортировать JSON # Инициализируем клиент S3 s3 = boto3.client('s3') sns = boto3.client('sns') # Замените «your-sns-topic-arn» актуальной темой SNS ARN. SNS_TOPIC_ARN = 'вставьте сюда свою тему' Защиту лямбда_handler (событие, контекст): пытаться: # Укажите имя корзины S3, куда загружаются назначения s3_bucket = 'bucket_name' # Имя корзины S3, куда учителя будут загружать задания. # Извлечение информации об объекте S3 из события s3_key = событие['Records'][0]['s3']['object']['key'] # Извлечение деталей назначения из ключа объекта S3 parts = s3_key.split('_') # Разделите имя файла с помощью подчеркивания subject = parts[0] # Первая часть — это тема class_section = parts[1] # Вторая часть — class_section # Создаем сообщение SNS sns_message = { 'ключ': 'Maths_10_A_mathsassignment.pdf', 'предмет': 'Математика', 'class_section': '10_A', 'bucket': 'bucket_name3', # Включите ключ 'bucket' } # Опубликуйте сообщение SNS, чтобы вызвать уведомление о назначении Lambda sns.publish( TopicArn=SNS_TOPIC_ARN, Сообщение = json.dumps (sns_message) ) возвращаться { 'код статуса': 200, 'body': json.dumps(f'Загруженное задание: {subject}, {class_section}') } кроме исключения как e: возвращаться { «Код статуса»: 500, «тело»: json.dumps(str(e)) } Мой код Python Lambda Function 'assignmentnotification': импортировать бото3 импортировать JSON импортировать ОС ses = boto3.client('ses') s3 = boto3.client('s3') # Загрузите сопоставление адресов электронной почты из файла JSON EMAIL_MAPPING_FILE = 'email_mapping.json' Защиту лямбда_handler (событие, контекст): # Загрузите сопоставление адресов электронной почты email_mapping = load_email_mapping() message = json.loads(event['Records'][0]['Sns']['Message']) # Извлечение деталей назначения из ключа объекта S3 parts = message['key'].split('_') # Разделите имя файла с помощью подчеркивания subject = parts[0] # Первая часть — это тема class_section = parts[1] # Вторая часть — class_section # Создаём тему письма email_subject = f"Новое задание: {subject} – {class_section}" # Создайте сообщение электронной почты по умолчанию email_message = f"Дорогие ученики и родители,\n\nПрикрепленное задание." subject_line = f"Новое задание: {email_subject}" # Пакетная обработка получателей и отправка писем пакетами получатели = email_mapping['руководители'] + [get_subject_teacher_email(тема)] для Student_email в email_mapping['students']: Student_info = email_mapping['студенты'][student_email] получатели.append(student_email) получатели.append(student_info['parent_email']) # Отправляйте электронные письма пакетами до 50 получателей. для i в диапазоне (0, len(получатели), 50): пакетные_реципиенты = получатели[i:i + 50] send_batch_email(batch_recipients, subject_line, email_message, message['bucket'], message['key']) защита load_email_mapping(): s3_bucket = 'emaillistbucket' # Укажите корзину S3, в которой хранится email_mapping.json ответ = s3.get_object(Bucket=s3_bucket, Key=EMAIL_MAPPING_FILE) return json.loads(response['Body'].read().decode('utf-8')) def send_batch_email(получатели, тема, сообщение, сегмент, ключ): пытаться: ответ = ses.send_email( Source='[email protected]', # Используйте подтвержденный адрес электронной почты вашей школы Destination = {'ToAddresses': получатели}, Сообщение={ 'Тема': {'Данные': тема}, 'Тело': {'Текст': {'Данные': сообщение}}, }, Вложения=[ { 'FileName': f"{message['subject']}_{message['class_section']}_assignment.pdf", «Данные»: s3.get_object(Bucket=message['bucket'], Key=message['key'])['Body'].read() } ] ) print(f"Отправлено электронное письмо на адрес {', '.join(recipients)}") кроме исключения как e: print(f"Ошибка отправки письма: {стр(е)}") защита get_subject_teacher_email(тема): # Реализуйте логику для динамического определения адреса электронной почты учителя в зависимости от темы # Вы можете использовать таблицу сопоставления, базу данных или другой метод # Пример: если тема == 'Математика': вернуть '[email protected]' elif subject == 'Наука': вернуть «[email protected]» elif subject == 'Hindi': # Добавить отображение темы на 'Hindi' верните «[email protected]» # При необходимости добавьте больше тем и сопоставлений электронной почты. Чтобы отправить электронное письмо нескольким людям, я сохранил список адресов электронной почты всех людей в другом сегменте, пусть его имя — «emaillistbucket», в котором все электронные письма хранятся в файле «email_mapping.json».
Пожалуйста, расскажите мне, как устранить эти две ошибки, поскольку я много пытался, но не смог исправить эти две ошибки. Я новичок в Python и написал этот код с помощью моих товарищей по команде и Интернета. Если кто-то знает точные шаги по устранению неполадок, дайте мне знать.
Я хочу спроектировать систему с использованием AWS Lambda, S3, SNS, SES для образовательного учреждения. При этом всякий раз, когда учитель-предметник загружает свое предметное задание в корзину S3 для определенного класса и раздела, уведомление по электронной почте о загрузке задания должно автоматически отправляться директору учреждения, учителю-предметнику, всем учащимся этого класса и раздела, а также родители всех учащихся данного класса и секции. К электронному уведомлению также должно быть прикреплено загруженное задание.
Для этого у меня есть две лямбда-функции: одна — лямбда-функция «assignmentupload», а другая — лямбда-функция «assignmentnotification». Когда учитель загружает задание в корзину S3, это запускает лямбда-функцию загрузки «задания», и тема SNS будет использоваться в качестве места назначения для этой функции. Эта тема SNS активирует вторую лямбда-функцию «уведомление о назначении», и эта функция отправит уведомление по электронной почте о загрузке задания в виде вложения каждому человеку, как описано ранее. Когда я тестирую эту систему, загружая файл задания. Пусть имя файла заданий — «Maths_10_A_mathsassignment». Я снова и снова получаю следующие две ошибки. [ОШИБКА] KeyError: «ключ»
Обратная связь (последний вызов):
Файл "/var/task/assignmentnotificationlambda.py", строка 18, в лямбда_обработчике
parts = message['key'].split('_') # Разделите имя файла с помощью подчеркивания Другая ошибка: Ошибка отправки электронной почты: имя «class_section» не определено
Мой код Python лямбда-функции 'assignmentupload': импортировать бото3 импортировать JSON # Инициализируем клиент S3 s3 = boto3.client('s3') sns = boto3.client('sns') # Замените «your-sns-topic-arn» актуальной темой SNS ARN. SNS_TOPIC_ARN = 'вставьте сюда свою тему' Защиту лямбда_handler (событие, контекст): пытаться: # Укажите имя корзины S3, куда загружаются назначения s3_bucket = 'bucket_name' # Имя корзины S3, куда учителя будут загружать задания. # Извлечение информации об объекте S3 из события s3_key = событие['Records'][0]['s3']['object']['key'] # Извлечение деталей назначения из ключа объекта S3 parts = s3_key.split('_') # Разделите имя файла с помощью подчеркивания subject = parts[0] # Первая часть — это тема class_section = parts[1] # Вторая часть — class_section # Создаем сообщение SNS sns_message = { 'ключ': 'Maths_10_A_mathsassignment.pdf', 'предмет': 'Математика', 'class_section': '10_A', 'bucket': 'bucket_name3', # Включите ключ 'bucket' } # Опубликуйте сообщение SNS, чтобы вызвать уведомление о назначении Lambda sns.publish( TopicArn=SNS_TOPIC_ARN, Сообщение = json.dumps (sns_message) ) возвращаться { 'код статуса': 200, 'body': json.dumps(f'Загруженное задание: {subject}, {class_section}') } кроме исключения как e: возвращаться { «Код статуса»: 500, «тело»: json.dumps(str(e)) } Мой код Python Lambda Function 'assignmentnotification': импортировать бото3 импортировать JSON импортировать ОС ses = boto3.client('ses') s3 = boto3.client('s3') # Загрузите сопоставление адресов электронной почты из файла JSON EMAIL_MAPPING_FILE = 'email_mapping.json' Защиту лямбда_handler (событие, контекст): # Загрузите сопоставление адресов электронной почты email_mapping = load_email_mapping() message = json.loads(event['Records'][0]['Sns']['Message']) # Извлечение деталей назначения из ключа объекта S3 parts = message['key'].split('_') # Разделите имя файла с помощью подчеркивания subject = parts[0] # Первая часть — это тема class_section = parts[1] # Вторая часть — class_section # Создаём тему письма email_subject = f"Новое задание: {subject} – {class_section}" # Создайте сообщение электронной почты по умолчанию email_message = f"Дорогие ученики и родители,\n\nПрикрепленное задание." subject_line = f"Новое задание: {email_subject}" # Пакетная обработка получателей и отправка писем пакетами получатели = email_mapping['руководители'] + [get_subject_teacher_email(тема)] для Student_email в email_mapping['students']: Student_info = email_mapping['студенты'][student_email] получатели.append(student_email) получатели.append(student_info['parent_email']) # Отправляйте электронные письма пакетами до 50 получателей. для i в диапазоне (0, len(получатели), 50): пакетные_реципиенты = получатели[i:i + 50] send_batch_email(batch_recipients, subject_line, email_message, message['bucket'], message['key']) защита load_email_mapping(): s3_bucket = 'emaillistbucket' # Укажите корзину S3, в которой хранится email_mapping.json ответ = s3.get_object(Bucket=s3_bucket, Key=EMAIL_MAPPING_FILE) return json.loads(response['Body'].read().decode('utf-8')) def send_batch_email(получатели, тема, сообщение, сегмент, ключ): пытаться: ответ = ses.send_email( Source='[email protected]', # Используйте подтвержденный адрес электронной почты вашей школы Destination = {'ToAddresses': получатели}, Сообщение={ 'Тема': {'Данные': тема}, 'Тело': {'Текст': {'Данные': сообщение}}, }, Вложения=[ { 'FileName': f"{message['subject']}_{message['class_section']}_assignment.pdf", «Данные»: s3.get_object(Bucket=message['bucket'], Key=message['key'])['Body'].read() } ] ) print(f"Отправлено электронное письмо на адрес {', '.join(recipients)}") кроме исключения как e: print(f"Ошибка отправки письма: {стр(е)}") защита get_subject_teacher_email(тема): # Реализуйте логику для динамического определения адреса электронной почты учителя в зависимости от темы # Вы можете использовать таблицу сопоставления, базу данных или другой метод # Пример: если тема == 'Математика': вернуть '[email protected]' elif subject == 'Наука': вернуть «[email protected]» elif subject == 'Hindi': # Добавить отображение темы на 'Hindi' верните «[email protected]» # При необходимости добавьте больше тем и сопоставлений электронной почты. Чтобы отправить электронное письмо нескольким людям, я сохранил список адресов электронной почты всех людей в другом сегменте, пусть его имя — «emaillistbucket», в котором все электронные письма хранятся в файле «email_mapping.json».
Пожалуйста, расскажите мне, как устранить эти две ошибки, поскольку я много пытался, но не смог исправить эти две ошибки. Я новичок в Python и написал этот код с помощью моих товарищей по команде и Интернета. Если кто-то знает точные шаги по устранению неполадок, дайте мне знать.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Уведомление о сбросе пароля или просто уведомление по электронной почте
Anonymous » » в форуме Python - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Уведомление Laravel Broadcast – ошибка «array_key_exists()» при попытке отправить уведомление
Anonymous » » в форуме Php - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-