微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。