У нас есть онлайн -форма, которая дает людям возможность загружать несколько файлов. Форма построена третьей стороной, поэтому я не участвую с ними. Когда кто -то загружает файлы, используя форму, он сбрасывает файлы в новую папку в ведре S3. Я хочу иметь возможность сделать следующее: < /p>
Получить файлы, запускаемые по загрузке формы наполнителя
Прикрепление файлов к электронной почте
Отправить электронное письмо конкретным людям. < /P>
Я сделал довольно много исследований, но я все еще новичок в кодировании и я пытаюсь использовать Python, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил, что я решил. />
Код, который я получил до сих пор, заимствован из других примеров, которые я видел и скорректировал. Но до сих пор он отправил мне электронные письма с файлами, когда я загружал отдельные файлы в корень ведра. Не несколько файлов в папку в ведре. Похоже, что это связано с тем, что функциональность /< /code> в пути файлов в папках разбивает SendRaweMail < /code>. Пожалуйста, смотрите внизу для этого. < /P>
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import boto3
def lambda_handler(event, context):
file_obj = event["Records"][0]
bucket_name = str(file_obj['s3']['bucket']['name'])
key = str(file_obj['s3']['object']['key'])
msg = MIMEMultipart()
new_body = "test body"
text_part = MIMEText(new_body, _subtype="html")
msg.attach(text_part)
filename = str(event["Records"][0]['s3']['object']['key'])
msg["To"] = "[email protected]"
msg["From"] = "[email protected]"
s3_object = boto3.client('s3')
s3_object = s3_object.get_object(Bucket=str(bucket_name), Key=str(key))
body = s3_object['Body'].read()
part = MIMEApplication(body, filename)
part.add_header("Content-Disposition", 'attachment', filename=filename)
msg.attach(part)
ses_aws_client = boto3.client('ses', 'eu-west-1')
ses_aws_client.send_raw_email(RawMessage={"Data" : msg.as_bytes()})
< /code>
Я надеялся, что когда папка или несколько файлов были загружены, мне отправили электронное письмо, содержащее все файлы в качестве вложений (я понимаю, что на сообщения есть ограничение 10 МБ). Однако, когда есть несколько файлов, он, по -видимому, отправляет несколько электронных писем с одним файлом на электронное письмо. И если файл находится в папке, так что имеет значение клавиши со сглашкой в нем, send_raw_email показывает следующую ошибку: < /p>
[ERROR] ClientError: An error occurred (InvalidParameterValue) when calling the SendRawEmail operation: Expected ';', got "/"
< /code>
Я предполагаю, что мне нужно каким -то образом кодировать путь? Есть ли какой -нибудь способ собрать все файлы, недавно загруженные в одно электронное письмо? Также я пропустил строку в своем исходном кодовом блоке, поэтому я тоже обновлю это. < /P>
12:14:59
[ERROR] ClientError: An error occurred (InvalidParameterValue) when calling the SendRawEmail operation: Expected ';', got "/" Traceback (most recent call last): File "/var/task/lambda_function.py", line 26, in lambda_handler ses_aws_client.send_raw_email(RawMessage={"Data" : msg.as_bytes()}) File "/var/runtime/botocore/client.py", line 320, in _api_call return self._make_api_call(opera
[ERROR] ClientError: An error occurred (InvalidParameterValue) when calling the SendRawEmail operation: Expected ';', got "/"
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 26, in lambda_handler
ses_aws_client.send_raw_email(RawMessage={"Data" : msg.as_bytes()})
File "/var/runtime/botocore/client.py", line 320, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/runtime/botocore/client.py", line 623, in _make_api_call
raise error_class(parsed_response, operation_name)
< /code>
Обновление:
Теперь мне удалось получить основную функциональность этого рабочего: < /p>
import os.path
import boto3
import email
from botocore.exceptions import ClientError
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
s3 = boto3.client("s3")
def lambda_handler(event, context):
# Replace [email protected] with your "From" address.
# This address must be verified with Amazon SES.
SENDER = "Test Test "
# Replace [email protected] with a "To" address. If your account
# is still in the sandbox, this address must be verified.
RECIPIENT = "Test Test "
# Specify a configuration set. If you do not want to use a configuration
# set, comment the following variable, and the
# ConfigurationSetName=CONFIGURATION_SET argument below.
# CONFIGURATION_SET = "ConfigSet"
AWS_REGION = "eu-west-1"
SUBJECT = "Test Send Mesage with Attachment"
# This is the start of the process to pull the files we need from the S3 bucket into the email.
# Get the records for the triggered event
FILEOBJ = event["Records"][0]
# Extract the bucket name from the records for the triggered event
BUCKET_NAME = str(FILEOBJ['s3']['bucket']['name'])
# Extract the object key (basicaly the file name/path - note that in S3 there are
# no folders, the path is part of the name) from the records for the triggered event
KEY = str(FILEOBJ['s3']['object']['key'])
# extract just the last portion of the file name from the file. This is what the file
# would have been called prior to being uploaded to the S3 bucket
FILE_NAME = os.path.basename(KEY)
# Using the file name, create a new file location for the lambda. This has to
# be in the tmp dir because that's the only place lambdas let you store up to
# 500mb of stuff, hence the '/tmp/'+ prefix
TMP_FILE_NAME = '/tmp/' +FILE_NAME
# Download the file/s from the event (extracted above) to the tmp location
s3.download_file(BUCKET_NAME, KEY, TMP_FILE_NAME)
# Make explicit that the attachment will have the tmp file path/name. You could just
# use the TMP_FILE_NAME in the statments below if you'd like.
ATTACHMENT = TMP_FILE_NAME
# The email body for recipients with non-HTML email clients.
BODY_TEXT = "Hello,\r\nPlease see the attached file related to recent submission."
# The HTML body of the email.
BODY_HTML = """\
Hello!
Please see the attached file related to recent submission.
"""
# The character encoding for the email.
CHARSET = "utf-8"
# Create a new SES resource and specify a region.
client = boto3.client('ses',region_name=AWS_REGION)
# Create a multipart/mixed parent container.
msg = MIMEMultipart('mixed')
# Add subject, from and to lines.
msg['Subject'] = SUBJECT
msg['From'] = SENDER
msg['To'] = RECIPIENT
# 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=SENDER,
Destinations=[
RECIPIENT
],
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'])
< /code>
Единственная проблема сейчас заключается в том, что если я загружаю несколько файлов, меня отправляют электронное письмо на файл. Есть ли способ собрать их все в одно электронное письмо?
Подробнее здесь: https://stackoverflow.com/questions/563 ... ttachments
Python Lambda для отправки файлов, загруженных в S3 в качестве вложения по электронной почте ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Создание Excel из базы данных и отправка в виде вложения к электронной почте.
Anonymous » » в форуме Php - 0 Ответы
- 31 Просмотры
-
Последнее сообщение Anonymous
-