问题描述
情况
我创建了一个 lambda 函数,它的输出是一个保存到 S3 存储桶的 Excel 文件。这部分功能按预期工作。 作为功能操作的一部分,我还希望能够将生成的 Excel 文件通过电子邮件发送给选定的收件人。
代码:
#IMPORT MODULES
import boto3
import pandas as pd
import io
from io import BytesIO
from io import StringIO
from datetime import date
import email
import email.header
import email.policy
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
def lambda_handler(event,context):
# GENERATE CURRENT DATE TO APPEND TO FILE
today = date.today()
date_val = today.strftime("%B %d,%Y")
# CREATE DATAFRAME
df = pd.DataFrame({'Data': [10,22,31,43,57,99,65,74,88]})
# EVALUATE VARIABLES AS ODD OR EVEN INTEGERS
even = df.loc[df['Data']%2 == 0]
odd = df.loc[df['Data']%2 != 0]
# SPECIFY BUKCET NAME AND OUTPUT FILE PATH
bucket = 'my-bucket'
filepath = 'output/My_Excel_File_{}.xlsx'.format(date_val)
# EXPORT MULTI-SHEET EXCEL FILE AND SEND TO S3 BUCKET
with io.BytesIO() as output:
with pd.ExcelWriter(output,engine='xlsxwriter') as writer:
even.to_excel(writer,sheet_name = 'Even')
odd.to_excel(writer,sheet_name = 'Odd')
data = output.getvalue()
s3 = boto3.resource('s3')
s3.Bucket(bucket).put_object(Key=filepath,Body=data)
我尝试了什么
我试图通过参考各种文档将以下代码附加到我的函数中来实现我的目标,但这并没有达到预期的结果。
# EXPORT MULTI-SHEET EXCEL FILE AND SEND TO S3 BUCKET
message = MIMEMultipart()
message['Subject'] = 'Email subject'
message['From'] = 'sender.email@domain.com'
message['To'] = 'recipient.email@domain.com')
# MESSAGE BODY
part = MIMEText('Thus is the email body string','html')
message.attach(part)
# ATTACHEMENT
if attachment_string: # if bytestring available
part = MIMEApplication(str.encode('attachment_string'))
else: # if file provided
part = MIMEApplication(s3.get_object(Bucket='my-bucket',Key=My_Excel_File_{}.xlsx'.format(date_val)).read())
part.add_header('Content-disposition','attachment',filename='My_Excel_File_{}.xlsx'.format(date_val)')
message.attach(part)
response = client.send_raw_email(
Source=message['From'],Destinations=['recipient.email@domain.com'],RawMessage={
'Data': message.as_string()
}
)
解决方法
有一些 AWS 示例可以动态创建 excel 文档并通过电子邮件发送它们。在这个用例中,它们是用 Java 实现的,应用程序是一个 Web 应用程序。看到这个:
Creating the DynamoDB web application item tracker
虽然此示例使用适用于 Java V2 的 AWS 开发工具包,但它会给您一个想法,并希望您可以移植到您正在使用的编程语言。