Пока триггер Pub/Sub работает и журналы подтверждают вызов функции, вложения в нее не сохраняются. ведро. Кроме того, в некоторых случаях журналы функций показывают сообщение «В электронном письме не обнаружено действительных вложений», даже если в тестовые электронные письма были включены действительные вложения.
Подробности настройки
Облачная функция:
Триггер: тема Pub/Sub
Среда выполнения: Python 3.9
Разрешения: все соответствующие роли (вызов облачных функций, издатель Pub/Sub, Администратор хранилища) были предоставлены связанным сервисным учетным записям.
Тема Pub/Sub:
Тема создана с настройками по умолчанию (добавление подписки, тип доставки по запросу, хранение сообщений в течение 7 дней). ).
Ожидаемый поток:
Вложения электронной почты принимаются через сообщения Pub/Sub.
Функция обрабатывает сообщение Pub/Sub, проверяет отправителя и тему и сохраняет вложения к указанный сегмент Cloud Storage.
Текущие наблюдения:
Сообщения Pub/Sub успешно публикуются, а журналы функций показывают вызов.
Однако вложения не сохраняются в ведро.
В некоторых случаях в журналах указывается «В сообщении электронной почты не найдено действительных вложений», несмотря на отправку действительных вложений.
Иногда электронные письма возвращаются как недоставленные, без каких-либо дополнительных сведений об ошибке в сообщении. журналы.
Фрагмент кода для справки
Вот код функции. Будем признательны за любые отзывы и предложения по выявлению проблемы:
Код: Выделить всё
@functions_framework.cloud_event
def handle_email_attachment(cloud_event):
"""Handles email attachments sent via Pub/Sub."""
try:
pubsub_message = base64.b64decode(cloud_event.data["message"]["data"]).decode("utf-8")
email_message = message_from_bytes(base64.b64decode(pubsub_message))
# Extract sender, recipient, and subject
sender_email = email_message.get("from", "").strip()
recipient_email = email_message.get("to", "").strip()
subject = email_message.get("subject", "").strip()
# Validate sender email
if sender_email not in ALLOWED_EMAILS:
print(f"Email from {sender_email} is not allowed. Ignoring.")
return
# Process attachments
for part in email_message.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get('Content-Disposition') is None:
continue
file_name = part.get_filename()
file_data = part.get_payload(decode=True)
if file_name:
save_to_storage(sender_email, file_name, file_data)
except Exception as e:
print(f"Error processing email attachment: {e}")
def save_to_storage(sender_email, file_name, file_data):
"""Save the attachment to Cloud Storage."""
folder_name = sender_email.replace("@", "at").replace(".", "_")
bucket = storage_client.bucket(ATTACHMENT_BUCKET)
blob = bucket.blob(f"{folder_name}/{file_name}")
blob.upload_from_string(file_data)
print(f"File {file_name} uploaded to folder {folder_name} in bucket {ATTACHMENT_BUCKET}.")
Существует ли определенная структура сообщения Pub/Sub, необходимая для правильной обработки вложений электронной почты?
Проверка электронной почты.
Различается ли формат полей «от» или «кому» в сообщениях Pub/Sub, инициируемых поставщиками электронной почты, такими как Gmail или другими доменами?< /p>
Обработка вложений.
Существуют ли определенные типы контента (например, text/csv, application/vnd.ms-excel), которые должны явно обрабатываться в облачной функции?< /p>
Среда тестирования:
Необходимы ли дополнительные шаги для отладки облачных функций, запускаемых Pub/Sub, особенно для обработки вложений?
Среда тестирования:
Необходимы ли дополнительные шаги для отладки облачных функций, запускаемых Pub/Sub, особенно для обработки вложений?
Среда тестирования:
Необходимы ли дополнительные шаги для отладки облачных функций, запускаемых Pub/Sub?>
Подробнее здесь: https://stackoverflow.com/questions/792 ... -cloud-sto