在 AWS lambda 函数中使用 SES 发送 xlsx 文件

问题描述

情况

我创建了一个 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 开发工具包,但它会给您一个想法,并希望您可以移植到您正在使用的编程语言。